Um comando adequado a uma tabela pode ser inútil ou arriscado em outra, e uma contagem tirada da tabela errada leva a conclusões erradas. A versão do MySQL, o engine e o estado de cada tabela indicam quais procedimentos se aplicam e servem de referência para avaliar o resultado de uma manutenção.
Identificar o servidor e a tabela
SELECT VERSION();: mostra a versão do servidor da conexão;SELECT @@hostname, DATABASE();: mostra o computador do servidor e o banco em uso na conexão;SHOW TABLE STATUS LIKE 'vendas';: mostra o engine, o formato e outras características da tabela;SHOW CREATE TABLE vendas;: mostra a definição completa, com as colunas, os índices e o engine.
Uma conferência feita em outro servidor ou em outro banco não explica a falha da tabela usada pelo sistema. Em um ambiente com o banco da loja e o banco da matriz, a conexão da ferramenta precisa apontar para o servidor certo.
Duas variáveis completam a leitura:
SELECT @@default_storage_engine;: mostra o engine usado nas tabelas criadas sem indicação;SELECT @@myisam_recover_options;: mostra se o MySQL repara automaticamente as tabelas MyISAM danificadas ao abri-las.
O padrão do servidor vale para as tabelas criadas daqui em diante e não muda o engine das tabelas existentes. Os nomes das variáveis podem mudar entre as versões. No MySQL 5.1, por exemplo, a variável do engine padrão se chama storage_engine, e o comando fica SELECT @@storage_engine;.
Os campos do estado
- Engine: o mecanismo de armazenamento, que define os procedimentos possíveis.
- Row_format: o formato das linhas. Uma tabela MyISAM com o formato Compressed é somente leitura e tem restrições próprias de reparo.
- Rows: a quantidade de linhas, exata no MyISAM e estimada no InnoDB, em que pode diferir bastante da contagem real.
- Data_length e Index_length: o tamanho dos dados e dos índices, em bytes.
- Auto_increment: o próximo valor do contador.
- Comment: em uma tabela que o MySQL não consegue abrir, o campo pode trazer a mensagem de erro.
A partir do MySQL 8, os campos Rows, Data_length, Index_length e Auto_increment podem vir de valores guardados pelo servidor há até 24 horas. O comando SET SESSION information_schema_stats_expiry = 0;, executado antes, faz a conexão ler os valores atuais.
As medidas de referência
Antes de uma manutenção que possa alterar dados, convém guardar a saída desses comandos e algumas medidas exatas, quando a tabela estiver legível:
SELECT COUNT(*), MAX(id) FROM vendas;: mostra a quantidade exata de linhas e o maior identificador presente;SELECT COUNT(*), SUM(total) FROM vendas WHERE data_venda >= '2026-10-01' AND data_venda < '2026-11-01';: mostra a quantidade e o valor das vendas de um período;SHOW CREATE TABLE vendas;: mostra o próximo valor do contador, depois da palavra AUTO_INCREMENT;CHECKSUM TABLE vendas;: calcula um número a partir do conteúdo inteiro da tabela.
O CHECKSUM TABLE lê a tabela inteira e só serve para comparar dois momentos sem gravações no intervalo. O COUNT(*) conta também as linhas marcadas como excluídas. A validação depois da manutenção repete exatamente as mesmas consultas, com as mesmas condições, e uma medida que não pôde ser obtida, porque a tabela não estava legível, fica registrada como indisponível.
Os engines do banco
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND ENGINE <> 'InnoDB';: lista as tabelas do banco em uso que não estão no InnoDB.
Uma instalação convertida para o InnoDB pode ter tabelas criadas depois em outro engine. A consulta mostra o estado atual, que a história da instalação não garante.
As versões antigas
Muitas instalações ainda usam versões antigas do MySQL, como a 5.1, que deixou de receber correções em 2013. Nessas versões, vários comportamentos diferem dos das versões atuais:
- o engine padrão do servidor é o MyISAM, mas o instalador do Windows costuma definir o InnoDB como padrão no arquivo de configuração;
- o InnoDB pode estar desligado na configuração, com a opção
skip-innodb, e então o comandoSHOW ENGINES;mostra o InnoDB com a palavra NO, a variável have_innodb mostra a palavra DISABLED, e os comandos próprios do InnoDB, como o SHOW ENGINE INNODB STATUS, falham com o erro 1286; - o InnoDB guarda todas as tabelas no arquivo compartilhado ibdata1, a menos que a opção de um arquivo por tabela tenha sido ligada na configuração;
- o modo estrito vem desligado no padrão do servidor, e por isso os valores grandes demais são cortados com um aviso, as datas zeradas são aceitas e o agrupamento não exige todas as colunas;
- o instalador do Windows costuma ligar o modo estrito no arquivo de configuração, e o comando
SELECT @@sql_mode;mostra o modo em uso; - o conjunto de caracteres padrão é o latin1, e o utf8mb4 ainda não existe;
- o log binário vem desligado;
- não existem o performance_schema, o esquema sys, os bloqueios de metadados nem a criação de índices sem o bloqueio das gravações;
- a espera por um bloqueio de tabela aparece na lista de conexões com o estado Locked;
- o contador AUTO_INCREMENT do InnoDB fica só na memória e é recalculado depois de cada reinício.
As ferramentas também precisam combinar com o servidor. Programas e bibliotecas de versões muito mais novas podem não se conectar a um servidor 5.1 ou falhar em parte das funções, e as ferramentas da mesma versão do servidor evitam esse problema.
No suporte
Antes de decidir qualquer manutenção, convém registrar o servidor, o banco, a versão, o engine, a definição e as medidas de referência da tabela. Na validação, as mesmas medidas são repetidas com as mesmas condições. A comparação entre a estimativa Rows e uma contagem exata cria uma falsa impressão de perda.
Para guardar
- A versão e o engine definem quais procedimentos se aplicam.
- O engine padrão do servidor e o engine de uma tabela são informações diferentes.
- No InnoDB, o campo Rows é uma estimativa.
- A partir do MySQL 8, o SHOW TABLE STATUS pode mostrar valores guardados pelo servidor horas antes.
- As medidas de antes e de depois usam as mesmas consultas e as mesmas condições.
- As versões antigas, como a 5.1, têm padrões diferentes, muitas vezes alterados pelo arquivo de configuração, e não têm vários recursos das versões atuais.
Por que anotar o próximo valor do contador, se o maior identificador já foi anotado?
O contador pode estar à frente do maior identificador, porque as linhas mais recentes podem ter sido apagadas, e alguns reparos podem perder o contador. O valor anotado permite restabelecê-lo e evita que números já usados voltem a ser gerados.
O campo Rows mostrava 10.200 linhas no InnoDB, e o COUNT(*) feito depois da manutenção mostra 10.000. Houve perda de 200 linhas?
Não necessariamente. No InnoDB, o Rows é uma estimativa e, a partir do MySQL 8, pode vir de um valor guardado pelo servidor horas antes. A perda só se avalia com contagens exatas, feitas antes e depois com as mesmas condições.