En temps normal, MySQL devrai détecter la corruption de l’espace InnoDB lors du démarrage du serveur, et tenter de réparer l’erreur en « rejouant » le contenu présent dans les logs, mais il est courant que cela ne corrige pas totalement la corruption. Avant d’essayer quoique ce soit, il est prudent de faire une copie de sauvegarde de l’état initial. Pour ce faire, il suffit de sauvegarder le contenu du dossier des données de MySQL, dont l’emplacement par défaut est « /var/lib/mysql/
». Il faut dans un premier temps s’assurer que le serveur MySQL soit arrêté, puis utiliser par exemple la commande « tar
» comme ci-dessous :
# tar zcvf mysql-backup.tar.gz /var/lib/mysql/
Une fois l’état initial du serveur sauvegardé, il est temps de démarrer la phase de récupération des données. Pour forcer MySQL à rester actif malgré la corruption de l’espace InnoDB, il est nécessaire de modifier le fichier de configuration du serveur MySQL « /etc/my.cnf », en rajoutant la variable « innodb_force_recovery
» dans la section « [mysqld]
» :
[mysqld] innodb_force_recovery = 1
La variable « innodb_force_recovery
» peut prendre les valeurs de 0 à 6 (0 étant la valeur par défaut indiquant un fonctionnement normal de MySQL). Les valeurs supérieures à 0 sont différents modes de récupérations proposés par MySQL : plus la valeur est faible, moins le risque de corrompre les données est grand (d’où la sauvegarde préalable).
Après avoir défini la valeur de la variable « innodb_force_recovery
» sur 1, il faut démarrer le service MySQL. Le serveur MySQL devrait démarrer, et ne pas s’arrêter. Si le service s’arrête, il faudra augmenter successivement la valeur jusqu’à 6. Si avec la valeur 6 le MySQL ne fonctionne pas, il y a de grandes chances qu’il ne soit pas possible de récupérer les données, c’est pourquoi les sauvegardes régulières sont indispensables.
Si MySQL démarre, il va falloir utiliser la méthode de l’exportation / importation pour pouvoir récupérer les données. Cette méthode permettra de récupérer l’ensemble des enregistrements valides présent dans les tables du serveur. Pour optimiser la création de l’export des données, l’utilisation de l’option « --opt
» de la commande « mysqldump
» est fortement recommandée. Voici un exemple de la commande à utiliser :
# mysqldump --user=<utilisateur> --password --opt --all-databases --result-file=dump.sql
Une fois l’export des données terminé, il est nécessaire de désactiver le mode de récupération en supprimant la variable « innodb_force_recovery
» dans la section « [mysqld]
» du fichier « /var/lib/mysql/
».
Il faut à présent arrêter MySQL, supprimer l’espace InnoDB et enfin le recréer en démarrant MySQL :
# service mysql stop # rm /var/lib/mysql/ib* # service mysql start
Supprimer l’ensemble de l’espace InnoDB peut paraître radical, mais elle permet de repartir sur un espace de stockage InnoDB sain.
Il ne reste plus qu’à réimporter les données récupérée précédemment :
# mysql --user=<utilisateur> --password < dump.sql
L’import des données InnoDB est assez long en raison des fonctionnalités de ce moteur, il est possible que vous ayez à vous armer de patience pendant l’import des données selon le nombre de lignes et la taille des données. Si tout se passe bien, un maximum de données aura été récupéré.