Récupérer la base de données MySQL à partir du dossier de données sans ibdata1 à partir des fichiers ibd


15

Mon répertoire WAMP est accidentellement supprimé par un autre utilisateur. Seul le dossier de données dans MySQL est disponible. Et, en ce que seuls les dossiers de base de données (dossiers dans "\ bin \ mysql \ mysql5.6.12 \ data \" avec le nom des bases de données) sont disponibles. Tous les fichiers, y compris " ibdata1 " à la racine de "\ bin \ mysql \ mysql5.6.12 \ data \" sont également supprimés.

Les dossiers de base de données contiennent uniquement des fichiers avec les extensions ci-dessous.

* .frm, * .ibd

et le fichier "db.opt".

Comment récupérer les bases de données?

J'ai déjà essayé de récupérer bdata1. Mais, incapable de le récupérer. Et, certaines bases de données contiennent également MYISAM.

Réponses:


16

MyISAM

Pour une table MyISAM mydb.mytable, vous devez avoir trois fichiers

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

Ils doivent déjà être accessibles sous forme de tableau car chaque fichier contient les données, les métadonnées et les informations d'index nécessaires. Collectivement, ils forment la table. Il n'y a aucun mécanisme de moteur de stockage externe auquel accéder.

InnoDB

Jetez un œil à cette représentation picturale d'InnoDB

Architecture InnoDB

La seule chose qui attache ibdata1 aux .ibdfichiers est le dictionnaire de données.

Votre mission, si vous décidez de l’accepter, est de créer chaque table et d’échanger .ibd

Avant de faire quoi que ce soit, faites une copie complète de "\ bin \ mysql \ mysql5.6.12 \ data" vers un autre

Voici un exemple

Supposons que vous ayez une base mydbde données avec la table mytable. Ça signifie

  • Vous avez le dossier \bin\mysql\mysql5.6.12\data\mydb
  • Dans ce dossier, vous avez
    • mytable.frm
    • mytable.ibd

Vous avez besoin de .frm. Si vous regardez mon article Comment extraire le schéma de table à partir du fichier .frm uniquement? , vous pouvez télécharger un utilitaire MySQL qui peut générer le SQL nécessaire pour créer la table.

Vous devez maintenant faire ce qui suit

  • Déplacer mytable.ibdvers\bin\mysql\mysql5.6.12\data
  • Exécutez le SQL pour créer la table InnoDB
  • Connectez-vous à mysql et exécutez ALTER TABLE mydb.mytable DISCARD TABLESPACE;(cela supprimera \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • Copier \bin\mysql\mysql5.6.12\data\mytable.ibddans\bin\mysql\mysql5.6.12\data\mydb
  • Connectez-vous à mysql et exécutez ALTER TABLE mydb.mytable IMPORT TABLESPACE;(cela s'inscrira \bin\mysql\mysql5.6.12\data\mydb\mytable.ibddans le dictionnaire de données)

Après cela, la table mydb.mytabledoit être entièrement accessible. Vous pouvez tester cette accessibilité en exécutant simplement:

SELECT * FROM mydb.mytable LIMIT 10;

Essaie !!!

DRINK (Data Recovery intègre les connaissances nécessaires) de manière responsable


Pour compléter cette excellente réponse, pour innodb, vous devrez supprimer toute contrainte FK qui fait référence à la table avant de supprimer son espace de table. Après l'importation, vous devez recréer le FK.
SebaGra

après l'importation de l'espace table, information_schema.key_column_usage(probablement d'autres tables également) ne renverra aucune donnée sur la première select, vous devez donc exécuter au moins une requête et attendre quelques secondes avant que la requête suivante puisse fonctionner. (mysql Ver 14.14 Distrib 5.7.19, pour linux-glibc2.12 (x86_64) en utilisant le wrapper EditLine)
user3338098
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.