web-dev-qa-db-fra.com

Ne démarre pas: InnoDB: page corrompue ... L'espace disque logique est introuvable

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?

5
Felipe Alonso

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:

  1. Démarrez le serveur MySQL avec innodb_force_recovery=6
  2. Utilisez mysqldump pour vider toutes les données.
  3. Arrêtez le serveur MySQL.
  4. Sauvegardez le contenu de votre datadir juste au cas où vous voudriez obtenir de l'aide professionnelle pour voir s'ils peuvent récupérer plus de données. Essayez https://twindb.com , ce sont les meilleurs experts en récupération de base de données MySQL.
  5. Initialisez un nouveau datadir (j'utiliserais un nouveau périphérique de disque et mettrais l'ancien hors service car il a maintenant des dommages inconnus).
  6. Restaurez le vidage de données que vous avez créé avec mysqldump.
9
Bill Karwin

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.

  1. 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 
  1. Identifier le problème et l'objet associé:

    data/bitnami_wordpress/wp_redirection_404.ibd

  2. Supprimer le fichier problème:

    mv data/bitnami_wordpress/wp_redirection_404.ibd/tmp /.

  3. 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] "

  1. Démarrez MySQL en mode de récupération:

    /opt/bitnami/ctlscript.sh démarrer mysql

    /opt/bitnami/ctlscript.sh status MySQL

  2. 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] "

  1. Redémarrez MySQL pour vérifier qu'il démarre correctement:

    /opt/bitnami/ctlscript.sh démarrer mysql

    /opt/bitnami/ctlscript.sh status MySQL

  2. Vérifiez Wordpress s'affiche correctement: accédez à http://websiteurl.company.com

  3. Restaurez la base de données MySQL à partir des dernières sauvegardes:

    • quitter la session 'root' vers la session du compte 'bitnami'

--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"
  1. Vérifiez que le site Web Wordpress s'affiche correctement:

Accédez à http://websiteurl.company.com

J'espère que cela aidera quiconque continue de vivre ce problème particulier maintenant ou à l'avenir.

0
Shaun Walter