Quando a demora desaparece antes da coleta, parte da evidência desaparece junto. O monitoramento durante a ocorrência separa a espera, a execução pesada, o excesso de conexões e um reinício do serviço. O objetivo é registrar o estado que explica o sintoma sem criar uma carga maior que o próprio problema.
Identificar o servidor e o momento
SELECT VERSION(), @@hostname, @@port, DATABASE(), CONNECTION_ID();: identifica o servidor, a porta, o banco e a conexão da observação.
Esses valores evitam misturar o servidor da loja com outro servidor, e o horário de cada coleta fica anotado, com os relógios dos computadores conferidos. A conta da observação também importa. Sem o privilégio PROCESS, a lista de conexões mostra apenas as conexões da própria conta, e a conexão que bloqueia pode ficar de fora.
As conexões
SHOW FULL PROCESSLIST;: mostra cada conexão, com o identificador, a conta, o computador de origem, o banco, o tipo de comando, o tempo, o estado e a instrução.
Sem a palavra FULL, a instrução aparece cortada nos primeiros 100 caracteres. O tempo mostra os segundos no estado atual, e não a duração total da operação na tela. Uma conexão no estado Sleep pode guardar uma transação aberta, e por isso a conexão mais antiga não é necessariamente a responsável pela demora.
Os contadores do servidor
SHOW GLOBAL STATUS WHERE Variable_name IN ('Uptime', 'Threads_connected', 'Threads_running', 'Connections', 'Aborted_connects', 'Slow_queries');: mostra os principais contadores do servidor.
Os contadores têm significados diferentes:
- Uptime: os segundos desde a última inicialização do serviço. Um valor pequeno indica um reinício recente, sem explicar a causa.
- Threads_connected: as conexões abertas no momento.
- Threads_running: as conexões que estão trabalhando no momento, e não dormindo.
- Connections: o total de tentativas de conexão desde a inicialização.
- Aborted_connects: o total de tentativas de conexão que falharam.
- Slow_queries: o total de consultas que passaram do limite de tempo definido para consultas lentas.
Os três últimos contadores só aumentam, e a leitura útil vem da comparação de duas amostras. Se o Connections passa de 10.000 para 10.300 em 60 segundos, o servidor recebeu 300 conexões novas nesse intervalo, e não 10.300 conexões ao mesmo tempo.
O limite de conexões simultâneas aparece com o comando SHOW VARIABLES LIKE 'max_connections';, e o padrão costuma ser 151. Quando o limite é atingido, as novas conexões recebem o erro 1040, de conexões demais.
O log de consultas lentas
O log de consultas lentas registra as consultas que passam de um tempo limite, de 10 segundos por padrão. Dois comandos mostram a configuração:
SHOW VARIABLES LIKE 'slow_query%';: mostra se o log está ligado e o nome do arquivo;SHOW VARIABLES LIKE 'long_query_time';: mostra o tempo limite, em segundos.
Cada registro traz o tempo da consulta, o tempo de espera por bloqueio, as linhas devolvidas e as linhas examinadas. O registro é gravado ao fim da execução, e a ordem do arquivo pode ser diferente da ordem em que as consultas começaram. A ausência de uma consulta no log não prova que não houve demora, porque o log pode estar desligado ou com um limite alto.
A partir do MySQL 5.1.12, o log pode ser ligado sem reiniciar o serviço, com o comando SET GLOBAL slow_query_log = 1;. A ligação considera o volume de registros e o espaço em disco, e o horário da mudança fica anotado.
O computador do servidor
Os contadores do banco não substituem a observação do computador. O Gerenciador de Tarefas do Windows mostra o uso do processador, da memória e do disco pelo processo do MySQL, e o espaço livre de cada disco também entra na coleta. Um disco cheio paralisa o banco tanto quanto um bloqueio.
Registrar o que foi visto
Uma anotação precisa vale mais que uma impressão. A frase “a conexão 42 esperava um bloqueio da conexão 17 às 10h14” explica mais do que “o banco estava pesado”. Depois da intervenção, as mesmas observações são repetidas e comparadas. Quando o sintoma some antes da coleta, a causa fica registrada como não confirmada.
No suporte
A coleta começa pelas observações de baixo custo, durante o sintoma, com o horário e a origem de cada uma. Consultas amplas, registros detalhados ligados por muito tempo e comandos que executam a consulta investigada aumentam a carga do servidor.
Para guardar
- O servidor, o horário e a conta da observação dão sentido à coleta.
- O estado da conexão e o estado da transação são informações diferentes.
- Os contadores acumulados exigem a comparação de duas amostras.
- O Uptime confirma um reinício, mas não a causa dele.
- O log de consultas lentas só registra o que passa do limite configurado.
- Uma ocorrência sem evidência suficiente termina com a causa não confirmada.
O contador Connections está em 100.000. Isso significa 100.000 conexões abertas agora?
Não. O Connections soma as tentativas de conexão desde a inicialização do serviço. As conexões abertas aparecem no Threads_connected, e a diferença do Connections entre duas amostras mostra o ritmo de conexões novas.
A conta usada na observação não mostra as conexões de outras contas. É possível concluir que não existe uma conexão bloqueando?
Não. Sem o privilégio PROCESS, a lista mostra apenas as conexões da própria conta. A limitação fica registrada, e a observação é repetida com uma conta que tenha esse privilégio.