web-dev-qa-db-fra.com

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

Pour une raison quelconque, lorsque j'essaie d'ouvrir mes tables stockées dans .frm et .ibd fichiers (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 si innodb_file_per_table est activé, et je suis globalement vraiment confus. J'ai également converti une copie de mon mysql-bin.000002 fichier vers 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'en ai 6 mysql-bin.00000 fichiers, mais pour une raison quelconque, le .000002 est le plus grand. En ce moment, j'ai le .ibd et .frm fichiers 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.

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?

10
carment

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 dans 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.

19
carment

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 ou les fichiers 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 mysqlbinlog pour 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 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 ( tablespaces 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 en utilisant mysqldump.

4
Nathan Jolly

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


Si tu vois *.ibd fichiers puis innodb_file_per_table est ON, sinon toutes les tables seraient dans 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 sur Récupérer le dictionnaire InnoDB . C'est assez simple:

git clone [email protected]:twindb/undrop-for-innodb.git

et alors

make all
0
Paul White 9