Réparer l’erreur MySQL : Table ‘./ma_base/ma_table’ is marked as crashed and last (automatic?) repair failed
J’ai sur mon serveur une tâche Cron qui met à jour mes flux RSS toutes les 15 minutes dans la base de données MySQL de RssLounge. Or, après une mise à jour de certains paquets de ma Ubuntu Server 10.04 (dont MySQL), plus moyen d’accéder à la table dans laquelle sont stockés ces flux. Que ce soit depuis l’application RssLounge ou depuis la ligne de commande, MySQL me renvoie l’erreur suivante :
Table ‘./ma_base/ma_table’ is marked as crashed and last (automatic?) repair failed
Ceci est tout simplement dû au fait que des opérations d’insertion sur cette table étaient en cours d’exécution au moment où la procédure de mise à jour a arrêté le service MySQL. Le fichier contenant les enregistrements, ma_table.MYI, est donc corrompu. Il existe cependant une procédure de réparation assez simple grâce à l’outil myisamchk présent avec l’installation de MySQL. Comme vous l’aurez compris, cette procédure n’est valable que pour les tables de type MyISAM.
Dans un premier temps, nous allons couper les services d’Apache et MySQL de façon à ne pas créer de nouveaux conflits durant la procédure de réparation.
$ sudo /etc/init.d/apache2 stop $ sudo /etc/init.d/mysql stop
Nous allons ensuite vérifier que le fichier que nous souhaitons réparer contient bien des erreurs (en gros, qu’on a bien choisi le fichier corrompu) :
$ sudo myisamchk /var/lib/mysql/ma_base/ma_table.MYI Data records: 4945 Deleted blocks: 0 myisamchk: warning: Table is marked as crashed and last repair failed - check file-size myisamchk: warning: Size of indexfile is: 602112 Should be: 53248 - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 myisamchk: error: Found 4943 keys of 4945 - check record links myisamchk: error: Record-count is not ok; is 4943 Should be: 4945 myisamchk: warning: Found 1870736 deleted space. Should be 0 myisamchk: warning: Found 971 deleted blocks Should be: 0 myisamchk: warning: Found 9665 key parts. Should be: 4943 MyISAM-table '/var/lib/mysql/ma_base/ma_table.MYI' is corrupted Fix it using switch "-r" or "-o"
Maintenant que nous sommes sûr qu’il s’agit de ce fichier, nous allons tout simplement tenter la procédure de réparation. La première chose à essayer (qui a fonctionné pour moi) est l’option « -r » ou « –recover ». Il s’agit d’une méthode de réparation efficace qui corrige à priori la majorité des problèmes de corruption dans une table. Dans le cas où cette méthode échouerai, l’option « -o » ou « –safe-recover » peut être tentée. On a donc :
$ sudo myisamchk -r /var/lib/mysql/ma_base/ma_table.MYI - recovering (with sort) MyISAM-table '/var/lib/mysql/ma_base/ma_table.MYI' Data records: 4945 - Fixing index 1 - Fixing index 2 - Fixing index 3 - Fixing index 4 - Fixing index 5 - Fixing index 6 Data records: 4943
Et on vérifie :
sudo myisamchk /var/lib/mysql/ma_base/ma_table.MYI Checking MyISAM file: /var/lib/mysql/ma_base/ma_table.MYI Data records: 4943 Deleted blocks: 0 - check file-size - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 - check data record references index: 2 - check data record references index: 3 - check data record references index: 4 - check data record references index: 5 - check data record references index: 6 - check record links
Enfin, on relance Apache et MySQL :
$ sudo /etc/init.d/mysql start $ sudo /etc/init.d/apache2 start
Et si tout va bien, tout refonctionne comme si de rien n’était!