Noções Básicas de Incidentes
8 exemplos para você começar com a resposta a incidentes Postgres - 5 básicos e 3 intermediários.
Busque em todas as páginas da documentação
8 exemplos para você começar com a resposta a incidentes Postgres - 5 básicos e 3 intermediários.
# Confirm you can reach the primary and have a read-only role for triage
psql "$DATABASE_URL" -c "SELECT version();"
psql "$DATABASE_URL" -c "SELECT pg_is_in_recovery();"pg_stat_activity, pg_locks e visualizações de replicação.Mapeie o impacto do usuário a um nível de severidade antes de alterar a produção.
| Severidade | Impacto no usuário | Alvo de resposta |
|---|---|---|
| Sev-1 | Perda de dados, interrupção total ou violação de segurança | Chamar imediatamente; sala de guerra |
| Sev-2 | Gravações degradadas ou taxa de erro elevada | Chamar o plantão; corrigir em horas |
| Sev-3 | Consultas lentas, dor de inquilino único | Correção em horário comercial |
| Sev-4 | Cosmético ou apenas interno | Backlog |
Relacionado: Melhores Práticas de Resposta a Incidentes - higiene de runbook
Execute esta sequência antes do diagnóstico aprofundado.
-- 1. Is the instance accepting connections?
SELECT now() AS ts, pg_is_in_recovery() AS is_replica;
-- 2. Who is connected and what are they waiting on?
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. Blocked sessions?
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;Mantenha as partes interessadas informadas sem vazar texto de consulta confidencial.
[INC-1234] Sev-2 - Elevated API latency on checkout service
Status: Investigating
Impact: ~15% of checkout requests timing out after 30s
Start: 2026-07-09 14:22 UTC
Actions: Checking connection pool saturation and lock waits on primary
Next update: 14:37 UTCEXPLAIN em canais públicos.Crie uma role que possa diagnosticar sem mutar dados.
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 para contas de plantão "apenas para o incidente".Failover é uma decisão de negócios, não apenas técnica.
# Patroni example: check cluster state before manual failover
patronictl -c /etc/patroni/patroni.yml listRelacionado: Emergência de Lag de Replicação - triagem de lag antes da reconstrução
Notas estruturadas tornam os post-mortems rápidos.
mkdir -p incidents/INC-1234
cat >> incidents/INC-1234/timeline.md <<'EOF'
| Time (UTC) | Actor | Action |
|------------|-------|--------|
| 14:22 | pager | Sev-2 opened, checkout latency |
| 14:25 | dba | pg_stat_activity shows 200 idle in transaction |
EOFEXPLAIN, diferenças de configuração.Termine apenas com política e registro.
-- Find long idle-in-transaction sessions (common incident root cause)
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';
-- Terminate one backend (requires appropriate role)
SELECT pg_terminate_backend(12345);pg_terminate_backend em Sev-1, a menos que seja um runbook automatizado.pid, application_name e ID do ticket no canal de incidentes.Feche o ciclo do incidente com acompanhamentos acionáveis.
## Post-Mortem Required (Sev-1/2)
- Root cause (5 Whys)
- Time to detect / time to mitigate
- What went well
- Action items with owners and due dates
- Runbook updates merged to mainRelacionado: Triagem de Tempestade de Bloqueio - quando a terminação é a mitigação
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026