Comment réparer les tables corrompues dans MySQL

Note

Il arrive parfois que des tables MySQL soient corrompues, ce qui signifie qu’une erreur s’est produite et que les données qu’elles contiennent sont illisibles. Toute tentative de lecture à partir d'une table corrompue entraînera généralement le blocage du serveur.

Les causes les plus courantes de tables corrompues sont les suivantes:

  • Le serveur MySQL s’arrête au milieu d’une écriture.

  • Un programme externe modifie une table simultanément modifiée par le serveur.

  • La machine est arrêtée de manière inattendue.

  • Le matériel informatique échoue.

  • Il y a un bug logiciel quelque part dans le code MySQL.

Si vous pensez que l'une de vos tables a été corrompue, vous devez effectuer une sauvegarde de votre répertoire de données avant de dépanner ou de tenter de réparer la table. Cela aidera à minimiser le risque de perte de données.

Tout d’abord, arrêtez le service MySQL:

sudo systemctl stop mysql

Copiez ensuite toutes vos données dans un nouveau répertoire de sauvegarde. Sur les systèmes Ubuntu, le répertoire de données par défaut est/var/lib/mysql/:

cp -r /var/lib/mysql /var/lib/mysql_bkp

Une fois la sauvegarde effectuée, vous êtes prêt à commencer à rechercher si la table est réellement corrompue. Si la table utilise lesMyISAM storage engine, vous pouvez vérifier si elle est corrompue en exécutant une instructionCHECK TABLE à partir de l'invite MySQL:

CHECK TABLE table_name;

Un message apparaîtra dans la sortie de cette instruction pour vous indiquer si elle est corrompue ou non. Si la table MyISAM est effectivement corrompue, elle peut généralement être réparée en émettant une instructionREPAIR TABLE:

REPAIR TABLE table_name;

En supposant que la réparation soit réussie, vous verrez un message tel que le suivant dans votre sortie:

Output+--------------------------+--------+----------+----------+
| Table                    | Op     | Msg_type | Msg_text |
+--------------------------+--------+----------+----------+
| database_name.table_name | repair | status   | OK       |
+--------------------------+--------+----------+----------+

Si la table est toujours corrompue, la documentation MySQL suggère quelquesalternative methods for repairing corrupted tables.

D'un autre côté, si la table corrompue utilise lesInnoDB storage engine, le processus de réparation sera différent. À partir de la version 5.5, InnoDB est le moteur de stockage par défaut dans MySQL. Il comporte des opérations automatisées de vérification et de réparation de la corruption. InnoDB recherche les pages corrompues en effectuant des sommes de contrôle sur chaque page lue. S'il détecte une différence de somme de contrôle, le serveur MySQL sera automatiquement arrêté.

Il est rarement nécessaire de réparer les tables InnoDB, car InnoDB dispose d'un mécanisme de récupération après incident qui peut résoudre la plupart des problèmes lorsque le serveur est redémarré. Cependant, si vous rencontrez une situation où vous devez reconstruire une table InnoDB corrompue, la documentation MySQL recommande d'utiliser les“Dump and Reload” method. Cela implique de regagner l'accès à la table corrompue, en utilisant l'utilitairemysqldump pour créer unlogical backup de la table, qui conservera la structure de la table et les données qu'elle contient, puis en rechargeant la table dans la base de données .

Dans cet esprit, essayez de redémarrer le service MySQL pour voir si cela vous permettra d'accéder au serveur:

sudo systemctl restart mysql

Si le serveur reste en panne ou inaccessible, il peut être utile d’activer l’optionforce_recovery d’InnoDB. Vous pouvez le faire en éditant le fichiermysqld.cnf:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Dans la section[mysqld], ajoutez la ligne suivante:

/etc/mysql/mysql.conf.d/mysqld.cnf

. . .
[mysqld]
. . .
innodb_force_recovery=1

Enregistrez et fermez le fichier, puis essayez de redémarrer le service MySQL. Si vous parvenez à accéder à la table corrompue, utilisez l'utilitairemysqldump pour vider les données de votre table dans un nouveau fichier. Vous pouvez nommer ce fichier comme vous le souhaitez, mais ici nous le nommeronsout.sql:

mysqldump database_name table_name > out.sql

Ensuite, supprimez la table de la base de données. Pour éviter de devoir rouvrir l'invite MySQL, vous pouvez utiliser la syntaxe suivante:

mysql -u user -p --execute="DROP TABLE database_name.table_name"

Ensuite, restaurez la table avec le fichier de vidage que vous venez de créer:

mysql -u user -p < out.sql

Notez que le moteur de stockage InnoDB est généralement plus tolérant aux pannes que l'ancien moteur MyISAM. Les tables utilisant InnoDBcan sont toujours corrompues, mais en raison de sesauto-recovery features, le risque de corruption de table et de plantages est nettement plus faible.