Wiederherstellen von MySQL-Tabellen aus .ibd-, .frm- und mysqllogbin-Dateien

10

Wenn ich versuche, meine in .frmund in .ibdDateien gespeicherten Tabellen (ob unter MySQL oder phpmyadmin) zu öffnen, wird aus irgendeinem Grund ein Syntaxfehler angezeigt oder es wird angegeben, dass er nicht vorhanden ist.

Ich habe den anderen Beitrag gelesen, der ein ähnliches Problem hatte, aber ich weiß nicht, wie ich überprüfen soll, ob er innodb_file_per_tableaktiviert ist, und insgesamt bin ich nur sehr verwirrt. Ich habe auch eine Kopie meiner mysql-bin.000002Datei in eine txt-Datei konvertiert, damit ich sehe, dass die Daten aus meiner Datenbank nicht vollständig verloren gehen.

Die Datenbank wurde letztes Jahr erstellt. Ich habe 6 dieser mysql-bin.00000Dateien, aber aus irgendeinem Grund .000002ist die größte. Im Moment habe ich die .ibdund .frm-Dateien für alle meine Datenbanken, aber ich weiß nicht, wie ich sie wieder in MySQL oder zumindest in etwas wiederherstellen kann, das ich lesen kann.

Ich verwende WampServer 2.4 und MySQL 5.6.12 unter Windows 2003 Server. Soll ich auch ein Plugin in InnoDB herunterladen?

Carment
quelle
Nein, es wurde letztes Jahr erstellt. Ich habe 6 dieser mysql-bin.00000-Dateien, aber aus irgendeinem Grund ist die .000002 die größte. Im Moment habe ich die .ibd- und .frm-Dateien für alle meine Datenbanken, aber ich weiß nicht, wie ich sie wieder in MySQL oder zumindest in etwas wiederherstellen kann, das ich lesen kann.
Carment

Antworten:

19

Ich habe es endlich herausgefunden und mein Problem durch viel Ausprobieren gelöst. Für diejenigen, die nicht über ihre ursprüngliche ibdata1-Datei verfügen und nur über ihre .frm- und .ibd-Dateien verfügen, habe ich meine Daten wie folgt wiederhergestellt.

  1. Laden Sie die MySQL-Dienstprogramme herunter und installieren Sie sie unter -> http://dev.mysql.com/downloads/utilities .
  2. Öffnen Sie in Ihrem Befehl / Terminal das MySQL-Dienstprogramm mysqlfrm und suchen Sie damit die Struktur Ihrer Tabelle, die Sie wiederherstellen müssen. Wie ich das gemacht habe, wurde ich in den Dateispeicherort von mysqlfrm cd'ed und dann "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt" eingegeben. Die TXT-Datei sollte in demselben Ordner gespeichert werden, in dem Ihre Dienstprogramme gespeichert sind, wenn Sie nicht angegeben haben, wohin sie gehen soll.
  3. In der Textdatei sehen Sie die Anweisungen CREATE TABLE, die alle Spalten und Informationen (im Grunde die ursprüngliche Struktur) Ihrer Tabelle enthalten. Kopieren Sie diese CREATE-Anweisung mit all diesen Informationen.
  4. Erstellen Sie in Ihrem MySQL-Befehl eine neue Datenbank (CREATE DATABASE database_name). Machen Sie den gleichen Namen wie Ihren ursprünglichen Datenbanknamen.
  5. Erstellen Sie eine neue Tabelle in der neuen Datenbank - sie muss nicht denselben Namen wie der Ordner haben. Sie können die neue Tabelle an der Eingabeaufforderung erstellen, aber ich habe meine Tabelle in PhpMyAdmin erstellt, einem kostenlosen Softwaretool, das die Verwaltung von MySQL über das Web übernimmt. Ich habe einfach auf die Datenbank in PhpMyAdmin und dann auf die SQL-Tabelle geklickt und die Tabellenstruktur von # 3 eingefügt. (Als Randnotiz habe ich immer Fehler erhalten, wenn ich meine Tabellen in meiner Eingabeaufforderung "Tabelle" genannt habe. Versuchen Sie daher, diesen Namen zu vermeiden.)
  6. Gehen Sie in Ihrem MySQL-Befehl in Ihre Datenbank und geben Sie "ALTER TABLE table_name DISCARD TABLESPACE" ein, wodurch die .ibd-Datei dieser Tabelle im Wesentlichen entfernt wird.
  7. Kopieren Sie die .ibd-Datei Ihrer Originaltabelle (die Tabelle, die Sie wiederherstellen möchten) in die neu erstellte Tabelle, um die gerade entfernte .ibd-Datei zu ersetzen. Ändern Sie Ihre ursprüngliche .ibd-Datei in den Namen der neu erstellten Tabelle. Dies ahmt die alte .ibd-Datei nach, die Sie gerade gelöscht haben. Sie finden diesen Ordner im MySQL-Datenordner unter dem neu erstellten Datenbankordner auf Ihrem Computer.
  8. Kehren Sie zu Ihrem MySQL-Befehl zurück, gehen Sie in Ihre Datenbank und geben Sie "ALTER TABLE table_Name IMPORT TABLESPACE" ein. Sie erhalten eine Fehlerwarnung vom Typ "Warnung" (1), ignorieren Sie diese jedoch einfach.
  9. Und fertig! Wenn Sie versuchen, auf Ihre neue Tabelle zuzugreifen, sollte diese alle Daten aus Ihrer alten Tabelle enthalten.

