Este capítulo reúne o conteúdo de casos práticos para revisão: os erros mais comuns, os checklists de atendimento, o glossário, as referências e perguntas que misturam vários casos.
Erros comuns
- Concluir pelo ping que o banco está acessível. O ping usa o ICMP e não testa a porta do MySQL, e a mensagem completa do erro mostra onde a conexão falha.
- Trocar a senha diante de qualquer erro de conexão. O erro 2003 acontece antes da autenticação, e só um erro devolvido pelo próprio MySQL, como o 1045, leva à conta e à senha.
- Testar uma porta presumida. O programa pode usar outra porta, e a configuração carregada pela estação mostra o destino real.
- Explicar uma falha intermitente pelo teste feito depois da recuperação. O teste mostra o estado daquele momento, e a evidência vem da própria conexão que caiu.
- Aumentar prazos antes de saber quem encerrou a conexão. O limite do servidor é só uma hipótese, e um equipamento do caminho pode ter regras próprias.
- Repetir uma operação logo depois de um tempo esgotado. O resultado é desconhecido, e a consulta pela referência mostra se a operação já existe do outro lado.
- Cobrar de novo um pagamento que não aparece no pedido. O pagamento pode já ter sido recebido, e a consulta do pagamento e a reconciliação resolvem sem duplicidade.
- Tratar a resposta 200 ao webhook como o pedido atualizado. A resposta confirma a etapa definida na integração, como a gravação na fila, e não a atualização do pedido.
- Reconstruir a tabela diante de uma gravação parada. A espera por um bloqueio não é defeito físico, e a coleta das conexões e das transações mostra quem espera e quem bloqueia.
- Descartar da investigação uma conexão em Sleep. Ela pode guardar uma transação aberta, com os bloqueios.
- Dar COMMIT na transação que bloqueia para liberar o caixa. O COMMIT confirma um trabalho que ninguém validou, e a decisão é de quem responde pela alteração.
- Tratar os erros 1205 e 1213 da mesma forma. O 1205 desfaz, por padrão, só a instrução que esperou, e o 1213 desfaz a transação inteira.
- Liberar uma restauração pela contagem de linhas. A mesma contagem pode esconder identidades trocadas, e o maior identificador, o contador e um recorte de documentos mostram a diferença.
- Copiar as linhas de uma tabela sem a coluna da chave primária. O AUTO_INCREMENT gera números novos, e as outras tabelas passam a apontar para linhas erradas.
- Confiar só na consulta de registros órfãos. Ela não encontra as ligações que apontam para uma linha existente e errada.
- Apagar uma mensagem repetida da fila. O trabalho pode ainda não ter sido aplicado, e a identidade do evento mostra o que já foi feito.
- Devolver à fila todas as mensagens da DLQ. O motivo de cada desvio e os efeitos já aplicados são conferidos antes, para não repetir operações nem o mesmo erro.
- Filtrar o log só pelas linhas com o identificador da operação. A continuação do registro, em outra linha, pode trazer o resultado.
- Somar as horas do fuso e considerar o relógio certo. A conversão não corrige um relógio adiantado, e o relógio precisa de uma evidência própria.
- Tratar o horário do ID 41 como o instante da queda. O evento é gravado na inicialização seguinte, e a interrupção pode ter começado bem antes.
- Registrar a venda de novo porque o serviço voltou. A venda pode ter sido concluída antes da queda, e a consulta pelo procedimento do sistema vem antes.
- Declarar a causa resolvida porque o atendimento terminou. A causa sem evidência fica registrada em aberto, com a coleta de uma nova ocorrência.
Checklist do relato e da triagem
- O relato diz o que era esperado e o que aconteceu, com a mensagem exata?
- O relato informa onde, quando, quanto e o que mudou?
- O impacto pede um contorno imediato, como a contingência ou outro caixa?
- Existe um computador, um horário ou uma operação em que o problema não acontece?
Checklist de uma falha de conexão com o banco
- A mensagem completa, com o código e o detalhe, foi preservada?
- O destino e a porta usados pelo programa foram comparados com a configuração aprovada?
- O teste de porta e a comparação com um computador que funciona separam a rede do serviço?
- Na falha intermitente, a coleta inclui a conexão que caiu e o que veio antes dela?
Checklist de uma operação com resultado desconhecido
Antes de qualquer repetição
- A referência da operação e os identificadores de cada tentativa estão preservados?
- A consulta pela referência, na conta e no ambiente certos, mostra a situação no fornecedor?
- O significado de cada confirmação, como a resposta 200 e o ack, está conhecido?
Depois da recuperação
- O resultado foi aplicado pela rotina prevista, sem nova cobrança nem nova autorização?
- O histórico mostra uma única operação, e as ações ligadas ao pedido foram conferidas?
- Os outros casos do mesmo período foram levantados?
Checklist de uma gravação parada
- A coleta mostra quem espera, quem bloqueia, desde quando e a origem de cada conexão?
- O trabalho pendente da transação que bloqueia foi identificado com o responsável?
- O erro recebido, 1205 ou 1213, e o tratamento da aplicação estão conhecidos?
- A operação liberada foi conferida, sem gravação duplicada?
Checklist de uma restauração
- A restauração aconteceu em um destino isolado, sem ligação com a matriz e com as integrações?
- O maior identificador, o contador e um recorte de documentos batem com a própria cópia?
- As ligações entre as tabelas foram conferidas pelo significado, e não só pela presença?
- A tabela de controle, os índices e as colunas derivadas vêm do mesmo momento da cópia?
- Os critérios de liberação e o acompanhamento depois do retorno estão definidos?
Checklist de uma linha do tempo
- Cada origem tem o período coberto, o fuso e a forma de coleta registrados?
- Os registros estão ligados por identificadores, e não só pela proximidade dos horários?
- Os horários originais estão preservados ao lado das conversões e das estimativas?
- A precisão dos relógios permite afirmar a ordem entre as máquinas?
- O resultado da operação, a volta do serviço e a causa foram tratados como perguntas separadas?
Glossário
- Ack: a confirmação do consumidor de que aceitou a entrega de uma mensagem como tratada.
- AUTO_INCREMENT: a opção que faz o MySQL gerar o identificador de cada linha nova.
- Broker: o serviço de mensageria que recebe as mensagens e as distribui aos consumidores.
- BugcheckCode: o campo do evento 41 com o código do erro de parada, gravado em decimal.
- Causa imediata: o fato que produziu o sintoma observado, sem explicar, sozinho, por que ele aconteceu.
- Chave primária: a coluna, ou o conjunto de colunas, que identifica cada linha de forma única.
- COMMIT: o comando que confirma as alterações de uma transação.
- Comparação: o confronto entre onde o problema acontece e onde ele poderia acontecer, mas não acontece.
- Confirmação automática: o autocommit, em que cada comando de alteração é confirmado sozinho.
- Confirmação de publicação: a confirmação do broker de que recebeu a mensagem publicada.
- Consulta pela referência: a consulta que localiza uma operação no fornecedor pelo identificador de origem, antes de qualquer repetição.
- Contador: o próximo valor que o AUTO_INCREMENT vai gerar em uma tabela.
- Contorno: a medida que mantém a operação enquanto a causa é investigada, como a contingência ou outro caixa.
- Deadlock: o ciclo de esperas entre transações, que o InnoDB resolve ao desfazer uma delas.
- Despejo de memória: o arquivo gravado pelo Windows em um erro de parada, usado para investigar a causa.
- DLQ: a fila que guarda as mensagens desviadas por uma política, como o excesso de tentativas.
- Erro 1045: o acesso negado pelo MySQL na autenticação.
- Erro 1205: o tempo de espera por um bloqueio esgotado, que desfaz, por padrão, só a instrução que esperou.
- Erro 1213: o deadlock detectado, que desfaz a transação inteira escolhida pelo InnoDB.
- Erro 2003: a falha ao abrir a conexão com o MySQL, com o detalhe 10061 para a recusa e 10060 para o tempo esgotado.
- Erro 2006: a perda da conexão com o servidor, como em uma conexão encerrada por ociosidade.
- Erro 2013: a perda da conexão durante uma consulta.
- Erro de parada: a interrupção do Windows por uma falha grave, conhecida como tela azul.
- Evento tratado: o registro da identidade de um evento já aplicado, gravado na mesma transação do efeito.
- Fuso horário: a diferença entre a hora local e o UTC, como as três horas a menos de Brasília.
- Hipótese: a explicação possível que um teste confirma ou descarta.
- ID 41: o evento Kernel-Power gravado na inicialização seguinte a um encerramento incorreto do Windows.
- KILL: o comando que encerra uma conexão do MySQL e desfaz a transação InnoDB dela.
- LOCK WAIT: o estado de uma transação à espera de um bloqueio, na seção TRANSACTIONS do SHOW ENGINE INNODB STATUS.
- Locked: o estado, no MySQL 5.1, de um comando à espera do bloqueio de uma tabela MyISAM.
- PBM: o programa de benefícios em medicamentos, consultado na venda para autorizar o benefício.
- PowerButtonTimestamp: o campo do evento 41 que, diferente de zero, indica o desligamento pelo botão de energia.
- Pré-autorização: a etapa do PBM que autoriza o benefício antes da conclusão da venda.
- Reconciliação: a comparação dos registros dos dois lados de uma integração e a regularização das diferenças com evidências.
- Recorte: a amostra de registros comparada com uma referência, como alguns documentos de uma cópia.
- Recuperação do InnoDB: o processo automático que, na inicialização depois de um encerramento incorreto, reaplica as alterações confirmadas e desfaz as incompletas.
- Reentrega: a nova entrega de uma mensagem que não recebeu o ack.
- Registro do atendimento: o resumo da ocorrência, das evidências, da correção, da validação e das pendências.
- Registro órfão: a linha que aponta para outra que não existe.
- Reprodução: a repetição controlada do problema, que mostra a falha acontecendo e permite testar a correção.
- Resultado desconhecido: a situação de uma operação cujo retorno não chegou, sem indicar sucesso nem falha.
- ROLLBACK: o comando que desfaz as alterações ainda não confirmadas de uma transação.
- Rotação do log: a troca do arquivo de log por um novo, com o anterior guardado.
- SHOW ENGINE INNODB STATUS: o comando que mostra o estado do InnoDB, com as transações, as esperas e o último deadlock.
- SHOW FULL PROCESSLIST: o comando que lista as conexões do MySQL, com a origem, o estado, o tempo e o comando em execução.
- Sleep: o estado da conexão sem comando em execução, que pode manter uma transação aberta.
- Tempo esgotado: o fim da espera sem resposta no prazo, que deixa o resultado desconhecido.
- Test-NetConnection: o comando do PowerShell que testa a abertura de uma conexão TCP com um endereço e uma porta.
- Triagem: a avaliação do impacto antes da investigação da causa.
- UTC: o horário universal, a referência dos fusos, indicado por Z ou por +00:00.
- wait_timeout: o tempo que o MySQL espera antes de encerrar uma conexão sem atividade.
- Webhook: a chamada HTTP que o fornecedor faz para avisar um evento a um endereço configurado.
Para continuar estudando
- Postmortem sem culpados: a análise de uma ocorrência grave voltada para as causas e para as melhorias, e não para as pessoas.
- Análise de causa raiz: as técnicas, como os cinco porquês e o diagrama de Ishikawa, que levam do sintoma à causa.
- Matriz de Kepner-Tregoe: a comparação estruturada entre o que é e o que não é o problema, com as distinções e as mudanças.
- Gestão de incidentes e de problemas: a separação, prevista no ITIL, entre restaurar o serviço e eliminar a causa.
- Observabilidade: os logs, as métricas e o rastreamento distribuído para acompanhar uma operação entre sistemas.
Referências
As referências a seguir reúnem a documentação do MySQL, da Microsoft e de outros fabricantes, as especificações da internet e os materiais sobre o método de investigação que apoiam os casos práticos. O material está em inglês.
Método de atendimento
- Google, Effective Troubleshooting: o relato, a triagem, as hipóteses, os testes e as armadilhas mais comuns;
- Google, Postmortem Culture: o registro das ocorrências e as ações preventivas, sem culpados;
- CompTIA, metodologia de troubleshooting: os sete passos, da identificação do problema à documentação;
- AHRQ, matriz de Kepner-Tregoe: a comparação entre o que é e o que não é o problema e a causa que explica tudo.
Conexão com o banco
- MySQL, Can't connect to MySQL server: os erros 2002 e 2003, a porta, o serviço e o firewall;
- MySQL, MySQL server has gone away: os erros 2006 e 2013 e o encerramento das conexões ociosas pelo wait_timeout;
- MySQL, erros de comunicação e conexões abortadas: o log de erros e as causas das conexões encerradas;
- MySQL, mensagens de erro do cliente: os erros 2003, 2006 e 2013;
- Microsoft, comando ping: o teste da comunicação IP com o ICMP;
- Microsoft, Test-NetConnection: o teste de porta TCP pelo PowerShell;
- Microsoft, visão geral do SMB: o protocolo das pastas compartilhadas.
Integrações e resultados desconhecidos
- IETF, RFC 9110: a semântica do HTTP, com os códigos 200, 201 e 202 e a idempotência dos métodos;
- Microsoft, padrão de requisição e resposta assíncrona: a operação aceita com o código 202 e a consulta posterior da situação;
- RabbitMQ, confirmações: a confirmação de publicação, o ack do consumidor e a reentrega;
- AWS, padrão transactional outbox: a gravação do efeito e do evento na mesma transação.
Bloqueios, transações e restauração
- MySQL, bloqueios do InnoDB: os tipos de bloqueio de linha e de tabela;
- MySQL, bloqueios e esperas no InnoDB: o estado LOCK WAIT e as tabelas que mostram as esperas;
- MySQL, saída do monitor do InnoDB: as seções TRANSACTIONS e LATEST DETECTED DEADLOCK do SHOW ENGINE INNODB STATUS;
- MySQL, tratamento de erros do InnoDB: o que o tempo de espera esgotado e o deadlock desfazem;
- MySQL, mensagens de erro do servidor: os erros 1205 e 1213;
- MySQL, AUTO_INCREMENT no InnoDB: o contador na memória até o 5.7 e o efeito de um reinício;
- MySQL, chaves estrangeiras: a proteção declarada das ligações entre as tabelas;
- MySQL, restauração de cópias em SQL: a importação de um arquivo do mysqldump.
Tempo, eventos e reinícios
- IETF, RFC 3339: a data completa, o UTC e os deslocamentos de fuso;
- W3C, Trace Context: a propagação de identificadores entre as etapas de uma operação;
- Microsoft, ferramentas do serviço Horário do Windows: o w32tm e a comparação do relógio com um servidor de horário;
- Microsoft, evento 41 do Kernel-Power: o registro na inicialização seguinte, o BugcheckCode e o PowerButtonTimestamp;
- MySQL, log de erros: a inicialização, o desligamento e os avisos do servidor;
- MySQL, recuperação do InnoDB: a recuperação automática depois de um encerramento inesperado.
No suporte
Qualquer caso passa por quatro perguntas:
- o que exatamente falhou, onde, desde quando e o que mudou;
- qual teste separa as hipóteses que continuam possíveis;
- qual evidência sustenta cada conclusão, e o que ainda é só provável;
- o que fica registrado, com a correção, a validação e as pendências.
Com essas perguntas, o atendimento chega a uma conclusão verificável e deixa o caminho aberto para quem continuar o caso.
Para guardar
- O relato útil diz o que era esperado e o que aconteceu, com o quê, onde, quando, quanto e o que mudou.
- Cada teste responde a uma pergunta, e a mensagem completa do erro localiza a falha antes de qualquer mudança.
- Um tempo esgotado deixa o resultado desconhecido, e a consulta pela referência vem antes de qualquer repetição.
- A tabela íntegra não exclui uma espera por bloqueio, e a importação sem erro não prova que as identidades foram preservadas.
- A correlação entre origens depende dos identificadores, e os horários entram com o fuso, o relógio e a incerteza declarados.
- O registro separa o que foi confirmado, o que foi corrigido e o que continua em aberto.
No caixa 01, a finalização de uma venda ficou parada, e minutos depois o caixa recebeu o erro 2013. O servidor da loja não reiniciou. O que investigar antes de repetir a venda?
A situação da venda, pela consulta do procedimento do sistema, porque o erro 2013 deixa o resultado desconhecido. Sem reinício, a conexão pode ter sido encerrada por um KILL, por exemplo para liberar um bloqueio, por uma falha na rede ou por um limite do servidor. Um KILL em uma transação InnoDB desfaz a venda, e o registro de quem encerrou a conexão, junto com a lista de conexões e o log do caixa, mostra o que aconteceu.
A tabela vendas do servidor da loja foi restaurada de uma cópia, e o pedido PED-0007 do site de vendas, pago e aplicado antes da falha, voltou a aparecer como pendente. O que conferir antes de reprocessar o aviso de pagamento?
O ponto recuperado. A cópia devolve os dados ao momento em que foi feita, e o efeito aplicado depois dela se perdeu, junto com o registro do evento tratado, quando ele fica no mesmo banco. O pagamento continua confirmado no serviço, e a reconciliação aplica o resultado existente pela rotina prevista, sem nova cobrança. Os outros pedidos do intervalo entre a cópia e a falha passam pela mesma conferência.
O log do integrador mostra um Enviado às 10:00:00 e um tempo esgotado às 10:00:30, em -03:00, e o fornecedor registra a operação recebida às 13:00:45Z. O fornecedor recebeu o pedido depois do tempo esgotado?
Não é possível afirmar só pelos horários. A conversão dá 10:00:45 em -03:00, quinze segundos depois do tempo esgotado, mas um relógio desalinhado em qualquer dos lados muda essa ordem. O que importa para o atendimento já está confirmado: a operação chegou ao fornecedor, e a consulta pela referência mostra a situação dela antes de qualquer nova tentativa.
Duas vezes nesta semana, a finalização das vendas no caixa 01 ficou parada por cerca de um minuto, sempre perto das 10h, e o problema sumiu sozinho. O que coletar na próxima ocorrência?
A situação no servidor durante o sintoma: a lista de conexões e a seção TRANSACTIONS do SHOW ENGINE INNODB STATUS, com os horários e os identificadores das conexões, e o erro registrado no caixa. O horário repetido também é uma pista, e as rotinas que rodam perto das 10h, como uma tarefa agendada, um relatório ou a sincronização com a matriz, entram na comparação com os dias sem o problema.