Fundamentos de Solução de Problemas
Solucionar problemas em um sistema PostgreSQL é menos sobre memorizar consultas de diagnóstico e mais sobre executar um método repetível sob pressão.
Busque em todas as páginas da documentação
Solucionar problemas em um sistema PostgreSQL é menos sobre memorizar consultas de diagnóstico e mais sobre executar um método repetível sob pressão.
Esta página constrói o modelo mental que um engenheiro sênior ou DBA realmente usa quando a produção está degradada, para que os playbooks específicos em outras partes desta seção sejam lidos como instâncias desse modelo, em vez de um monte de truques não relacionados.
Toda sessão de solução de problemas do Postgres começa com a mesma pergunta: o sistema está atualmente piorando, permanecendo o mesmo ou já se recuperando.
Essa única pergunta decide se você passará os próximos cinco minutos estabilizando ou os próximos cinco minutos diagnosticando, e confundir os dois é o erro mais comum que até engenheiros experientes cometem sob pressão.
Estabilização significa parar o dano ativo, como matar um bloqueador descontrolado ou reduzir a carga, sem necessariamente entender ainda por que o dano começou.
Diagnóstico significa construir uma cadeia de evidências, uma sequência de observações que conecta um sintoma a um mecanismo e a uma causa raiz.
Um sintoma é o que o negócio ou o usuário experimenta, enquanto uma causa raiz é a condição subjacente que, deixada sozinha, continua produzindo esse sintoma.
Confundir os dois é perigoso porque corrigir um sintoma, como reiniciar um serviço ou matar uma sessão, pode fazer o pager parar sem tocar na condição que causará o próximo incidente.
Raio de explosão é o inventário honesto do que está realmente afetado agora, não do que poderia ser teoricamente afetado, e deve ser reavaliado à medida que novos fatos chegam, em vez de ser fixado no início.
O Postgres expõe a maior parte do que você precisa para construir essa cadeia de evidências através de um punhado de visualizações de sistema, principalmente pg_stat_activity, pg_locks e as visualizações de replicação, em vez de apenas através de logs de aplicativos.
Uma analogia útil é a triagem de um médico: sinais vitais primeiro, depois sintomas, depois exames e só então tratamento.
Pular direto para um diagnóstico profundo enquanto o paciente, ou seja, o banco de dados, está se deteriorando ativamente é como os minutos se transformam em horas.
As mecânicas de solução de problemas são realmente as mecânicas de correlação, combinando a linha do tempo de um sintoma com um pequeno número de mudanças de estado internas.
pg_stat_activity é o mais próximo que o Postgres tem de um monitor de sinais vitais ao vivo, mostrando o estado atual de cada backend, o evento de espera e quanto tempo ele manteve esse estado.
Um evento de espera diz no que uma sessão está bloqueada no momento, seja um lock, uma operação de I/O ou latência simples de rede do cliente, e ler os eventos de espera como uma distribuição revela problemas sistêmicos que a leitura de uma sessão por vez nunca revelará.
Locks interagem com transações, e transações interagem com a visibilidade MVCC, então uma sessão que parece travada está frequentemente esperando atrás de uma sessão completamente diferente que, por si só, está apenas ociosa.
Essa indireção é o motivo pelo qual engenheiros seniores perguntam reflexivamente em quem uma sessão está realmente bloqueada antes de tocar em qualquer coisa, usando pg_blocking_pids() para percorrer o gráfico de dependência real em vez de adivinhar apenas pelo texto da consulta.
A replicação introduz um segundo eixo de interação, porque um primário que parece saudável pode estar silenciosamente ficando para trás de um standby, e esse atraso em si se torna o próximo incidente se deixado sem vigilância.
Autovacuum e o inchaço MVCC interagem com quase tudo mais, já que uma única transação de longa duração em qualquer nó pode impedir o vacuum de limpar tuplas mortas, degradando lentamente o desempenho até que uma consulta não relacionada comece a expirar.
Essa é a armadilha de raciocínio central na solução de problemas do Postgres: os subsistemas estão tão interligados que uma correção em um lugar pode criar silenciosamente um novo incidente em outro lugar.
Um engenheiro sênior gerencia essa interligação verificando a visão de segunda ordem após qualquer mitigação, como confirmar o atraso do réplica e as contagens de conexão logo após encerrar uma sessão bloqueadora.
A consulta abaixo ilustra o próprio hábito de categorização, não um incidente específico, agrupando backends ativos pelo que eles estão atualmente esperando.
-- Categoriza a atividade atual por tipo de espera, não por texto de consulta.
-- Isso é um hábito de diagnóstico, não uma correção: diz ONDE procurar a seguir.
SELECT wait_event_type, wait_event, count(*) AS sessions
FROM pg_stat_activity
WHERE state != 'idle'
GROUP BY 1, 2
ORDER BY sessions DESC;Ler esse resultado como uma distribuição, em vez de perseguir a única consulta mais lenta, é o que separa o diagnóstico da causa raiz da correção de sintomas como um jogo de "whack-a-mole".
Em escala, a solução de problemas deixa de ser um engenheiro lendo pg_stat_activity e se torna um pipeline de sinais automatizados que um humano interpreta.
Ferramentas como pg_stat_statements, auto_explain e agentes APM externos existem precisamente porque ninguém pode monitorar todas as consultas em tempo real em um cluster de produção movimentado.
A habilidade avançada não é aprender mais consultas de diagnóstico, é aprender qual sinal confiar quando dois sinais discordam, como quando a latência no nível do aplicativo parece boa, mas os eventos de espera no lado do banco de dados mostram contenção se acumulando por baixo.
Falhas em cascata são o caso avançado mais difícil, onde uma tempestade de locks no primário causa atraso na replicação, o que empurra o tráfego de leitura de volta para o primário, o que aprofunda a tempestade de locks original.
Quebrar esse tipo de loop geralmente requer reduzir a carga na borda, através de limitação de taxa ou disjuntores, antes que uma correção no nível do banco de dados possa ter efeito.
A maturidade da observabilidade também muda o que causa raiz significa, já que um sistema bem instrumentado permite distinguir uma anomalia única de uma tendência de construção lenta que as métricas mostram há semanas.
A cultura de post-mortem também faz parte da mecânica, porque um incidente que não é convertido em um padrão documentado simplesmente ocorrerá novamente com um gatilho diferente.
A tabela abaixo compara as posturas que as equipes comumente adotam em relação à maturidade de solução de problemas, já que a postura em que você está muda o que uma boa triagem parece no dia a dia.
| Abordagem | Força | Fraqueza | Melhor Ajuste |
|---|---|---|---|
| Combate reativo a incêndios | Rápido para começar, nenhum investimento em ferramentas necessário | Esgota o plantão, os mesmos incidentes se repetem | Equipes em estágio inicial com uma pequena pegada de banco de dados |
| Triagem baseada em runbook | Resposta consistente, integração mais rápida para novos plantões | Runbooks apodrecem se não forem vinculados a incidentes reais | Equipes após seus primeiros Sev-1s |
| Primeiro métricas e alertas | Captura tendências antes que elas acionem alguém | Fadiga de alerta se os limites não forem ajustados | Equipes com capacidade dedicada de plataforma ou SRE |
| Autocura automatizada | Remove humanos de mitigações rotineiras | Perigoso se a automação diagnosticar mal a causa | Plataformas maduras com modos de falha bem compreendidos |
Nenhuma equipe permanece em uma única postura para sempre, e o movimento avançado honesto é tratar esta tabela como uma curva de maturidade em vez de um menu de escolhas permanentes.
Verifique se o sistema está ativamente piorando, permanecendo estável ou já se recuperando.
Esse único fato decide se você passará os próximos minutos estabilizando ou diagnosticando, e fazer ambos ao mesmo tempo geralmente significa não fazer nenhum deles bem.
Eles competem pelo mesmo tempo durante um incidente, e tratá-los como uma atividade única e borrada tende a produzir correções apressadas e mal fundamentadas.
Estabilizar primeiro compra o tempo que o diagnóstico realmente precisa para ser feito corretamente.
Um sintoma é o que um usuário ou dashboard relata, como checkout lento.
Uma causa raiz é a condição subjacente que produz esse sintoma, como uma migração que adquiriu um lock exclusivo sem timeout.
pg_stat_activity para o que cada sessão está fazendo no momentopg_locks para quem está bloqueado e por quemOs subsistemas do Postgres são rigidamente acoplados, então locks afetam transações, transações afetam a visibilidade MVCC, e a visibilidade afeta a capacidade do autovacuum de limpar.
Uma mitigação que ignora esse acoplamento pode resolver um sintoma enquanto silenciosamente inicia outro.
É uma tática de estabilização válida, mas não é um diagnóstico por si só.
Sem entender por que essa sessão se tornou um bloqueador, o mesmo padrão reaparecerá sob as mesmas condições.
Meça-o como um inventário honesto do que está realmente afetado agora, e repita a medição à medida que novos fatos chegam.
Tratar uma estimativa inicial como final é uma maneira comum de a severidade ser mal julgada.
Um evento de espera descreve no que uma sessão está atualmente bloqueada, como um lock ou uma leitura de I/O.
Agrupar sessões por evento de espera revela padrões de contenção sistêmica que a varredura de consultas lentas individuais tende a perder.
Uma tempestade de locks no primário pode atrasar a replicação, o que empurra o tráfego de leitura de volta para o primário, o que aprofunda a contenção original.
Quebrar esse loop geralmente significa reduzir a carga na borda antes que a correção no nível do banco de dados possa ter efeito.
Apenas se for direcionado aos sinais que realmente preveem incidentes em seu sistema.
Logs ou alertas indiferenciados adicionam ruído que um humano ainda precisa filtrar sob pressão de tempo.
Um incidente que não é convertido em um padrão documentado tende a ocorrer novamente com um gatilho ligeiramente diferente.
O post-mortem é onde uma correção única se torna uma mudança de processo duradoura.
Sim, problemas de construção lenta como inchaço ou deriva de estatísticas muitas vezes ficam abaixo dos limites de alerta até que cruzem um penhasco.
É por isso que a revisão periódica de tendências é tão importante quanto reagir a alertas ativos.
Versões de Stack: Esta página foi escrita para PostgreSQL 18.4 (linha estável 18, linha de manutenção 17); as visualizações de diagnóstico e as mecânicas gerais de triagem descritas aqui são estáveis em versões principais recentes.
Revisado por Chris St. John·Última atualização: 15 de jul. de 2026