Après une panne de serveur (Ubuntu 16.04), lorsque j'essaie de démarrer Mysql (Mysql 5.7) en utilisant innodb_force_recovery=0
il ne démarre pas et error.log affiche:
InnoDB: Checksum mismatch in datafile: ./panel_financiero_v2/kpis_analytics.ibd, Space ID:93, Flags: 33. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html for how to resolve the issue.
InnoDB: Corrupted page [page id: space=93, page number=0] of datafile './panel_financiero_v2/kpis_analytics.ibd' could not be found in the doublewrite buffer.
InnoDB: Tablespace 93 was not found at ./panel_financiero_v2/kpis_analytics.ibd.
InnoDB: Set innodb_force_recovery=1 to ignore this and to permanently lose all changes to the tablespace.
InnoDB: Cannot continue operation.
Je peux juste démarrer Mysql en utilisant innodb_force_recovery=6
(Je ne peux pas démarrer Mysql en utilisant innodb_force_recovery = 1 comme le message d'erreur le conseille). Les fichiers .ibd et .frm de la table en difficulté se trouvent dans le bon répertoire (pas de fichiers vides); J'ai même essayé (juste au cas où, sans réel espoir) de supprimer ces deux fichiers (en les déplaçant vers un autre répertoire) mais cela ne fonctionne pas non plus.
Est-il possible de réparer ou de récupérer la table (en gardant à l'esprit que innodb_force_recovery = 6 démarre Mysql en mode lecture seule et je ne peux même pas créer une nouvelle table)? De toute façon, au moins, pour démarrer mysql normalement (avec innodb_force_recovery=0
) même perdre les informations de cette table troublée?
https://dev.mysql.com/doc/refman/5.7/en/repair-table.html dit:
REPAIR TABLE fonctionne pour les tables MyISAM, ARCHIVE et CSV.
En d'autres termes, REPAIR TABLE ne fait rien pour InnoDB. InnoDB a son propre récupération automatique après incident qu'il s'exécute au démarrage.
Mais la récupération après incident d'InnoDB ne fonctionne que pour les modifications perdues qui étaient en cours au moment de l'accident. Il utilise le journal de rétablissement et le tampon de double écriture pour reconstruire les pages sales perdues. Ce processus ne peut pas reconstruire des données corrompues au repos.
Le message d'erreur vous indique en fait quoi faire:
InnoDB: définissez innodb_force_recovery = 1 pour ignorer cela et pour perdre définitivement toutes les modifications apportées à l'espace disque logique.
Lisez plus de détails sur https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html :
1 (SRV_FORCE_IGNORE_CORRUPT) Permet au serveur de s'exécuter même s'il détecte une page corrompue. Tente de faire sauter SELECT * FROM tbl_name sur les enregistrements et les pages d'index corrompus, ce qui aide à vider les tables.
Démarrez le serveur avec innodb_force_recovery=1
après avoir replacé vos fichiers d'espace de table à leur place.
Ensuite, vous pouvez vider la table à l'aide de mysqldump
, et elle devrait lire les pages qu'elle peut lire, en ignorant les pages corrompues. Ensuite, vous pouvez créer une nouvelle table à importer à partir du vidage:
CREATE TABLE mytable_new LIKE mytable;
RENAME TABLE mytable TO mytable_bad, mytable_new TO mytable;
Réimportez ensuite vos données sauvegardées.
Je suppose que vous n'avez pas besoin d'aide pour vider une seule table et importer le fichier de vidage.
Re votre commentaire:
Il semble que vous ayez une corruption plus étendue. Je suggère les étapes suivantes:
innodb_force_recovery=6
mysqldump
pour vider toutes les données.mysqldump
.Nous avons eu le même problème dans un appareil Bitnami Wordpress. Nous avons recherché de nombreux sites Web et procédures pour résoudre ce problème. Aucun des articles, blogs et articles recherchés n'avait la solution dont nous avions besoin, mais nous avons pu de reconstituer les éléments suivants.
consulter le fichier journal:
cd/opt/bitnami/mysql tail -400 mysqld.log
ERREURS INSCRITES:
[ERROR] [MY-012224] [InnoDB] Checksum mismatch in datafile: ./bitnami_wordpress/wp_redirection_404.ibd
[ERROR] [MY-012237] [InnoDB] Corrupted page [page id: space=2126, page number=0] of datafile './bitnami_wordpress/wp_redirection_404.ibd' could not be found in the doublewrite buffer.
[ERROR] [MY-013183] [InnoDB] Assertion failure: fil0fil.cc:5551:err == DB_SUCCESS || err == DB_INVALID_ENCRYPT
Identifier le problème et l'objet associé:
data/bitnami_wordpress/wp_redirection_404.ibd
Supprimer le fichier problème:
mv data/bitnami_wordpress/wp_redirection_404.ibd/tmp /.
Modifiez le fichier de configuration pour démarrer MySQL en ignorant les erreurs:
vi /opt/bitnami/mysql/my.cnf
-- ajouter 'innodb_force_recovery = 1
'à la fin de la section " [mysqld] "
Démarrez MySQL en mode de récupération:
/opt/bitnami/ctlscript.sh démarrer mysql
/opt/bitnami/ctlscript.sh status MySQL
Modifiez le fichier de configuration pour démarrer MySQL en mode NORMAL:
vi /opt/bitnami/mysql/my.cnf
- supprimez 'innodb_force ...' de la section " [mysqld] "
Redémarrez MySQL pour vérifier qu'il démarre correctement:
/opt/bitnami/ctlscript.sh démarrer mysql
/opt/bitnami/ctlscript.sh status MySQL
Vérifiez Wordpress s'affiche correctement: accédez à http://websiteurl.company.com
Restaurez la base de données MySQL à partir des dernières sauvegardes:
--Effacer la base de données MySQL locale
cd /opt/bitnami/mysql/data/${dbname} ; /home/bitnami/blankwpdb.sh ${dbname} ${dbuser}
--Restaurer la base de données MySQL à partir de la sauvegarde principale
cd /opt/bitnami/mysql/data/${dbname} ; cat ${current_mysql_bkup} | /opt/bitnami/mysql/bin/mysql -u ${dbuser} -p${dbpw} ${dbname}
--Redémarrez les services MySQL et Apache HTTP
/opt/bitnami/mysql/scripts/ctl.sh restart
/opt/bitnami/Apache2/scripts/ctl.sh restart
=====/blankwpdb.sh======
#!/bin/bash
EXPECTED_ARGS=2
E_BADARGS=65
MYSQL=`which mysql`
dbpw=`grep DB_PASSWORD /opt/bitnami/apps/wordpress/htdocs/wp-config.php | cut -d \' -f 4`
C1="DROP DATABASE IF EXISTS $1;"
C2="CREATE DATABASE $1;"
COMMANDS="${C1}${C2}"
if [ $# -ne $EXPECTED_ARGS ]
then
echo "Usage: $0 dbname dbadmin"
exit $E_BADARGS
fi
$MYSQL -u$2 -p$dbpw -e "$COMMANDS"
Accédez à http://websiteurl.company.com
J'espère que cela aidera quiconque continue de vivre ce problème particulier maintenant ou à l'avenir.