Home - www.devmedia.com.br


Verificação e correção de tabelas corrompidas no MySQL

O MySQL tem se mostrado muito estável no que diz respeito a tabelas corrompidas, mas existem algumas situações que podem levar o banco a danificar uma tabela. Os principais fatores que levariam a esta situação seriam a parada inesperada do SGBD (Sistema Gerenciador de Banco de Dados), neste caso se o MySQL estiver escrevendo alguma informação no disco, esta operação pode ser interrompida antes do término acarretando uma inconsistência. Outra possibilidade seria uma falha de hardware, por exemplo uma tabela pode ser armazenada em uma trilha danificada do disco.

Neste artigo apresento as técnicas de detecção e correção de tabelas do MySQL, bem como os procedimentos para a utilização destas ferramentas. Uma boa prática é a realização de uma vistoria periódica da base de dados a fim de detectar eventuais problemas em seus dados. Com isto, é possível detectar uma tabela corrompida e corrigí-la antes que a sua aplicação pare de funcionar por causa deste erro. O MySQL apresenta duas ferramentas para a verificação de tabelas que são o comando CHECK TABLE e o utilitário myisamchk. O primeiro funciona para todos os tipos de tabelas enquanto o segundo, como o próprio nome sugere, só se aplica à tabelas MyISAM.

O comando CHECK TABLE é a forma mais simples para realizar a verificação de dados, já que se aplica a qualquer tipo de tabela e, por ser um comando do MySQL o mesmo é executado de forma atômica, inibindo qualquer tentativa de alteração da tabela durante o processo de verificação. Este comando pode ser utilizado com as seguintes opções:

- QUICK:
Verifica somente a árvore de índices da tabela;

- FAST:
Verifica somente as tabelas que não foram fechadas corretamente, por exemplo, numa queda do SGBD;

- CHANGED:
Verifica somente as tabelas que não foram alteradas desde a última verificação;

- MEDIUM:
Opção padrão (default), verifica a árvore de índices e os apontamentos destes índices para os dados;

- EXTENDED:
Verifica toda a árvore de índices, as ligações dos índices com o dados e o dado propriamente dito.

Observe que à medida que caminhamos nas opções aumentamos a complexidade da verificação, aumentando a capacidade de detecção de problemas. Por outro lado, quanto maior o nível de verificação, maior será o tempo de execução da tarefa. De um modo geral, os problemas com tabelas estão associados aos seus índices, e neste caso, o modo padrão de verificação é suficiente na maioria dos casos. A seguir está ilustrada a execução de uma verificação de 3 tabelas:

mysql> CHECK TABLE Cidade, Pais, Lingua CHANGED;
+---------+-------+----------+-----------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------+-------+----------+-----------------------------------------------+
| Cidade | check | status | OK |
| Pais | check | status | Table is already up to date |
| Lingua | check | warning | Size of indexfile is: 35786 Should be: 35840 |
| Lingua | check | error | Can't read indexpage from filepos: 3072 |
| Lingua | check | error | Corrupt |
+---------+-------+----------+-----------------------------------------------+
5 row in set (0.01 sec)

No exemplo vemos que a tabela Cidade está OK, isto é, não há nenhuma anomalia. A segunda tabela (Pais) retornou a mensagem "Table is already up to date" o que significa dizer que havia algum problema na tabela mas o mesmo já foi corrigido pelo próprio comando de verificação. E por último, percebemos que a tabela Lingua está corrompida, portanto teremos que corrigí-la.

O mesmo procedimento pode ser executado através do utilitário myisamchk, caso a tabela seja do tipo MyISAM. O myisamchk apresenta vários parâmetros de execução e pode ser utilizado para verificação, correção e otimização de tabelas. O detalhe em relação a este utilitário é que ele não se comunica com o servidor fazendo um acesso direto aos arquivos da tabela a ser verificada. Por isto, pode ocorrer problemas de concorrência no dado, que deve ser eliminada através da utilização de um LOCK de leitura na tabela a ser verificada:

mysql>LOCK TABLES Cidade READ, Pais READ, Lingua READ;
....
mysql>UNLOCK TABLES;

A execução do myisamchk para o mesmo problema é ilustrada a seguir, sendo que a opção -C utilizada significa CHANGED. Para obter a lista completa de parâmetros utilize a opção --help.

shell> cd DATADIR
shell>myisamchk -C Cidade, Pais, Lingua

Uma vez detectado o problema na tabela, como é o caso da tabela Lingua do exemplo anterior, é necessário corrigir a estrutura desta tabela. Para a correção de tabelas utilizamos o comando REPAIR TABLE, que pode ser executado em dois modos:

- QUICK
Tenta corrigir apenas a árvore de índices, não manipula os dados da tabela;

- EXTENDED
Serão recriados todos os índices da tabela linha a linha, refazendo os apontamentos destes índices para os dados.

O myisamchk pode ser utilizado para a correção de tabelas ao utilizar-se as opções -r ou -o. A seguir vamos fazer a correção da tabela Lingua através do REPAIR TABLE e do myisamchk:

mysql> CHECK TABLE Lingua;
+----------+-------+----------+----------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+-------+----------+----------------------------------------------+
| Lingua | check | warning | Size of indexfile is: 35786 Should be: 35840 |
| Lingua | check | error | Can't read indexpage from filepos: 3072 |
| Lingua | check | error | Corrupt |
+----------+-------+----------+----------------------------------------------+
3 row in set (0.01 sec)

mysql> REPAIR TABLE Lingua;
+----------+-------+----------+------------+
| Table | Op | Msg_type | Msg_text |
+----------+-------+----------+------------+
| Lingua | repair| status | Ok |
+----------+-------+----------+------------+
1 row in set (0.03 sec)

mysql> CHECK TABLE Lingua EXTENDED;
+----------+-------+----------+-----------+
| Table | Op | Msg_type | Msg_text |
+----------+-------+----------+-----------+
| Lingua | check | status | Ok |
+----------+-------+----------+-----------+
1 row in set (0.03 sec)

shell>cd DATADIR
shell>myisamchk -r Lingua

No exemplo, vimos que a tabela Lingua foi corrigida com sucesso pelo comando REPAIR TABLE, como mostra o comando CHECK TABLE EXTENDED executado na tabela. Portanto, procure verificar as suas tabelas periodicamente, como exemplo, poderíamos criar um script e agendá-lo para fazer a verificação de todas as tabelas do sistema uma vez por semana. Isto poderia ser feito via cron, no caso do Linux ou qualquer agendador de tarefas do SO. Assim, você reduz as possibilidades de a sua aplicação parar por causa de problemas em tabelas.

Abraços e até breve!

Eber M. Duarte

 


Eber Duarte é bacharel em Ciência da Computação, pós-graduado em Engenharia Elétrica e MySQL Professional Certified. Trabalha há 3 anos na EAC Software (BH/MG) como Analista e desenvolvedor de sistemas, atuando especialmente no desenvolvimento de sistemas Web. Atualmente, também é consultor e instrutor do banco de dados MySQL.
Contatos: eber@eacnet.com.br
www.mysqlbrasil.com.br ou www.eacsoftware.com.br

  Otimização do MySQL    
  Novidades da versão 5.0 do MySQL    
  Topologias de replicação no MySQL    
  Replicação de dados no MySQL    
  Como Trabalhar com Tabelas MyISAM Grandes    
  Verificação e correção de tabelas corrompidas no MySQL    
  Backup Online no MySQL    
  Backup e restauração no MySQL    
  Integridade Referencial no MySQL    
  Tabelas do MySQL    
  Gerenciamento de usuários e Controle de Acessos    
  Ferramentas Gráficas Para Modelage    
  Iniciando o Uso do MySQL    
  Boas-Vindas    
     

 

Todos os direitos reservados: DevMedia Group SQL Magazine - 2004