MySQL REPAIR TABLE, o que fazer quando ele falha.
Author: Ricardo Soares - Postado em: 03/02/2011
Relacionado as categorias: Diversos, Tecnologia | Leave a Comment
Eu costumo dizer que problema é o que não tem solução, sendo assim, se tem solução basta trabalhar pois não temos problema. No documentação oficial da MySQL temos a afirmação de que REPAIR TABLE pode corrigir virtualmente qualquer problema na base de dados e que se ele não conseguir resolver o crash então temos um P* problema.
Eu estava tentando trocar o engine do MySQL de MyISAM para InnoDB e a seguinte mensagem me era apresentada:
mysql> ALTER TABLE mytable ENGINE = InnoDB;
ERROR 1062 (23000): Duplicate entry ‘171-30-2008-12-05 13:34:08-2850795’ for key ‘PRIMARY’
E o engraçado era que se eu tentava fazer uma busca utilizando o primary key que ele havia me informado (comando apresentado abaixo) ele me apresentava apenas um registro:
mysql> SELECT id FROM mytable WHERE id=171 AND acao=30 AND hora=”2008-12-05 13:34:08″ AND usu=2850795;
+—–+———+———————+——+
| id | usu | hora | acao |
+—–+———+———————+——+
| 171 | 2850795 | 2008-12-05 13:34:08 | 30 |
+—–+———+———————+——+
1 row in set (0.11 sec)
Traunquilamente passei o REPAIR TABLE e recebi a seguinte informação
mysql> REPAIR TABLE mytable;
+—————+——–+———-+————————————————————————+
| Table | Op | Msg_type | Msg_text |
+—————+——–+———-+————————————————————————+
| mydb. mytable | repair | info | Duplicate key 1 for record at 71391596 against new record at 70930008 |
| mydb. mytable | repair | error | 121 for record at pos 1428908756 |
| mydb. mytable | repair | status | Operation failed |
+—————+——–+———-+————————————————————————+
3 rows in set (19 min 23.75 sec)
Meu infarte veio quando observei a mensagem “status: Operation failed”! Busca daqui, busca dali e a resposta foi simples, passe o check table e em seguida passe o repair table, fiz isso em uma única linha no MySQL Client do Linux e funcionou, abaixo a saída de tudo:
mysql> SELECT now(); CHECK TABLE mytable; SELECT now(); REPAIR TABLE mytable; SELECT now();
+———————+
| now() |
+———————+
| 2011-02-02 18:00:30 |
+———————+
1 row in set (0.00 sec)
+—————+——-+———-+————————————————————-+
| Table | Op | Msg_type | Msg_text |
+—————+——-+———-+————————————————————-+
| mydb. mytable | check | warning | Table is marked as crashed and last repair failed |
| mydb. mytable | check | warning | Size of indexfile is: 4273693696 Should be: 1658722304 |
| mydb. mytable | check | error | Key in wrong position at page 29761536 |
| mydb. mytable | check | error | Corrupt |
+—————+——-+———-+————————————————————-+
4 rows in set (3 min 3.34 sec)
+———————+
| now() |
+———————+
| 2011-02-02 18:03:33 |
+———————+
1 row in set (0.00 sec)
+—————+——–+———-+—————————————————+
| Table | Op | Msg_type | Msg_text |
+—————+——–+———-+—————————————————+
| mydb. mytable | repair | warning | Number of rows changed from 55353634 to 145257597 |
| mydb. mytable | repair | status | OK |
+—————+——–+———-+—————————————————+
2 rows in set (28 min 59.26 sec)
+———————+
| now() |
+———————+
| 2011-02-02 18:32:32 |
+———————+
1 row in set (0.00 sec)
PS: Notem que passei os “SELECT now()” para contabilizar o procedimento. Não vou comentar o tempo pois o procedimento foi feito em uma máquina de testes e por isto não pode ser levado em conta posto que o ambiente não é exatamente controlado.
Comments
Leave a Reply