Verlorene Frm-Dateien – Daten von ibdata wiederherstellen

Verlorene Frm-Dateien – Daten von ibdata wiederherstellen

Ich habe mit einer MySQL-InnoDB-Datenbank gearbeitet. Als ich mit mysqlworkbench gearbeitet habe, wurden versehentlich alle .frm-Dateien aus dem MySQL-Datenordner gelöscht, aber ich habe immer noch die IBData-Datei im Datenordner. Ich habe innodb_file_per_table nicht verwendet, was bedeutet, dass alle Daten meiner InnoDB-Tabellen in der einzelnen IBData-Datei waren.

Leider habe ich kein Backup, aus dem ich wiederherstellen kann. Kann mir jemand sagen, wie ich die Daten aus der IBData-Datei wiederherstellen kann?

Antwort1

Ihre Frage scheint identisch zu sein mitdieses hier auf Stack Overflow.
Ich habe einen Teil der akzeptierten Antwort hier wiedergegeben.


Die einfache Lösung besteht darin, Ihre gespeicherte Kopie des CREATE TABLE SQL zu finden, es auf einemEntwicklungInstanz von MySQL, und kopieren Sie dann die generierte FRM-Datei in die wiederhergestellte Instanz.

Wenn Sie keinen Zugriff auf die CREATE TABLEKontoauszüge haben, können Sie Folgendes versuchen:

  1. Führen Sie in der wiederhergestellten Datenbank Folgendes aus:create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. Beobachten Sie die MySQL-Server-Fehlerdatei, bis die Tabellenmonitordaten ausgegeben wurden (normalerweise etwa eine Minute lang).
  3. Laufendrop table innodb_table_monitor
  4. Stoppen der wiederhergestellten Datenbank

  5. Schreiben Sie SQL, um es an die Ausgabe des Tabellenmonitors anzupassen, zB:

    TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828
    COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45;     
    DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; 
    DB_ROLL_PTR: DATA_SYS prtype 258 len 7;
    INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1
    root page 3, appr.key vals 1828, leaf pages 9, size pages 10
    FIELDS:  DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name
    

    kann wie folgt ausgedrückt werden:

    drop table if exists mylosttable;
    create table mylosttable (
        id char(12) NOT NULL,
        name varchar(45) NOT NULL
    );
    

    Wenn Sie hinsichtlich der Ausgabe des Tabellenmonitors verwirrt sind, sehen Sie sich die Ausgabe für Tabellen mit einem bekannten Schema an.

  6. Führen Sie den obigen SQL-Befehl auf einemEntwicklungInstanz von MySQL

  7. Kopieren Sie die im Entwicklungsserver erstellten FRM-Dateien in die wiederhergestellte Datenbank. Sie finden sie im MySQL-Datenverzeichnis im Unterverzeichnis für die entsprechende Datenbank.

  8. Starten Sie die wiederhergestellte Datenbank neu

    Beachten Sie, dass Sie die FRM-Dateien von Ihrem Entwicklungssystem in eine Live-Datenbankinstanz kopieren können. Der Grund für das Stoppen des Servers ist, dass, wenn Sie die Datenbank nach dem Erstellen der innodb_table_monitor-Tabelle abstürzen lassen, die ibdata-Datei in einem inkonsistenten Zustand zurückbleibt und Sie von einer Sicherung aus neu beginnen müssen.

  9. Testen Sie, ob die Tabellen mit select *Anweisungen funktionieren. Wenn Sie falsch liegen, sehen Sie:

    ERROR 2013 (HY000): Lost connection to MySQL server during query
    

was bedeutet, dass die Datenbank abgestürzt ist. Wenn dies passiert, führen Sie dies create table innodb_table_monitor...auf der Entwicklungsinstanz aus und vergleichen Sie die Ausgabe mit der ursprünglichen Ausgabe der wiederhergestellten Instanz. Sie werden wahrscheinlich feststellen, dass Sie ein NOT NULL oder etwas Ähnliches übersehen haben.

verwandte Informationen