J'ai quelques tables qui sont partitionnées et ont plusieurs index sur un esclave répliqué. Après avoir copié l'instantané (vérifié en toute sécurité) sur un nouvel esclave et mis à niveau mysqld de 5.1.42 à 5.5.15 et redémarré la réplication, je reçois des plantages d'InnoDB avec le message d'erreur "Pointeur invalide ..."
Ces erreurs se sont produites sur 2 serveurs avec du matériel et des O / S différents. Après l'exécution:
ALTER TABLE .... COALESCE PARTION n;
le problème disparaît pour cette table.
Ma question est plus large, cependant, et c'est "Comment identifiez-vous la corruption de la table InnoDB?" ou reformulé "Comment évaluez-vous la santé de la table InnoDB?" Est « CHECK TABLE » le seul outil disponible pour identifier les problèmes pré-crash?
Je ne sais pas si cela importe, mais les plantages se sont produits en cours d'exécution: Version: socket '5.5.15-55-log': port '/opt/mysql.sock': 3306 Percona Server (GPL), Release rel21.0, Revision 158
la source
Réponses:
Morgan donne un indice dans son commentaire qu'InnoDB vérifie constamment les pages corrompues en faisant des sommes de contrôle sur les pages qu'il lit. Si InnoDB trouve une différence de somme de contrôle, il se
bloquerarrêter le serveur.Si vous souhaitez accélérer ce processus (au lieu d'attendre qu'InnoDB lise la page corrompue), vous pouvez utiliser
innochecksum
:Une mise en garde intéressante:
Alors oui, pour une table en ligne
CHECK TABLE
est probablement l'outil (ou comme indiqué dans une autre réponsemysqlcheck
si vous voulez faire plus d'une seule base de données à la fois.)Si vous pouvez fermer votre base de données, vous pouvez forcer la somme de contrôle à l'aide
innochecksum
Anecdotique: sur un tablespace innodb de 29 Go (avec
innodb_file_per_table=1
), ce script a pris environ 2 minutesEn bonus, cependant, puisque vous exécutez Percona, ils ont implémenté une nouvelle méthode pour la somme de contrôle innodb rapide . Je ne l'ai jamais utilisé, mais cela pourrait accélérer le processus.
la source
AVERTISSEMENT: avant d'essayer l'une de ces instructions, il est fortement recommandé de vérifier qu'il existe une sauvegarde saine de votre base de données entre les mains, au cas où. (merci à @Nick pour l'avertissement)
Essayez d'utiliser la
mysqlcheck
commande. Sur un terminal:Cette commande affichera une liste de toutes les tables et un état vous indiquant s'il y a eu une sorte de corruption:
Avec cela en main, vous saurez déjà quelles tables vous devez réparer. Juste au cas où vous voudriez tout réparer en même temps:
En savoir plus sur
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.htmlRemarque: vous avez tagué votre question avec percona . Je n'avais aucune idée de ce que c'était, alors j'ai googlé. Cela semble être un fork de MySQL, mais je n'ai aucune raison de croire que les commandes sont incompatibles (doigts croisés).
Quelqu'un m'a indiqué ce guide qui contient des instructions plus spécifiques pour la récupération de la base de données InnoDB pour les situations plus critiques où la base de données entière ne démarre pas: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html
la source
CHECK TABLE
. La documentation que vous avez lié aux Etats: "mysqlcheck
utilise les instructions SQLCHECK TABLE
,REPAIR TABLE
,ANALYZE TABLE
etOPTIMIZE TABLE
il détermine les déclarations à utiliser pour l'opération que vous souhaitez effectuer d'une manière pratique pour l'utilisateur, et envoie ensuite les instructions au serveur à exécuter.. " Ce n'est pas un synonyme; c'est une interface utilisateur pour une collection d'instructions.Selon le guide d'étude de certification MySQL 5.0, page 443 444, section 30.4 :
Veuillez lire MySQL Docs sur InnoDB Forced Recovery
la source
Je me demande ce qui se passe si quelqu'un utilise les données InnoDB créées via le plug-in InnoDB et passe ensuite à une autre version d'InnoDB. Cela pourrait créer une possible corruption de page aux yeux de mysqld.
Notez ce que dit la documentation MySQL sur le format de fichier InnoDB à propos de cette possibilité:
Je ferais disparaître les données de l'esclave. En fait, je voudrais simplement utiliser la force brute en obtenant un vidage logique (mysqldump) des données:
Ma réponse originale publiée est considérée comme de la «vieille école». Pourtant, dans ce cas, j'examinerais certainement les formats de fichiers utilisés par .ibd et / ou ibdata1.
la source