Restaurer l’espace InnoDB MySQL

MySQL - Contenu des logs lorsque l'espace InnoDB est corrompu

MySQL – Contenu des logs lorsque l’espace InnoDB est corrompu

« MySQL server has gone away » et « Lost connection to MySQL server during query » sont les messages que le gestionnaire d’un serveur MySQL appréhende de rencontrer, surtout lorsque l’essentiel des tables utilisent le moteur de stockage InnoDB. InnoDB est un moteur de stockage intéressant en ce qui concerne ses fonctionnalités, mais qui rends inutilisable l’ensemble du serveur MySQL dès lors que l’espace de stockage est corrompu. Le service s’arrêtera de fonctionner dès lors qu’une corruption sera détectée.

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é.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.