FolioPierEstudos de TI

Reconstruir uma tabela InnoDB

Nota 32 de 41 · 4 min de leitura
Nesta página
  1. O REPAIR TABLE não serve ao InnoDB
  2. Os comandos
  3. Quando a reconstrução não basta
  4. O espaço em disco
  5. Os bloqueios durante a reconstrução
  6. Antes e depois

Reconstruir uma tabela significa criar de novo a estrutura física dela, lendo as linhas e montando outra vez os índices definidos. A reconstrução pode resolver problemas em índices e reorganizar uma tabela fragmentada, mas depende de uma condição: os dados precisam poder ser lidos. Ela não é um reparo universal, e o comando de reparo do MySQL nem funciona nesse engine.

O REPAIR TABLE não serve ao InnoDB

O REPAIR TABLE funciona com os engines MyISAM, ARCHIVE e CSV. Em uma tabela InnoDB, o comando termina com a nota The storage engine for the table doesn't support repair, que informa a falta de suporte, e não um reparo. As opções QUICK, EXTENDED e USE_FRM também não mudam esse resultado. Por isso, o engine da tabela é conferido antes da escolha do procedimento, sem depender do costume das instalações antigas, em que as tabelas eram MyISAM.

Os comandos

  • ALTER TABLE vendas ENGINE=InnoDB;: reconstrói a tabela, mantendo o engine, em qualquer versão;
  • OPTIMIZE TABLE vendas;: no InnoDB, reconstrói a tabela e atualiza as estatísticas;
  • ANALYZE TABLE vendas;: atualiza apenas as estatísticas usadas pelo otimizador.

No InnoDB, o OPTIMIZE TABLE responde com a nota Table does not support optimize, doing recreate + analyze instead, seguida do status OK. A nota é normal e informa que o comando fez uma reconstrução. O ANALYZE TABLE não refaz as páginas nem corrige um dano, e serve quando estatísticas desatualizadas levam a um plano ruim.

A reconstrução refaz os índices que fazem parte da definição atual da tabela. Um índice apagado antes não reaparece, porque já não está na definição.

Quando a reconstrução não basta

Um índice secundário danificado pode ser refeito a partir das linhas, que ficam no índice da chave primária. Quando o dano atinge as próprias linhas, a leitura falha, e a reconstrução falha junto. Nesse caso, o caminho passa pela cópia preservada, pela exportação do que ainda pode ser lido ou pela restauração.

O espaço em disco

A reconstrução cria uma cópia nova da tabela antes de descartar a antiga e pode precisar de arquivos temporários de ordenação. O espaço livre precisa comportar, pelo menos, os dados e os índices da tabela. O efeito no disco depende de como o InnoDB guarda as tabelas:

  • Com um arquivo por tabela: o arquivo novo substitui o antigo, e o espaço que sobrava dentro da tabela volta para o disco.
  • No arquivo compartilhado ibdata1: a cópia nova ocupa espaço dentro do próprio ibdata1, e esse arquivo nunca diminui. O espaço liberado fica reservado para o InnoDB, e o ibdata1 só encolhe com a exportação de todos os dados e a criação de uma instalação nova.

O arquivo compartilhado é o padrão das versões anteriores ao MySQL 5.6, como a 5.1. Nessas instalações, a reconstrução de uma tabela grande pode fazer o ibdata1 crescer e não devolve espaço ao disco.

Os bloqueios durante a reconstrução

Nas versões antigas, como a 5.1, a reconstrução copia a tabela e impede as gravações durante toda a operação, permitindo apenas as leituras. A partir do MySQL 5.6, a reconstrução de uma tabela InnoDB permite as gravações na maior parte do tempo, com esperas por bloqueio de metadados no início e no fim, que se alongam quando uma transação aberta usa a tabela. Em qualquer versão, a operação disputa o disco e o processamento com a loja.

Antes e depois

Antes da reconstrução, a tabela é preservada, e as medidas de referência são anotadas: a definição, a contagem exata, o maior identificador e o próximo valor do contador. Depois, as mesmas medidas são repetidas, e as buscas da aplicação são conferidas. Um comando concluído não dispensa essa conferência.

No suporte

Antes de reconstruir, convém confirmar se o problema está nas estatísticas, em um índice, nos dados ou nos metadados da aplicação. A reconstrução refaz os índices definidos na tabela, mas não corrige a tabela de controle das ordens nem recalcula as colunas derivadas.

Para guardar

  • O REPAIR TABLE não repara tabelas InnoDB, e a nota de falta de suporte não é um resultado de reparo.
  • O ALTER TABLE com ENGINE=InnoDB e o OPTIMIZE TABLE reconstroem a tabela.
  • O ANALYZE TABLE atualiza as estatísticas e não repara páginas.
  • A reconstrução exige que os dados possam ser lidos e precisa de espaço livre.
  • No arquivo compartilhado ibdata1, a reconstrução não devolve espaço ao disco.
O comando REPAIR TABLE vendas QUICK respondeu que o engine não suporta reparo. A tabela foi reparada?

Não. A resposta informa que o comando não oferece reparo para o InnoDB. O caminho segue pela verificação, pela reconstrução ou pela restauração, conforme o defeito encontrado, e outra opção do mesmo comando não muda esse resultado.

Uma consulta ficou lenta, mas não há erro físico confirmado. É preciso reconstruir a tabela?

Não. O plano da consulta, as estatísticas e as esperas por bloqueio vêm antes. Se as estatísticas explicam a escolha ruim do plano, o ANALYZE TABLE é uma medida menor e suficiente, e a lentidão, sozinha, não prova um dano.

Publicado a partir do Obsidian · FolioPier