Antes de reconstruir ou reparar uma tabela, é preciso reunir evidências de um defeito físico. O CHECK TABLE procura os problemas que o engine consegue verificar, e a leitura correta do resultado mostra o que ele confirma e o que fica fora do seu alcance.
O comando e o resultado
CHECK TABLE vendas;: verifica a tabela vendas;CHECK TABLE vendas, itens_venda;: verifica várias tabelas no mesmo comando;mysqlcheck --host=192.168.1.10 --user=root --password loja: verifica, pelo Prompt de Comando, todas as tabelas do banco loja.
O resultado tem uma linha para cada mensagem, com a tabela, a operação, o tipo da mensagem e o texto. O tipo status com o texto OK é o resultado esperado. Os tipos error, warning, note e info trazem detalhes, e todas as linhas precisam ser lidas, porque um erro pode aparecer antes do status final.
As opções e os engines
- QUICK: não percorre as linhas para conferir as ligações internas. Vale para o InnoDB e para o MyISAM.
- FAST e CHANGED: verificam apenas as tabelas que não foram fechadas corretamente ou que mudaram desde a última verificação. Valem só para o MyISAM.
- MEDIUM: confere as linhas e os índices com somas de verificação. É o padrão do MyISAM e vale só para ele.
- EXTENDED: busca, para cada linha, todas as entradas de índice correspondentes. É a verificação mais completa do MyISAM e também a mais demorada.
- FOR UPGRADE: verifica se a tabela é compatível com a versão atual do MySQL.
No InnoDB, as opções FAST, CHANGED, MEDIUM e EXTENDED são ignoradas, e acrescentar EXTENDED não torna a verificação mais profunda.
O alcance do OK
O OK indica que a verificação não encontrou os problemas que ela examina. Algumas formas de dano ficam fora do alcance do CHECK TABLE, e o OK não encerra a hipótese física quando há outros sinais, como erros de leitura no log de erros.
O OK também não confere as ligações mantidas pela aplicação, as colunas derivadas nem as condições das ordens. A verificação da tabela de controle das ordens, por exemplo, confirma a estrutura dessa tabela, e não se as linhas dela descrevem as ordens corretamente.
O efeito na operação
- InnoDB: nas versões atuais, a verificação costuma deixar as gravações seguirem, mas disputa o disco e o processamento com a operação, e, em tabelas grandes, outras conexões podem ficar esperando. Um erro encontrado pode marcar um índice ou a tabela como danificados e impedir o uso deles. Quando encontra uma página danificada, o servidor pode se encerrar de propósito, para impedir que o dano se espalhe.
- MyISAM: a verificação bloqueia as gravações na tabela enquanto dura, e um erro encontrado deixa a tabela marcada como danificada.
Por isso, a verificação de uma tabela grande ou suspeita acontece em uma janela de manutenção, depois da preservação dos dados.
Depois do resultado
- OK, com o problema ainda presente: a investigação segue pelas hipóteses lógicas, sem abandonar outros sinais físicos.
- Erro em uma tabela InnoDB: o caminho é a reconstrução da tabela ou a restauração de uma cópia, depois da preservação do que ainda pode ser lido.
- Erro em uma tabela MyISAM: o caminho é o reparo da tabela, depois da cópia dos arquivos.
No suporte
Convém registrar o resultado completo do CHECK TABLE junto com o engine e a versão do MySQL. A frase “o CHECK TABLE não encontrou erro” descreve o resultado com precisão, e a análise dos logs e do SQL real continua. Uma evidência de dano continua valendo mesmo depois de um OK.
Para guardar
- O CHECK TABLE procura os defeitos físicos que o engine consegue verificar.
- O resultado esperado é o status OK, e todas as linhas da saída precisam ser lidas.
- As opções FAST, CHANGED, MEDIUM e EXTENDED valem só para o MyISAM.
- O OK não elimina todo dano possível nem confere as regras da aplicação.
- No MyISAM, a verificação bloqueia as gravações, e no InnoDB uma página danificada pode encerrar o servidor.
Por que planejar o CHECK TABLE para uma janela de manutenção, se ele apenas verifica?
Porque a verificação disputa recursos com a operação, bloqueia as gravações em tabelas MyISAM e, no InnoDB, pode encerrar o servidor ao encontrar uma página danificada. A janela e a preservação anterior limitam o impacto e mantêm um caminho de recuperação.
O comando CHECK TABLE vendas EXTENDED retornou OK em uma tabela InnoDB. A verificação foi mais completa que a comum?
Não. O InnoDB ignora a opção EXTENDED, e o resultado tem o mesmo alcance da verificação comum. Ele precisa ser combinado com as outras evidências, sem a conclusão de que todo dano possível foi descartado.