Ich hoffe das hat geholfen und lass es mich wissen, wenn du Fragen oder Kommentare hast! Weitere Informationen finden Sie unter http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file .

Carment
quelle
Tolle Anleitung, aber es funktioniert nur mit MySQL 5.6 ! Unter 5.5 wird Got error -1 from storage enginebeim Ausführen der Fehler angezeigt IMPORT TABLESPACE. Aber für mich hat MySQL 5.6 für Tabellen funktioniert, die mit MySQL 5.5 erstellt wurden, also ist alles gut;). Wenn Sie mit 5.5 nicht weiterkommen , müssen Sie den Anweisungen im von Ihnen gestellten Chriscalender-Link folgen .
Ostrokach
@carment Ich habe Ihre Anweisungen befolgt, aber es tritt ERRPR auf: Ich habe versucht, auf die Seitennummer 1767006713 im Speicherplatz 13635, Speicherplatzname <Datenbankname> / <Tblname>, zuzugreifen, der außerhalb des gebundenen Tabellenbereichs liegt. Können Sie mir zeigen, was ich getan haben darf?
Mohit Mehta
Dies hat mir nur eine Menge Zeit gespart, einen Tisch neu zu erstellen. Methode funktioniert noch im Jahr 2016, auf MySQL 5.7.17
Andy Mercer
@ostrokach es scheint, dass das daran liegt, dass Sie nicht innodb_file_per_tableaktiviert haben.
Yvan
Du hast mich gerade nach einer sehr langen Reise gerettet, danke!
Amr SubZero
4

Die Haupt-InnoDB- ibdataDatendatei - normalerweise benannt - ist für MySQL unerlässlich, um Ihre .ibd-Dateien verstehen zu können.

Wenn Sie Daten mithilfe der Binärdateien zwischen Servern verschieben müssen, sollten Sie MySQL sauber stoppen und dann alle Datendateien, einschließlich der ibdata-Datei (en) , zwischen Verzeichnissen verschieben.

Ein zuverlässigerer Mechanismus zum Verschieben von Daten zwischen Servern unter Windows wäre die Verwendung von ( mysqldump) oder eines Datenbankexports von PHPMyAdmin (oder einem ähnlichen Tool).

Wenn die binäre Protokollierung während der gesamten Laufzeit Ihres Servers aktiviert wurde (basierend auf den Kommentaren ist dies möglicherweise nicht der Fall), können Sie auch mysqlbinlogjede SQL-Anweisung, die Sie auf dem Server ausgeführt haben, aus den mysql-bin-Dateien wiederherstellen und erstellen Sie die Datenbank auf diese Weise neu. Die mysql-bin-Dateien sollten Unix-Zeitstempel enthalten , mit denen Sie feststellen können, wie weit sie zurückreichen.

Wenn Sie Ihre ursprünglichen Datenbankdateien verloren haben und nur noch die einzelnen .ibd-Dateien übrig sind, müssen Sie möglicherweise die Daten gemäß den Vorschlägen von akuzminsky in den Kommentaren wiederherstellen.

MySQL 5.6 verfügt über einige neue Funktionen zum Verschieben von InnoDB .ibd-Datendateien ( transportable Tablespaces ). Diese erfordern jedoch einige Anstrengungen und für eine ausreichend kleine Datenbank wird es viel einfacher sein, Daten mit zu übertragen mysqldump.

Nathan Jolly
quelle
0

Wiki-Antwort generiert aus Fragekommentaren von akuzminsky


Wenn Sie *.ibdDateien sehen , dann innodb_file_per_tableist ON, sonst wären alle Tabellen in ibdata1.

Wenn eine Tabelle nicht vorhanden ist, fehlt sie im InnoDB-Wörterbuch. Versuchen Sie, alle Tabellen in separate SQL-Dumps (eine Tabelle - eine Datei) zu sichern. Die Tabellen, die Sie nicht sichern können, können Sie mit dem TwinDB Recovery Toolkit wiederherstellen .

Es gibt noch keine Binärpakete. Sie müssen den Quellcode von GitHub abrufen und kompilieren. Siehe Anweisungen im Recover InnoDB-Wörterbuch . Es ist ziemlich einfach:

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

und dann

make all
Paul White
quelle