GNU/Linux >> Tutoriels Linux >  >> Linux

Réparation des bases de données MySQL InnoDB

Présentation :
Ce message est une copie du merveilleux message suivant :
https://blackbird.si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/https://blackbird .si/mysql-corrupted-innodb-tables-recovery-step-by-step-guide/

Voici quelques exercices importants :

MySQL – Récupération de tables InnoDB corrompues – Guide étape par étape

Publié dans Bases de données Par Alen Krmelj Le 19 mars 2013, 5-6 minutes

Les tables InnoDB ne sont pas facilement corrompues, mais lorsqu'elles le sont, cela se produit généralement en raison de problèmes matériels, de pannes de courant ou d'un bogue MySQL. Cela vous laisse avec des pages corrompues dans l'espace de table InnoDB et la récupération à partir de cela pourrait être un problème. Lorsque votre MySQL se bloque correctement et ne veut pas revenir, vous pouvez voir une boucle d'erreur similaire :

InnoDB: Assertion failure in thread 1129654592 in file ibuf0ibuf.c line 4231
InnoDB: Failing assertion: page_get_n_recs(page) > 1
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
mysqld got signal 6 ;

This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.
...
some backtrace
...
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
mysqld_safe Number of processes running now: 0
mysqld_safe mysqld restarted

Récupération à partir de tables InnoDB corrompues

Étape 1 – Mettez votre base de données en mode de récupération

Vous devriez supprimer votre base de données. Arrêtez-le au cas où il serait toujours en cours d'exécution et spammerait ces messages dans votre journal. En dernier recours, vous pouvez également tuer le processus. Afin de restaurer votre base de données, vous devrez la démarrer en mode de récupération, avec innodb_force_recovery . Vous devez savoir que ce mode de récupération rend vos bases de données en lecture seule. Les utilisateurs qui s'y connectent ne peuvent pas mettre à jour, insérer ou modifier de toute autre manière les données existantes. Pour éviter que votre MySQL ne soit martelé à la seconde où il revient, je vous suggère également de changer le port du serveur MySQL de 3306 à quelque chose d'aléatoire. Ajouter innodb_force_recovery=1 à votre my.cnf Si votre serveur ne veut pas revenir, vous pouvez encore augmenter ce nombre de 1 à 6, consultez le manuel de MySQL pour voir quelles sont les différences.

Assurez-vous de vérifier vos journaux MySQL, et s'il boucle avec quelque chose comme :

InnoDB: Waiting for the background threads to start

Vous devez également ajouter innodb_purge_threads=0 à votre my.cnf .

Donc tous ensemble pour ramener la base de données, j'ai dû ajouter ces 3 paramètres dans my.cnf :

port = 8881
innodb_force_recovery=3
innodb_purge_threads=0

Étape 2 - Vérifiez quelles tables sont corrompues et faites une liste

Maintenant, votre base de données est sauvegardée et en cours d'exécution, mais en mode de récupération. Vous ne pouvez pas modifier vos bases de données/tables. Si vous l'essayez, vous obtiendrez une erreur :

Got error -1 from storage engine

Nous devons découvrir quelles tables ont été corrompues. Pour ce faire, nous exécutons :mysqlcheck --all-databases

Vérifiez les lignes où il est indiqué que la table est corrompue. Notez toutes les tables / bases de données qui vous ont donné une erreur. Vous aurez besoin de mysqldump en mode de récupération et réimportez-les après avoir redémarré en mode MySQL normal. Permettez-moi également de vous rappeler que innochecksum La commande ne m'a pas aidé à découvrir quelles tables sont corrompues, alors ne vous en souciez pas.

Étape 3 - Sauvegardez et supprimez vos tables corrompues

Une fois que vous avez obtenu la liste des tables corrompues, vous devez mysqldump dans leurs propres fichiers .sql, de cette façon vous aurez une sauvegarde pour la réimportation. Au cas où vous vous demanderiez comment vider une seule table dans la base de données :

mysqldump my_database table> database.table.sql

Une fois que vous avez la sauvegarde, supprimez vos tables corrompues en exécutant :drop table database.table; depuis votre shell MySQL. Vous avez maintenant nettoyé votre base de données MySQL, il est donc temps de la redémarrer sans mode de récupération.

Étape 4 - Redémarrez MySQL en mode normal

Lorsque nous n'avons plus de tables corrompues dans notre base de données, nous devons supprimer les paramètres my.cnf que nous avons ajoutés à l'étape 1. Ne supprimez pas encore le paramètre de port, car il manque toujours à votre base de données les tables que vous avez sauvegardées et dont vous avez besoin. être réimporté. Redémarrez votre MySQL.

Étape 5 - Importer le fichier .sql de sauvegarde

Importez chaque table .sql vidée dans leur base de données respectée. Pour le faire depuis la CLI :

mysql database < database.table.sql

Étape 6 :Changez de porto et prenez une bière

Une fois que vous avez fini d'importer vos tables, vous êtes libre de modifier le paramètre de port dans votre my.cnf . Bien sûr, redémarrez MySQL après. Il devrait revenir et commencer à fonctionner comme avant le crash. Prenez une bière et cliquez en haut de cet article pour me faire savoir que cet article vous a aidé à résoudre votre problème.


Linux
  1. Comment copier des tables MySQL entre des bases de données

  2. MySQL - Conversion en données par table pour InnoDB

  3. Paramètres de connexion pour les bases de données MySQL

  4. Travailler avec les bases de données MySQL cPanel

  5. Utilisez Holland et Cloud Backup pour sauvegarder les bases de données MySQL

Comment importer et exporter des bases de données MySQL sous Linux

Comment afficher une liste de toutes les bases de données dans MySQL

Comment sauvegarder toutes les bases de données MySQL à partir de la ligne de commande

Comment afficher la liste de toutes les bases de données sur MySQL

Comment créer et modifier des bases de données MySQL dans cPanel

Comment résoudre InnoDB :Impossible de verrouiller l'erreur mysql ./ibdata1 ?