Restauration de tables MySQL à partir de fichiers .ibd, .frm et mysqllogbin


10

Pour une raison quelconque, lorsque j'essaie d'ouvrir mes tables qui sont stockées dans .frmet les .ibdfichiers (que ce soit sur MySQL ou phpmyadmin) cela me donne une erreur de syntaxe, ou il dit qu'il n'existe pas.

J'ai lu l'autre article qui avait un problème similaire à celui-ci, mais je ne sais pas comment vérifier s'il innodb_file_per_tableest activé, et je suis globalement vraiment confus. J'ai également converti une copie de mon mysql-bin.000002fichier en un fichier txt, donc je vois que les données de ma base de données ne sont pas complètement perdues.

La base de données a été créée l'année dernière. J'ai 6 de ces mysql-bin.00000fichiers, mais pour une raison quelconque, .000002c'est le plus grand. En ce moment, j'ai les fichiers .ibdet .frmpour toutes mes bases de données, mais je ne sais pas comment je peux les restaurer dans MySQL, ou du moins dans quelque chose que je peux lire.

J'utilise WampServer 2.4 et MySQL 5.6.12 sur Windows 2003 Server. De plus, suis-je censé télécharger un plugin dans InnoDB?


Non, il a été créé l'année dernière. J'ai 6 de ces fichiers mysql-bin.00000, mais pour une raison quelconque, le .000002 est le plus grand. En ce moment, j'ai les fichiers .ibd et .frm pour toutes mes bases de données, mais je ne sais pas comment je peux les restaurer dans MySQL, ou du moins dans quelque chose que je peux lire.
carment

Réponses:


19

