Conceptos básicos de incidentes
8 ejemplos para empezar con la respuesta a incidentes de Postgres: 5 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con la respuesta a incidentes de Postgres: 5 básicos y 3 intermedios.
# Confirma que puedes acceder al primario y tienes un rol de solo lectura para la clasificación
psql "$DATABASE_URL" -c "SELECT version();"
psql "$DATABASE_URL" -c "SELECT pg_is_in_recovery();"pg_stat_activity, pg_locks y vistas de replicación.Mapea el impacto del usuario a un nivel de severidad antes de cambiar la producción.
| Severidad | Impacto en el usuario | Objetivo de respuesta |
|---|---|---|
| Sev-1 | Pérdida de datos, interrupción total o brecha de seguridad | Notificar inmediatamente; sala de guerra |
| Sev-2 | Escrituras degradadas o tasa de errores elevada | Notificar al de guardia; arreglar en horas |
| Sev-3 | Consultas lentas, problemas de un solo inquilino | Arreglo en horario comercial |
| Sev-4 | Cosmético o solo interno | Pendientes |
Relacionado: Mejores prácticas de respuesta a incidentes - higiene de runbooks
Ejecuta esta secuencia antes del diagnóstico profundo.
-- 1. ¿Está la instancia aceptando conexiones?
SELECT now() AS ts, pg_is_in_recovery() AS is_replica;
-- 2. ¿Quién está conectado y en qué está esperando?
SELECT pid, usename, application_name, state, wait_event_type, wait_event,
now() - query_start AS query_age, left(query, 120) AS query_snip
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
ORDER BY query_start NULLS LAST
LIMIT 30;
-- 3. ¿Sesiones bloqueadas?
SELECT blocked.pid AS blocked_pid, blocking.pid AS blocking_pid,
left(blocked.query, 80) AS blocked_q
FROM pg_stat_activity blocked
JOIN pg_stat_activity blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
WHERE cardinality(pg_blocking_pids(blocked.pid)) > 0;Mantén informados a los interesados sin filtrar texto de consulta sensible.
[INC-1234] Sev-2 - Latencia elevada de la API en el servicio de checkout
Estado: Investigando
Impacto: ~15% de las solicitudes de checkout caducan después de 30s
Inicio: 2026-07-09 14:22 UTC
Acciones: Verificando saturación del pool de conexiones y esperas de bloqueo en el primario
Próxima actualización: 14:37 UTCEXPLAIN en canales públicos.Crea un rol que pueda diagnosticar sin mutar datos.
CREATE ROLE incident_reader LOGIN PASSWORD 'rotate-after-incident';
GRANT pg_read_all_stats TO incident_reader;
GRANT CONNECT ON DATABASE app TO incident_reader;
GRANT USAGE ON SCHEMA public TO incident_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO incident_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO incident_reader;SUPERUSER a las cuentas de guardia "solo para el incidente".El failover es una decisión de negocio, no solo técnica.
# Ejemplo de Patroni: verifica el estado del clúster antes del failover manual
patronictl -c /etc/patroni/patroni.yml listRelacionado: Emergencia de latencia de replicación - diagnóstico de latencia antes de la reconstrucción
Las notas estructuradas hacen que los post-mortems sean rápidos.
mkdir -p incidents/INC-1234
cat >> incidents/INC-1234/timeline.md <<'EOF'
| Hora (UTC) | Actor | Acción |
|------------|-------|--------|
| 14:22 | pager | Sev-2 abierto, latencia de checkout |
| 14:25 | dba | pg_stat_activity muestra 200 idle in transaction |
EOFEXPLAIN, diferencias de configuración.Termina solo con política y registro.
-- Encuentra sesiones idle in transaction largas (causa raíz común de incidentes)
SELECT pid, usename, application_name, state,
now() - xact_start AS xact_age, query
FROM pg_stat_activity
WHERE state = 'idle in transaction'
AND now() - xact_start > interval '5 minutes';
-- Termina un backend (requiere rol apropiado)
SELECT pg_terminate_backend(12345);pg_terminate_backend en Sev-1 a menos que sea un runbook automatizado.pid, application_name y el ID del ticket en el canal de incidentes.Cierra el ciclo del incidente con seguimientos accionables.
## Post-Mortem Requerido (Sev-1/2)
- Causa raíz (5 Porqués)
- Tiempo de detección / tiempo de mitigación
- Qué salió bien
- Elementos de acción con responsables y fechas de vencimiento
- Actualizaciones de runbooks fusionadas a mainRelacionado: Diagnóstico de tormentas de bloqueo - cuándo la terminación es la mitigación
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.
Revisado por Chris St. John·Última actualización: 16 jul 2026