Pesquisa de site

Como corrigir tabelas corrompidas no MySQL


Introdução

Ocasionalmente, as tabelas do MySQL podem ser corrompidas, o que significa que ocorreu um erro e os dados contidos nelas são ilegíveis. As tentativas de leitura de uma tabela corrompida geralmente levam ao travamento do servidor.

Algumas causas comuns de tabelas corrompidas são:

  • O servidor MySQL para no meio de uma gravação.
  • Um programa externo modifica uma tabela que está sendo modificada simultaneamente pelo servidor.
  • A máquina foi desligada inesperadamente.
  • O hardware do computador falha.
  • Há um bug de software em algum lugar no código MySQL.

Se você suspeitar que uma de suas tabelas foi corrompida, faça um backup de seu diretório de dados antes de solucionar problemas ou tentar corrigir a tabela. Isso ajudará a minimizar o risco de perda de dados.

Primeiro, pare o serviço MySQL:

  1. sudo systemctl stop mysql

Nota: Em algumas plataformas como Rocky Linux, o serviço MySQL pode ser chamado de mysqld.

Em seguida, copie todos os seus dados para um novo diretório de backup. Em sistemas Ubuntu, o diretório de dados padrão é /var/lib/mysql/:

  1. cp -r /var/lib/mysql /var/lib/mysql_bkp

Depois de fazer o backup, você está pronto para começar a investigar se a tabela está de fato corrompida. Se a tabela usa o mecanismo de armazenamento MyISAM, você pode verificar se ela está corrompida reiniciando o MySQL e executando uma instrução CHECK TABLE no prompt do MySQL:

  1. sudo systemctl start mysql
  1. CHECK TABLE table_name;

Uma mensagem aparecerá na saída desta instrução informando se ela está corrompida ou não. Se a tabela MyISAM estiver realmente corrompida, ela geralmente pode ser reparada emitindo uma instrução REPAIR TABLE:

  1. REPAIR TABLE table_name;

Supondo que o reparo foi bem-sucedido, você verá uma mensagem como esta em sua saída:

Output
+--------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------------------+--------+----------+----------+ | database_name.table_name | repair | status | OK | +--------------------------+--------+----------+----------+

Se a tabela ainda estiver corrompida, a documentação do MySQL sugere alguns métodos alternativos para reparar tabelas corrompidas.

Por outro lado, se a tabela corrompida usar o mecanismo de armazenamento InnoDB, o processo de reparo será diferente. O InnoDB é o mecanismo de armazenamento padrão no MySQL a partir da versão 8.0 e apresenta operações automatizadas de verificação e reparo de corrupção. O InnoDB verifica as páginas corrompidas executando somas de verificação em todas as páginas que lê e, se encontrar uma discrepância na soma de verificação, interromperá automaticamente o servidor MySQL.

Raramente há necessidade de reparar tabelas InnoDB, pois o InnoDB possui um mecanismo de recuperação de travamento que pode resolver a maioria dos problemas quando o servidor é reiniciado. No entanto, se você encontrar uma situação em que precise reconstruir uma tabela InnoDB corrompida, a documentação do MySQL recomenda usar o backup lógico da tabela, que manterá a estrutura da tabela e os dados dentro dela, e em seguida, recarregue a tabela de volta no banco de dados.

Com isso em mente, tente reiniciar o serviço MySQL para ver se isso permitirá o acesso ao servidor:

  1. sudo systemctl restart mysql

Se o servidor permanecer travado ou inacessível, pode ser útil habilitar a opção force_recovery do InnoDB. Você pode fazer isso editando o arquivo mysqld.cnf. Nos sistemas Ubuntu e Debian, este arquivo geralmente está em etc/mysql. Nos sistemas Red Hat e Rocky, este arquivo geralmente está em /etc/my.cnf.d.

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Na seção [mysqld], adicione a seguinte linha:

. . .
[mysqld]
. . .
innodb_force_recovery=1

Salve e feche o arquivo e tente reiniciar o serviço MySQL novamente. Se você conseguir acessar a tabela corrompida com sucesso, use o utilitário mysqldump para despejar os dados da tabela em um novo arquivo. Você pode nomear este arquivo como quiser, mas aqui vamos nomeá-lo out.sql:

  1. mysqldump database_name table_name > out.sql

Em seguida, solte a tabela do banco de dados. Para evitar ter que reabrir o prompt do MySQL, você pode usar a seguinte sintaxe:

  1. mysql -u user -p --execute="DROP TABLE database_name.table_name"

Em seguida, restaure a tabela com o arquivo dump que você acabou de criar:

  1. mysql -u user -p < out.sql

Observe que o mecanismo de armazenamento InnoDB geralmente é mais tolerante a falhas do que o mecanismo MyISAM mais antigo. As tabelas que usam o InnoDB podem ainda ser corrompidas, mas por causa de seus recursos de auto-recuperação, o risco de corrupção de tabelas e travamentos é significativamente menor.