Slow Query Log estava desligado durante o incidente: o que ainda dá para provar?
Caso real: o Slow Query Log estava OFF na janela investigada. Como continuar o diagnóstico usando logs da origem, monitoria e configuração sem transformar ausência de histórico em inocência do banco.
Depois de um incidente, uma das perguntas mais comuns é:
“o banco estava lento?”
A resposta parece simples quando existe histórico de queries lentas. Mas e quando você chega depois do problema e encontra isto?
| |
Foi exatamente a limitação encontrada em uma investigação real.
A pior saída seria concluir:
não houve slow query.
O log estar desligado prova outra coisa: não havia histórico daquele mecanismo para confirmar nem descartar queries lentas na janela do incidente.
Isso não encerra a investigação. Só muda a força das conclusões que podem ser feitas.
O que estava comprovado #
Na coleta, a configuração do MySQL mostrava o Slow Query Log desabilitado e não havia arquivo histórico útil para a janela analisada.
Em paralelo, outras camadas tinham evidência disponível:
- respostas HTTP 500, 502 e 504 na origem;
- falhas temporárias na comunicação Nginx → FastCGI/PHP-FPM;
- mensagens de
Too many open filese falha de criação de sockets; upstream timed out,recv() failede conexões encerradas prematuramente;- monitoria registrando pressão de CPU/load;
- configuração efetiva do Nginx e limites dos processos;
- configuração do pool PHP-FPM;
- distribuição do impacto em rotas dinâmicas.
Isso permitia investigar a degradação mesmo sem responder retrospectivamente quais queries foram lentas.
Ausência de Slow Query Log é uma limitação forense #
A diferença semântica importa.
| |
A primeira frase transforma falta de observabilidade em conclusão.
A segunda documenta a limitação real.
Em troubleshooting, saber o que não pode ser provado faz parte do diagnóstico.
O que ainda dá para investigar #
Mesmo sem histórico de queries lentas, outras fontes ajudam a reconstruir o modo de falha.
1. Logs da camada web #
No caso analisado, o error.log do Nginx mostrou falhas concretas entre a origem e o backend FastCGI/PHP-FPM.
Uma busca sanitizada pode começar assim:
| |
Isso não diz automaticamente por que o incidente ocorreu, mas mostra como a degradação se manifestou.
2. Distribuição dos códigos HTTP #
O access log mostrou crescimento anormal de respostas 5xx durante a janela crítica.
Aqui também existe uma regra importante: antes de transformar contagem de log em métrica de usuário, confirmar o formato daquele log.
No caso real, o access log era global da origem e não registrava Host. Portanto ele servia como indicador de carga recebida pela origem, e não como número exclusivo de visitantes de uma aplicação.
3. Monitoria de host #
CPU e load estavam elevados durante o evento.
Isso é evidência de pressão de processamento, mas não deveria virar sozinho uma RCA do tipo:
CPU alta causou tudo.
A monitoria ajuda a compor a linha do tempo e a correlacionar pressão do host com os erros de aplicação.
4. Limites reais do processo #
Uma configuração declarada no systemd nem sempre representa o limite efetivamente aplicado a um processo já em execução.
No incidente, a investigação comparou configuração e limite efetivo dos processos Nginx, porque os logs registravam erros de file descriptor.
Um roteiro útil é:
| |
Esse tipo de comparação produz evidência muito mais forte do que olhar apenas o arquivo de configuração.
5. Estado do PHP-FPM #
Como havia erros entre Nginx e FastCGI, o pool PHP-FPM também precisava ser examinado.
Foram coletados parâmetros como pm.max_children, servidores iniciais/spare, pm.max_requests e timeout.
A busca não encontrou evidência explícita de:
| |
A interpretação correta foi limitada: não havia evidência direta, naquela busca, de esgotamento explícito do pool por esse mecanismo.
Isso não significa que o PHP-FPM estava necessariamente saudável em toda a janela.
E o banco em tempo real? #
Se o incidente ainda estiver acontecendo, não depender exclusivamente de histórico.
Consultas como estas ajudam a fotografar o estado atual:
| |
O ponto é temporal: PROCESSLIST descreve o presente. Ele não reconstrói queries que já terminaram horas antes.
Por isso observabilidade precisa existir antes do próximo incidente.
O que fazer depois de descobrir que o log estava OFF #
A ação não deveria ser simplesmente ativar logging sem pensar em volume, retenção e disco.
O caminho mais seguro é definir uma janela controlada de observação:
| |
Depois, validar se o dado produzido realmente responde às perguntas operacionais.
O aprendizado do caso #
O incidente tinha bastante evidência em Nginx, sistema, PHP-FPM e monitoria.
No banco, porém, faltava justamente o histórico necessário para avaliar queries lentas retrospectivamente.
Isso criou uma conclusão importante:
observabilidade ausente não absolve nem condena um componente. Ela limita o que pode ser afirmado sobre ele.
Quando a evidência desaparece ou nunca foi coletada, o trabalho técnico não é preencher o espaço com uma hipótese convincente.
É registrar o limite, usar as outras fontes disponíveis e preparar o ambiente para que a próxima investigação tenha uma resposta melhor.
Caso relacionado #
Este mesmo evento também gerou uma análise focada na degradação da origem sob concorrência, com Nginx, PHP-FPM, file descriptors e respostas 5xx. O recorte aqui é diferente: o que fazer quando a evidência de banco que você gostaria de consultar simplesmente não existia durante a janela do incidente.
Leia também: Too many open files, upstream timed out e CPU alta
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.