FolioPierEstudos de TI

Versão, engine e estado da tabela

Nota 28 de 41 · 6 min de leitura
Nesta página
  1. Identificar o servidor e a tabela
  2. Os campos do estado
  3. As medidas de referência
  4. Os engines do banco
  5. As versões antigas

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 comando SHOW 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.

Publicado a partir do Obsidian · FolioPier