2013-11-13 14:52:59 +0000 2013-11-13 14:52:59 +0000
33
33

MySQL InnoDB a perdu des tables mais des fichiers existent

J'ai un InnoDB MySQL qui contient tous les fichiers des tables de la base de données, mais MySQL ne les voit pas, et ne les charge pas.

Le problème s'est produit parce que j'ai supprimé ces trois fichiers : ibdata1, ib_logfile0 et ib_logfile1

parce que j'avais des problèmes avec le démarrage de mysql, et ce que j'ai lu était qu'il fallait les supprimer parce que MySQL ne fait que les régénérer (je sais que j'aurais dû les sauvegarder mais je ne l'ai pas fait).

Que puis-je faire pour que MySQL revoie les tables ?

about_member.frm site_stories.frm
about_member.ibd site_stories.ibd
db.opt stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd story_comments.frm
FTS_00000000000000bb_CONFIG.ibd story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd story_likes.frm
FTS_00000000000000bb_DELETED.ibd story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd story_views.ibd
FTS_00000000000000f5_DELETED.ibd story_view_totals.frm
member_favorites.frm story_view_totals.ibd
member_favorites.ibd tags.frm
members.frm tags.ibd
members.ibd

Réponses (3)

36
36
36
2013-11-14 15:34:22 +0000

Voici pourquoi MySQL ne peut pas voir ces fichiers : Le tablespace du système (ibdata1) dispose d'un dictionnaire de données spécifique au moteur de stockage qui permet à InnoDB de déterminer l'utilisation potentielle des tables :

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

Le déplacement des tables InnoDB d'un endroit à un autre nécessite des commandes comme

ALTER TABLE mydb.tags DISCARD TABLESPACE;

Voici une partie de la Documentation MySQL 5.5 expliquant ce qui doit être pris en compte

Considérations de portabilité pour les fichiers .ibd

Vous ne pouvez pas déplacer librement les fichiers .ibd entre les répertoires de la base de données comme vous le pouvez avec les fichiers de table MyISAM. La définition de la table stockée dans le tablespace partagé InnoDB inclut le nom de la base de données. Les ID des transactions et les numéros de séquence des journaux stockés dans les fichiers du tablespace diffèrent également d'une base de données à l'autre.

Pour déplacer un fichier .ibd et la table associée d'une base de données à une autre, utilisez une instruction RENAME TABLE :

RENAME TABLE db1.tbl_name TO db2.tbl_name ; Si vous avez une sauvegarde “propre” d'un fichier .ibd, vous pouvez le restaurer dans l'installation MySQL d'où il provient comme suit :

La table ne doit pas avoir été supprimée ou tronquée depuis que vous avez copié le fichier .ibd, car cela modifie l'ID de table stocké dans le tablespace.

Émettez cette instruction ALTER TABLE pour supprimer le fichier .ibd actuel :

ALTER TABLE tbl_name DISCARD TABLESPACE ; Copiez le fichier .ibd de sauvegarde dans le répertoire de base de données approprié.

Émettez cette instruction ALTER TABLE pour indiquer à InnoDB d'utiliser le nouveau fichier .ibd pour la table :

ALTER TABLE tbl_name IMPORT TABLESPACE ; Dans ce contexte, une sauvegarde “propre” d'un fichier .ibd est une sauvegarde pour laquelle les conditions suivantes sont remplies :

Il n'y a pas de modifications non engagées par des transactions dans le fichier .ibd.

Il n'y a pas d'entrées de tampon d'insertion non fusionnées dans le fichier .ibd.

Purge a supprimé tous les enregistrements d'index marqués par une suppression dans le fichier .ibd.

mysqld a supprimé toutes les pages modifiées du fichier .ibd du pool de tampons et les a transférées dans le fichier.

Compte tenu de ces réserves et protocoles, voici une suggestion de marche à suivre

Pour cet exemple, essayons de restaurer la table tags dans la base de données mydb

STEP #1

Assurez-vous d'avoir des sauvegardes de ces fichiers .frm et .ibd dans /tmp/innodb_data

STEP #2

Obtenez l'instruction CREATE TABLE tags et exécutez-la en tant que CREATE TABLE mydb.tags .... Assurez-vous qu'il s'agit exactement de la même structure que le fichier tags.frm

STEP #3

Supprimez le fichier tags.ibd vide en utilisant MySQL

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

STEP #4

Apportez la copie de sauvegarde du fichier tags.ibd .
ALTER TABLE mydb.tags IMPORT TABLESPACE;

STEP #5

Ajoutez la table tags au dictionnaire de données InnoDB

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

STEP 6

Testez l'accessibilité de la table

Si vous obtenez des résultats normaux, Félicitations, vous importez une table InnoDB.

STEP 7

A l'avenir, veuillez ne pas supprimer ibdata1 et ses logs

Essayez-le ! !!

J'ai déjà discuté de ce genre de choses

CAVEAT

Que faire si vous ne connaissez pas la structure de la table tags ?

Il existe des outils pour obtenir l'instruction CREATE TABLE en utilisant simplement le fichier .frm. J'ai également écrit un billet à ce sujet : Comment extraire le schéma de la table à partir du fichier .frm ? . Dans ce billet, j'ai copié un fichier .frm sur une machine Windows à partir d'une boîte Linux, j'ai lancé l'outil Windows et j'ai obtenu l'instruction CREATE TABLE.

10
10
10
2014-01-28 02:08:22 +0000

Je suis dans la même situation, je ne peux pas supprimer ou créer un tblname spécifique. Ma procédure de correction est la suivante :

  1. Arrêtez MySQL.

  2. Supprimer ib_logfile0 et ib_logfile1.

  3. Supprimer les fichiers tblname. Attention : CELA EFFACERA PERMANENTEMENT VOS DONNÉES

  4. Démarrez MySQL.

2
2
2
2019-03-27 11:19:13 +0000

J'avais aussi ce problème. J'ai effacé ibdata1 accidentellement et toutes mes données ont été perdues.

Après 1 ou 2 jours de recherche dans Google et SO, j'ai finalement trouvé une solution qui m'a sauvé la vie (j'avais tellement de bases de données et de tables avec des enregistrements énormes).

  1. prendre une sauvegarde de /var/lib/mysql

  2. récupérer le schéma de la table de .frm fichier avec dbsake (il y avait une autre option ! mysqlfrm. mais ça n'a pas marché pour moi)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. créer une nouvelle table (avec un nouveau nom) avec le schéma exporté.

  2. supprimer les données de la nouvelle table avec cette commande :

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. copier les données de l'ancienne table et les coller à la place de la nouvelle, puis définir les droits d'accès.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. importez les données dans la nouvelle table.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. Très bien ! Nous avons des données dans la nouvelle table et nous pouvons supprimer l'ancienne.
DROP TABLE `tbl`;
  1. vérifier /var/lib/mysql/database-name et s'il y a des données (.ibd fichier) pour l'ancienne table, les supprimer.
rm tbl.ibd
  1. et enfin renommer la nouvelle table au nom d'origine
ALTER TABLE `tbl-new` RENAME `tbl`;