Que faire quand MySQL renvoie le code d'erreur #1017 ?
#1017 - Can't find file: 'ma_table' (errno: 2)MySQL n'arrive pas à ouvrir l'un des fichiers de la structure d'une table MyISAM.
Un check de la table nous confirme le problème :
mysql> check table ma_table;
+-------------------+-------+----------+----------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+-------+----------+----------------------------------------+
| ma_base.ma_table | check | Error | Can't find file: 'ma_table' (errno: 2) |
| ma_base.ma_table | check | status | Operation failed |
+-------------------+-------+----------+----------------------------------------+
2 rows in set (0.00 sec)
Rappel de la structure physique des tables MyISAM
Sur le plan physique, une table MyISAM est constituée de 3 fichiers :- La définition de la table : 'tbl_name.frm'
- le fichier contenant les données 'tbl_name.MYD'
- le fichier contenant les index 'tbl_name.MYI'
Réparer un table MyISAM corrompue
Comme le fichier *.MYI n'existe plus, on ne pourra pas utiliser l'utilitaire Myisamchk pour réparer cette table.
A la place, on utilisera la commande "REPAIR TABLE" de MySQL avec le mode "USE_FRM".
Ce mode est très utile dans le cas où, justement le fichier .MYI est manquant, ou erroné (entête corrompu par exemple).
Avec ce mode, MySQL va recréer intégralement le fichier d'index.MYI, en utilisant les informations du fichier .frm de la table et les données disponibles dans le fichier .MYD.
Syntaxe de la commande:
REPAIR TABLE tbl_name[,tbl_name...] [EXTENDED] [USE_FRM]
Test de réparation sur une table corrompue
mysql> repair table ma_table USE_FRM;
+-------------------+--------+----------+-------------------------------------+
| Table | Op | Msg_type | Msg_text |
+-------------------+--------+----------+-------------------------------------+
| ma_base.ma_table | repair | warning | Number of rows changed from 0 to 14 |
| ma_base.ma_table | repair | status | OK |
+-------------------+--------+----------+-------------------------------------+
2 rows in set (0.01 sec)
La réparation est un succès !
Un check de la table nous le confirme :
mysql> check table ma_table;
+-------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+-------+----------+----------+
| ma_base.ma_table | check | status | OK |
+-------------------+-------+----------+----------+
1 row in set (0.00 sec)
Cette démarche est très utile. mais lorsque le problème se pose pour de nombreuses tables, il faut industrialiser le processus.
Réparer un ensemble de table MyISAM corrompues
On va écrire un petit script basé sur le procédé que l'on vient de décrire.Ce scritp pourra être lancé directement depuis l'arborescence de MySQL.
A noter que le Serveur MySQL doit être en fonctionnement.
for i in `ls *.frm`
do
# On récupère le nom de la table à partir du nom du fichier *.frm
l=${#i}-4;
n=${i:0:l};
echo $n;
# On lance la réparation et le check
mysql -u root -pxxxxx -D YYYY -B -e "-- REPAIR TABLE $n USE_FRM; CHECK TABLE $n";
# avec :
# -B : Mode batch - Pas d'historique
# -e : Execute la requete et quitte
done
La ligne de commande renvoie les résultats de l'opération :
ma_base.autre_table repair warning Number of rows changed from 0 to 73364
ma_base.autre_table repair status OK
ma_base.autre_table check status OK
Well done !
Il ne reste plus qu'a vérifier que tout s'est bien passé et finaliser les dernier détails comme régler la valeur de l'auto-incrément, perdu dans la bataille...
Puis on lance un optimize sur toute les tables
Reprendre le code et remplace la ligne de réparation par :
mysql -u root -pxxxxx -D YYYY -B -e "-- OPTIMIZE TABLE $n ;";
+----------------------+-------+----------+----------+
| ma_base.autre_table | check | status | OK |
+----------------------+-------+----------+----------+
Pour finir, on recharge toutes les tables à l'aide de Flush tables;
On peut également finir l'opération par un restart du serveur MySQL!
Have Fun !
Liens :
- http://dev.mysql.com/doc/refman/5.0/fr/repair.html
- http://dev.mysql.com/doc/refman/5.0/fr/repair-table.html
Aucun commentaire:
Enregistrer un commentaire