Réparer l’erreur MySQL : Table ‘./ma_base/ma_table’ is marked as crashed and last (automatic?) repair failed

MySQL LogoJ’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!

Vus : 2055
Publié par One More Blog : 26