Je suis allé travailler dans l'après-midi et j'ai été choqué d'apprendre qu'il y avait un problème avec mon site Web dedecms. Lorsque je l'ai visité, j'ai trouvé une erreur en plein écran. J'ai vérifié le journal MySQL et le message d'erreur était :
Tableau '.. dedecmsv4dede_archives' est marqué comme étant en panne et doit être réparé.
Il indique cms. La table d'articles dede_archives est marquée comme problématique et doit être réparée. J'ai donc rapidement restauré les données historiques et je suis allé en ligne pour découvrir la cause. Le problème finira par être résolu. La solution est la suivante :
Recherchez l'outil bin/myisamchk dans le répertoire d'installation de mysql, et saisissez dans la ligne de commande :
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
Ensuite, l'outil myisamchk vous aidera à restaurer l'index du tableau de données. Redémarrez MySQL et le problème est résolu.
Analyse du problème :
1. La cause de l'erreur. Certains internautes ont déclaré qu'il s'agissait d'une erreur d'index causée par des interrogations et des mises à jour fréquentes de la table dede_archives. Parce que ma page n'était pas générée de manière statique, mais une page dynamique, je suis tout à fait d'accord avec cette affirmation. . On dit également que la base de données MYSQL a été endommagée pour une raison quelconque. Par exemple, une panne de courant soudaine du serveur de base de données, une opération sur le fichier d'origine de la table lors de la fourniture de services à la table de base de données peut entraîner le dysfonctionnement de la base de données MYSQL. endommagé. La table est corrompue et les données ne peuvent pas être lues. Bref, la montre est endommagée à cause de problèmes insondables.
Le numéro du problème est 145
2. Solution au problème.
Lorsque vous essayez de réparer un problème de table corrompue, il existe trois types de réparations. Si vous recevez un message d'erreur indiquant qu'un fichier temporaire ne peut pas être créé, supprimez le fichier indiqué par le message et réessayez - il s'agit généralement d'un vestige d'une opération de réparation précédente.
Les trois correctifs sont les suivants :
% myisamchk --recover --quick /path/to/tblName
% myisamchk --recover /path/to/tblName
% myisamchk --safe-recover /path/to/tblName
Le premier est le plus rapide et est utilisé pour résoudre les problèmes les plus courants ; le dernier est le plus lent et est utilisé pour résoudre les problèmes qui ne peuvent pas être résolus par d’autres méthodes.
Vérification et réparation des fichiers de données MySQL Si les méthodes ci-dessus ne parviennent pas à réparer une table endommagée, avant d'abandonner, vous pouvez également essayer ces deux conseils :
Si vous pensez qu'une erreur irréparable s'est produite dans le fichier d'index (*.MYI) de la table, ou même que le fichier est perdu, vous pouvez utiliser le fichier de données (*.MYD) et le fichier de format de données (*.frm) pour régénérez-le. Faites d'abord une copie du fichier de données (tblName.MYD). Redémarrez votre service MySQL et connectez-vous à celui-ci. Utilisez la commande suivante pour supprimer le contenu de la table :
mysql> DELETE FROM nom de table ;
Lors de la suppression du contenu de la table, un nouveau fichier d'index sera créé. Déconnectez-vous et fermez à nouveau le service, puis écrasez le nouveau fichier de données (vide) par le fichier de données que vous venez d'enregistrer (tblName.MYD). Enfin, utilisez myisamchk pour effectuer une réparation standard (la deuxième méthode ci-dessus) afin de régénérer les données d'index en fonction du contenu des données de la table et du fichier de format de la table.
Si le fichier de format de votre table (tblName.frm) est manquant ou présente une erreur irréparable, mais que vous savez comment utiliser l'instruction CREATE TABLE correspondante pour régénérer la table, vous pouvez régénérer un nouveau fichier .frm et l'utiliser avec vos fichiers de données. et les fichiers d'index (s'il y a un problème avec le fichier d'index, utilisez la méthode ci-dessus pour en reconstruire un nouveau). Faites d'abord une copie des fichiers de données et d'index, puis supprimez les fichiers originaux (supprimez tous les enregistrements liés à cette table dans le répertoire de données).
Démarrez le service MySQL et créez une nouvelle table à l'aide du fichier CREATE TABLE d'origine. Le nouveau fichier .frm devrait fonctionner correctement, mais il est préférable d'effectuer une réparation standard (la deuxième méthode ci-dessus).
3. Introduction à l'outil myisamchk (voir le manuel officiel de mysql
Vous pouvez utiliser l'utilitaire myisamchk pour obtenir des informations sur les tables de la base de données ou pour les vérifier, les réparer et les optimiser). myisamchk s'applique aux tables MyISAM (tables correspondant aux fichiers .MYI et .MYD).
Méthode pour appeler myisamchk :
shell> myisamchk [options] tbl_name ...
options spécifie ce que vous voulez que myisamchk fasse. Ils sont décrits plus loin. Vous pouvez également obtenir une liste d'options en appelant myisamchk --help.
tbl_name est la table de base de données que vous souhaitez vérifier ou réparer. Si vous n'exécutez pas myisamchk quelque part dans le répertoire de la base de données, vous devez spécifier le chemin d'accès au répertoire de la base de données car myisamchk ne sait pas où se trouve votre base de données. En fait, myisamchk ne se soucie pas de savoir si le fichier sur lequel vous travaillez se trouve dans un répertoire de base de données ; vous pouvez copier le fichier correspondant à la table de la base de données ailleurs et y effectuer l'opération de restauration.
Si vous le souhaitez, vous pouvez utiliser la ligne de commande myisamchk pour nommer plusieurs tables. Vous pouvez également spécifier une table en nommant le fichier d'index (avec le suffixe ".MYI"). Il vous permet de spécifier toutes les tables d'un répertoire en utilisant le schéma "*.MYI". Par exemple, si vous êtes dans le répertoire de la base de données, vous pouvez vérifier toutes les tables MyISAM du répertoire comme ceci :
shell> myisamchk *.MYI
Si vous n'êtes pas dans le répertoire de la base de données, vous pouvez y vérifier toutes les tables en spécifiant le chemin d'accès au répertoire :
shell> myisamchk /path/to/database_dir/*.MYI
Vous pouvez même vérifier toutes les tables de toutes les bases de données en spécifiant un caractère générique pour le chemin d'accès au répertoire de données MySQL :
shell> myisamchk /path/to/datadir/*/*.MYI
La méthode recommandée pour vérifier rapidement toutes les tables MyISAM est la suivante :
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
Si vous souhaitez vérifier toutes les tables MyISAM et réparer les tables corrompues, vous pouvez utiliser la commande suivante :
shell> myisamchk --silent --force --fast --update-state
-O tampon_clé=64M -O tampon_tri=64M
-O read_buffer=1M -O write_buffer=1M
/chemin/vers/datadir/*/*.MYI
Cette commande suppose que vous disposez de plus de 64 Mo de mémoire libre. Pour plus de détails sur l'allocation de mémoire avec myisamchk, voir Section 5.9.5.5, « Utilisation de la mémoire myisamchk ».
Lorsque vous exécutez myisamchk, vous devez vous assurer que d'autres programmes n'utilisent pas la table. Sinon, lorsque vous exécutez myisamchk, le message d'erreur suivant s'affichera :
avertissement : les clients utilisent ou n'ont pas fermé la table correctement.
Cela indique que vous essayez de vérifier une table qui est mise à jour par un autre programme (tel que le serveur mysqld) qui n'a pas fermé le fichier ou qui s'est terminé sans fermer le fichier correctement.
Si mysqld est en cours d'exécution, vous devez forcer le vidage de toutes les modifications de table encore en mémoire via FLUSH TABLES. Lorsque vous exécutez myisamchk, vous devez vous assurer que d'autres programmes n'utilisent pas la table. Le moyen le plus simple d'éviter le problème est d'utiliser CHECK TABLE au lieu de myisamchk pour vérifier la table.