J'ai finalement compris et résolu mon problème à travers de nombreux essais et erreurs. Pour ceux qui n'ont pas leur fichier ibdata1 d'origine et qui n'ont que leurs fichiers .frm et .ibd, voici comment j'ai restauré mes données.

  1. Téléchargez et installez les utilitaires MySQL sur -> http://dev.mysql.com/downloads/utilities .
  2. Allez dans votre commande / terminal pour ouvrir l'utilitaire MySQL, mysqlfrm, et utilisez-le pour trouver la structure de votre table que vous devez restaurer. Comment j'ai fait cela, ai-je été inséré dans l'emplacement du fichier de mysqlfrm, puis entré "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". Le fichier .txt doit être enregistré dans le même dossier que celui où vos utilitaires sont enregistrés si vous n'avez pas spécifié où vous vouliez qu'il aille.
  3. Dans le fichier texte, vous verrez les instructions CREATE TABLE, qui incluent toutes les colonnes et les informations (essentiellement, la structure d'origine) de votre table. Copiez cette instruction CREATE avec toutes ces informations.
  4. Dans votre commande MySQL, créez une nouvelle base de données (CREATE DATABASE database_name). Faites-lui le même nom que votre nom de base de données d'origine.
  5. Créez une nouvelle table à l'intérieur de la nouvelle base de données - elle ne doit pas nécessairement être du même nom que le dossier. Vous pouvez créer la nouvelle table dans l'invite de commande, mais j'ai créé ma table dans PhpMyAdmin, un outil logiciel gratuit qui gère l'administration de MySQL sur le Web. J'ai simplement cliqué sur la base de données sur PhpMyAdmin, puis sur la table SQL, et collé la structure de la table à partir de # 3. (En remarque, j'ai toujours reçu des erreurs si je nommais mes tables "table" dans mon invite de commande, alors essayez d'éviter ce nom).
  6. Sur votre commande MySQL, allez dans votre base de données et entrez "ALTER TABLE nom_table DISCARD TABLESPACE", ce qui supprimera essentiellement le fichier .ibd de cette table.
  7. Copiez le fichier .ibd de votre table d'origine (la table que vous souhaitez restaurer) dans la table nouvellement créée pour remplacer le fichier .ibd que vous venez de supprimer. Remplacez votre fichier .ibd initial par le nom de la table nouvellement créée. Cela imitera l'ancien fichier .ibd que vous venez de supprimer. Vous pouvez trouver ce dossier dans le dossier de données MySQL, sous le dossier de base de données nouvellement créé sur votre ordinateur.
  8. Revenez à votre commande MySQL, allez dans votre base de données et entrez "ALTER TABLE table_Name IMPORT TABLESPACE". Vous recevrez une instruction de type d'erreur "warning" (1), mais ignorez simplement cela.
  9. Et.. Voila! si vous essayez d'accéder à votre nouvelle table, elle devrait contenir toutes les données de votre ancienne table.

J'espère que cela vous a aidé et faites-moi savoir si vous avez des questions ou des commentaires! Consultez également http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file pour plus de détails.


Excellentes instructions, mais cela ne fonctionne qu'avec MySQL 5.6 ! Sur 5.5, vous obtiendrez l'erreur Got error -1 from storage enginelorsque vous exécutez IMPORT TABLESPACE. Mais pour moi, MySQL 5.6 a fonctionné pour les tables qui ont été créées à l'aide de MySQL 5.5, donc tout va bien;). Si vous êtes bloqué avec 5.5, vous devez suivre les instructions du lien chriscalender que vous avez posé.
ostrokach

@carment J'ai suivi vos instructions, mais je suis confronté à ERRPR: j'essaie d'accéder au numéro de page 1767006713 dans l'espace 13635, le nom d'espace <dbname> / <tblname>, qui est en dehors de l'espace disque logique. Pouvez-vous me guider sur ce que j'ai pu faire?
Mohit Mehta

Cela m'a fait gagner beaucoup de temps en recréant une table. La méthode fonctionne toujours en 2016, sur MySQL 5.7.17
Andy Mercer

@ostrokach il semble que ce soit parce que vous ne l'avez pas innodb_file_per_tableactivé.
Yvan

Tu m'as juste sauvé après un très long voyage, merci!
Amr SubZero

4

Le fichier de données principal InnoDB - généralement nommé ibdata- est essentiel pour que MySQL puisse comprendre vos fichiers .ibd.

Si vous devez déplacer des données entre des serveurs à l'aide des fichiers binaires, vous devez arrêter MySQL proprement, puis déplacer tous les fichiers de données, y compris le (s) fichier (s) ibdata , entre les répertoires.

Un mécanisme plus fiable pour déplacer des données entre des serveurs sous Windows serait d'utiliser ( mysqldump) ou une exportation de base de données depuis PHPMyAdmin (ou un outil similaire).

Si la journalisation binaire a été activée pendant toute la durée d'exécution de votre serveur (sur la base des commentaires, cela peut ne pas être le cas), vous pouvez également utiliser mysqlbinlogpour récupérer chaque instruction SQL que vous avez exécutée sur le serveur à partir des fichiers mysql-bin et recréez la base de données de cette façon. Il devrait y avoir des horodatages Unix dans les fichiers mysql-bin qui vous aident à déterminer jusqu'où ils remontent.

Si vous avez perdu vos fichiers de base de données d'origine et qu'il ne vous reste que les fichiers .ibd individuels, vous devrez peut-être recourir à la récupération des données selon les suggestions d'Akuzminsky dans les commentaires.

MySQL 5.6 a quelques nouvelles fonctionnalités pour déplacer les fichiers de données InnoDB .ibd (espaces de table transportables ), mais ceux-ci nécessitent un certain effort et, pour une base de données suffisamment petite, il sera beaucoup plus facile de transférer des données à l'aide mysqldump.


0

Réponse wiki générée à partir des commentaires de questions par akuzminsky


Si vous voyez des *.ibdfichiers, alors innodb_file_per_tablec'est le ONcas, sinon toutes les tables seraient dedans ibdata1.

S'il indique qu'une table n'existe pas, alors la table est manquante dans le dictionnaire InnoDB. Essayez de vider toutes les tables dans des vidages SQL séparés (une table - un fichier). Ces tables que vous ne pouvez pas vider, vous pouvez les restaurer avec TwinDB recovery toolkit .

Il n'y a pas encore de paquets binaires. Vous devez obtenir le code source de GitHub et le compiler. Voir les instructions dans le dictionnaire Recover InnoDB . C'est assez simple:

git clone git@github.com:twindb/undrop-for-innodb.git

et alors

make all
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.