MySQL verwendet frm-Dateien und ibd-Dateien, um Tabellendaten wiederherzustellen

MySQL verwendet frm-Dateien und ibd-Dateien, um Tabellendaten wiederherzustellen

Einführung in FRM-Dateien und IBD-Dateien

Wenn wir in MySQL die Standard-Speicher-Engine innodb zum Erstellen einer Tabelle verwenden, erscheinen im Ordner zwei Dateien, Tabellenname.frm und Tabellenname.ibd. Wenn wir die Myisam-Speicher-Engine verwenden, erscheinen drei Dateien. Hier ein Beispiel:

[root@ /data/yeyz]#ll
insgesamt 580
-rw-rw---- 1 mysql mysql 8586 3. April 17:44 Uhr a.frm
-rw-rw---- 1 mysql mysql 0 3. April 17:44 Uhr
-rw-rw---- 1 mysql mysql 1024 3. April 17:44 Uhr
-rw-rw---- 1 mysql mysql 8586 3. April 17:44 b.frm
-rw-rw---- 1 mysql mysql 98304 3. April 17:45 Uhr vormittags
-rw-rw---- 1 mysql mysql 61 23. November 09:54 db.opt
-rw-rw---- 1 mysql mysql 8556 29. April 21:37 tbl_test_2.frm
-rw-rw---- 1 mysql mysql 98304 29. April 21:37 tbl_test_2.ibd
-rw-rw---- 1 mysql mysql 8556 29. April 21:33 tbl_test.frm
-rw-rw---- 1 mysql mysql 98304 29. April 21:33 tbl_test.ibd
-rw-rw---- 1 mysql mysql 8614 29. April 21:40 test.frm
-rw-rw---- 1 mysql mysql 98304 29. April 21:43 test.ibd
-rw-rw---- 1 mysql mysql 8666 2. April 15:13 unstandard_ins.frm
-rw-rw---- 1 mysql mysql 98304 3. April 11:46 unstandard_ins.ibd
-rw-rw---- 1 mysql mysql 8586 3. April 17:44 yeyz.frm
-rw-rw---- 1 mysql mysql 28. April 3 17:44 yeyz.MYD
-rw-rw---- 1 mysql mysql 2048 3. April 17:44 yeyz.MYI

Unter ihnen ist die ibd-Datei die InnoDB-Tabellendatendatei und die frm-Datei die InnoDB-Tabellenstrukturdatei. In der Tabelle der Mysiam-Speicher-Engine ist frm die Tabellenstruktur, die MYI-Datei ist die Indexdatei und die MYD-Datei ist die Datendatei. Hier ist auch zu sehen, dass der Index und die Daten der InnoDB-Speicher-Engine zusammen sind, während der Index und die Daten der Myisam-Speicher-Engine getrennt sind.

Zu beachten ist, dass sich weder die frm-Datei noch die ibd-Datei direkt öffnen lassen.

Stellen Sie sich eine Anforderung vor, bei der die Daten in einer Tabelle schnell wiederhergestellt werden müssen. Die Datenbank, in der sich die Tabelle befindet, enthält jedoch eine große Datenmenge und die Wiederherstellung kann lange dauern. Daher ist eine vollständige Datenbankwiederherstellung definitiv nicht die beste Option. Was also sollten wir in dieser Situation tun? Wir können FRM-Dateien und IBD-Dateien verwenden, um Daten wiederherzustellen. Lassen Sie uns diesen Prozess unten analysieren.

Tabellenstruktur zur Wiederherstellung von FRM-Dateien

Natürlich muss die Tabellenstruktur mithilfe der frm-Datei wiederhergestellt werden. Unsere erste Reaktion ist, dass wir diese beiden Dateien direkt in eine neue Datenbankinstanz kopieren und dann die Instanz direkt starten können. Ist das möglich? Natürlich nicht. Wenn mein Neffe das schafft, werden vermutlich alle DBAs entlassen. Haha, schauen wir uns ohne weitere Umschweife den Operationsvorgang an.

Zunächst erstellen wir eine neue Instanz speziell für die Wiederherstellung von Daten. Wenn Sie zur Wiederherstellung eine Online-Maschine verwenden, müssen Sie das Risiko eines Datenbankneustarts und einer DML-Blockierung tragen. Daher ist es am besten, eine dedizierte Instanz für die Wiederherstellung zu verwenden. Wie erhalten wir also die gewünschte Tabellenstruktur aus der FRM-Datei?

Lassen Sie mich als Beispiel eine Online-Slow-Log-Tabelle nehmen. Der Einfachheit halber habe ich den Tabellennamen als „aaa“ geschrieben. Die Struktur dieser Tabelle ist wie folgt:

mysql--root@localhost:test_recover 12:08:43>>zeige Tabelle erstellen aaa\G
*************************** 1. Reihe ***************************
  Tabelle: aaa
Tabelle erstellen: CREATE TABLE `aaa` (
 `maintain_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Spalte automatisch inkrementieren',
 `slowquery_filename` varchar(50) DEFAULT NULL COMMENT 'Name der langsamen Protokolldatei',
 `slowquery_path` varchar(150) DEFAULT NULL COMMENT 'Vollständiger Pfad des langsamen Protokolls',
 `slowquery_process` tinyint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Ob das langsame Protokoll analysiert wird',
 `slowquery_uploadtime` Datum/Uhrzeit STANDARD CURRENT_TIMESTAMP,
 `slowquery_analyzetime` date DEFAULT NULL COMMENT 'Langsame Protokollanalysezeit',
 `slowquery_starttime` Datum DEFAULT NULL,
 `slowquery_endtime` Datum DEFAULT NULL,
 `instance_ip` varchar(15) DEFAULT NULL COMMENT 'Langsame Protokoll-IP-Adresse',
 `instance_port` int(11) DEFAULT NULL COMMENT 'Langsame Protokollportnummeradresse',
 PRIMÄRSCHLÜSSEL (`maintain_id`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

Um eine solche Tabelle aus der FRM-Datei zu erhalten, müssen wir die folgenden Schritte ausführen:

1. Erstellen Sie eine Tabelle mit dem gleichen Namen wie aaa auf der Instanz. Da wir die Struktur dieser Tabelle nicht kennen, können wir sie so einrichten, dass sie nur eine Feld-ID hat, d. h.

Tabelle aaa erstellen (ID int);

Wir wissen, dass zu diesem Zeitpunkt neue aaa.frm- und aaa.ibd-Dateien im entsprechenden Datenverzeichnis generiert werden. Anschließend verwenden wir die gesicherte aaa.frm, um die vorherige aaa.frm zu ersetzen und die Datenbank neu zu starten.

Ja, Sie haben richtig gelesen. Wir verwenden die Sicherungsdatei der Tabellenstruktur, um die generierte Tabellenstrukturdatei zu ersetzen.

2. Sehen Sie sich die Fehlerprotokollausgabe nach dem Neustart wie folgt an:

2019-03-22T03:17:28.652390Z 16 
[Warnung] InnoDB: Tabelle test_recover/store_goods_price enthält 1 Benutzer 
definierte Spalten in InnoDB, aber 12 Spalten in MySQL. Bitte überprüfen Sie 
INFORMATION_SCHEMA.INNODB_SYS_COLUMNS und http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html, um zu erfahren, wie Sie das Problem beheben können.
2019-04-02T07:56:31.558461Z 41 
[Warnung] InnoDB: Tabelle test_recover/dv_control enthält 1 benutzerdefinierten 
Spalten in InnoDB, aber 14 Spalten in MySQL. Bitte überprüfen Sie
 INFORMATION_SCHEMA.INNODB_SYS_COLUMNS und http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html, um zu erfahren, wie Sie das Problem beheben können.
2019-05-23T03:14:10.161122Z 92 
[Warnung] InnoDB: Tabelle test_recover/aaa enthält 1 
benutzerdefinierte Spalten in InnoDB, aber 10 Spalten in MySQL. Bitte überprüfen Sie 
INFORMATION_SCHEMA.INNODB_SYS_COLUMNS und http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html, um zu erfahren, wie Sie das Problem beheben können.

Wie Sie sehen, teilt uns das Fehlerprotokoll in den Zeilen 10-12 mit, dass die Tabelle aaa nur ein Feld enthält, frm jedoch 10 Felder enthält und die Anzahl der Felder nicht übereinstimmt.

Dies entspricht unserem erwarteten Ergebnis, da wir der Tabelle aaa beim Erstellen nur eine Feld-ID zugewiesen haben und die aaa-Tabelle, die wir wiederherstellen möchten, 10 Felder aufweist, die nicht aus frm gelesen werden können. An diesem Punkt können Sie sich leicht vorstellen, was das Endergebnis sein wird, wenn wir die Felder dieser AAA-Tabelle auf 10 anpassen.

3. Aktualisieren Sie die Anzahl der Felder in der AAA-Tabelle auf 10, kopieren Sie dann die FRM-Datei erneut und ändern Sie den Parameter innodb_force_recovery=6 in der Konfigurationsdatei. Sehen wir uns das Endergebnis an:

mysql--root:(keine) 12:04:20>>test_recover verwenden;
Datenbank geändert
mysql - root: test_recover 12:04:25>>Tabelle aaa erstellen (id1 int, id2 int, id3 int, id4 int, id5 int, id6 int, id7 int, id8 int, id9 int, id10 int);
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)

mysql--root@localhost:test_recover 12:05:08>>zeige Tabelle erstellen aaa\G
*************************** 1. Reihe ***************************
  Tabelle: aaa
Tabelle erstellen: CREATE TABLE `aaa` (
 `id1` int(11) DEFAULT NULL,
 `id2` int(11) DEFAULT NULL,
 `id3` int(11) DEFAULT NULL,
 `id4` int(11) DEFAULT NULL,
 `id5` int(11) DEFAULT NULL,
 `id6` int(11) DEFAULT NULL,
 `id7` int(11) DEFAULT NULL,
 `id8` int(11) DEFAULT NULL,
 `id9` int(11) DEFAULT NULL,
 `id10` int(11) STANDARD NULL
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz (0,00 Sek.)

Dann starten wir die Instanz neu und überprüfen die Tabelle aaa erneut. Wir können die folgenden Ergebnisse sehen:

mysql--root:test_recover 12:08:43>>zeige Tabelle erstellen aaa\G
*************************** 1. Reihe ***************************
  Tabelle: aaa
Tabelle erstellen: CREATE TABLE `aaa` (
 `maintain_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Spalte automatisch inkrementieren',
 `slowquery_filename` varchar(50) DEFAULT NULL COMMENT 'Name der langsamen Protokolldatei',
 `slowquery_path` varchar(150) DEFAULT NULL COMMENT 'Vollständiger Pfad des langsamen Protokolls',
 `slowquery_process` tinyint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Ob das langsame Protokoll analysiert wird',
 `slowquery_uploadtime` Datum/Uhrzeit STANDARD CURRENT_TIMESTAMP,
 `slowquery_analyzetime` date DEFAULT NULL COMMENT 'Langsame Protokollanalysezeit',
 `slowquery_starttime` Datum DEFAULT NULL,
 `slowquery_endtime` Datum DEFAULT NULL,
 `instance_ip` varchar(15) DEFAULT NULL COMMENT 'Langsame Protokoll-IP-Adresse',
 `instance_port` int(11) DEFAULT NULL COMMENT 'Langsame Protokollportnummeradresse',
 PRIMÄRSCHLÜSSEL (`maintain_id`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

Es ist ersichtlich, dass die gewünschte Tabellenstruktur aus der frm-Datei wiederhergestellt wurde. Es ist zu beachten, dass wir bei diesem Vorgang die ibd-Datei nicht verwendet haben.

Fassen Sie die Schritte zum Wiederherstellen der Tabellenstruktur mithilfe von FRM-Dateien zusammen:

1. Erstellen Sie zunächst eine Tabelle mit demselben Namen und starten Sie dann die Instanz

2. Verwenden Sie die gesicherte FRM-Datei, um die generierte FRM-Datei zu ersetzen, und starten Sie die Instanz neu

3. Überprüfen Sie das Fehlerprotokoll und ermitteln Sie die Anzahl der Felder m in der gesicherten frm-Datei aus dem Fehlerprotokoll

4. Erstellen Sie die Tabelle mit demselben Namen neu, stellen Sie sicher, dass die Anzahl der Felder m beträgt und mit der Sicherungstabelle übereinstimmt, und kopieren Sie die Sicherungs-FRM-Datei erneut in das entsprechende Verzeichnis

5. Ändern Sie den Parameter innodb_force_recovery=6 in der Instanzkonfigurationsdatei und starten Sie dann die Datenbank neu. Sie können die entsprechende Anweisung zum Erstellen der Tabellenstruktur sehen. Wir speichern sie und verwenden sie beim Wiederherstellen der Daten im nächsten Schritt. Dieser Schritt ist sehr wichtig

6. Kommentieren Sie den Parameter innodb_force_recovery=6 aus, verwenden Sie erneut den Standardwert und starten Sie die Datenbank neu, um die Wiederherstellung der Tabellendaten vorzubereiten.

An diesem Punkt wurde die Tabellenstruktur wiederhergestellt.

Lassen Sie mich den Parameter innodb_force_recovery erklären. Der Maximalwert dieses Parameters ist 6. Auf dieser Ebene werden nur einige Abfragefunktionen unterstützt und DML wird nicht unterstützt. Wie der Name schon sagt, wird dieser Parameter in einigen erzwungenen Wiederherstellungsszenarien verwendet. Im Allgemeinen kann dieser Parameter weggelassen und der Standardwert verwendet werden. Studierende, die mehr erfahren möchten, können die offizielle Dokumentation zu Rate ziehen.

IBD-Dateiwiederherstellungstabellendaten

Nachdem der vorherige Schritt abgeschlossen ist, haben wir die entsprechende Tabellenstruktur erhalten. Sehen wir uns nun an, wie die Tabellendaten wiederhergestellt werden.

Die Methode zum Wiederherstellen von Tabellendaten ist relativ einfach. Die allgemeinen Schritte lauten wie folgt:

1. Verwenden Sie die im vorherigen Schritt erhaltene Anweisung zur Tabellenerstellung, um eine Tabelle neu zu erstellen, und führen Sie dann Folgendes aus:

Leertabelle AAA für den Export;

Diese Syntax wird verwendet, um die Daten in der Tabelle auf die Festplatte zu schreiben und die Sperre der Tabelle zu erhalten, um sie für die nachfolgende Wiederherstellung vorzubereiten.

2. Dann verwenden wir die folgende Anweisung:

Tabelle aaa ändern, Tabellenbereich verwerfen;

Diese Anweisung löscht die aktuelle ibd-Datei.

3. Anschließend verwenden wir die zuvor gesicherte ibd-Datei und kopieren sie in das entsprechende Instanzverzeichnis

4. Laden Sie abschließend die ibd-Datei erneut und verwenden Sie die folgende Anweisung:

Tabelle ändern aaa, Tablespace importieren;

Starten Sie die Datenbank neu und unsere Daten werden erfolgreich wiederhergestellt.

Kurzzusammenfassung

Der gesamte Wiederherstellungsprozess wurde vorgestellt. Der cleverere Teil besteht darin, die Tabellenstrukturinformationen aus der frm-Datei zu erhalten. Wir haben die Methode zum zweimaligen Zusammensetzen der Tabellenerstellungsanweisung verwendet und schließlich die Tabellenstruktur der wiederherzustellenden Tabelle erhalten. Anschließend haben wir die Methoden „Alter Table Discard Tablespace“ und „Alter Table Import Tablespace“ verwendet, um die Daten in der Tabelle wiederherzustellen. Der gesamte Vorgang sieht kompliziert aus, aber tatsächlich können Sie ein Skript entsprechend den Schritten abstrahieren. Auf diese Weise müssen Sie bei der nächsten Wiederherstellung nur den Namen der wiederherzustellenden Tabelle eingeben und können die Tabellenstruktur und die Daten schnell wiederherstellen. Dies kann als Notfallplan zur Datenwiederherstellung angesehen werden.

Oben finden Sie Einzelheiten dazu, wie MySQL frm- und ibd-Dateien verwendet, um Tabellendaten wiederherzustellen. Weitere Informationen zur Wiederherstellung von MySQL-Tabellendaten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • MySQL-Export ganzer oder einzelner Tabellendaten
  • Beheben Sie das Problem, dass die MySQL-Datenbank unerwartet abstürzt, wodurch die Tabellendatendatei beschädigt wird und nicht gestartet werden kann
  • Warum der Speicherplatz nach dem Löschen von Daten in MySQL nicht freigegeben wird
  • Lösung für den Fehler beim Starten von MySQL aufgrund unzureichenden Speicherplatzes in Ubuntu
  • Häufige Probleme mit der MySQL-Speicher-Engine MyISAM (Tabellenbeschädigung, Unzugänglichkeit, unzureichender Speicherplatz)
  • So deaktivieren Sie das MySQL-Protokoll, um Speicherplatz unter lnmp zu schützen
  • Mehrere Vorschläge zum Verkleinern von MySQL, um Speicherplatz zu sparen
  • So geben Sie Speicherplatz frei, nachdem Sie Daten in Mysql InnoDB gelöscht haben
  • Warum ist der Speicherplatz nach dem Löschen von Tabellendaten in MySQL immer noch belegt?

<<:  So fügen Sie Docker ein Zertifikat hinzu

>>:  Webdesign-Kenntnisse: Hohe Rankingprobleme bei gemischten chinesischen und englischen Webseiten

Artikel empfehlen

Axios storniert wiederholte Anfragen

Inhaltsverzeichnis Vorwort 1. So stornieren Sie e...

Reacts Methode zur Realisierung einer sekundären Verknüpfung

In diesem Artikel wird der spezifische Code von R...

Wettersymbol-Animationseffekt implementiert durch CSS3

Ergebnisse erzielen Implementierungscode html <...

Über 40 schöne Beispiele für Webformular-Designs

Webformulare sind der primäre Kommunikationskanal...

Beispiel für die Bereitstellung eines Django-Projekts mit Docker

Es ist auch sehr einfach, Django-Projekte mit Doc...

Detaillierte Erklärung, wie eine SQL-Anweisung in MySQL ausgeführt wird

Überblick Ich habe vor Kurzem begonnen, mir Wisse...

Detaillierte Erklärung der Vue-Anmeldung und -Abmeldung

Inhaltsverzeichnis Login-Geschäftsprozess Impleme...

Beispielcode für die Verwendung von @media in CSS3 zur Anpassung einer Webseite

Heutzutage wird die Bildschirmauflösung von Compu...

Umfassende Erklärung zum CocosCreator Hot Update

Inhaltsverzeichnis Vorwort Was ist Hot Change Coc...

Ein QQ-Chatroom basierend auf vue.js

Inhaltsverzeichnis Einführung Nachfolgend sehen S...

Mysql-Lösung zur Verbesserung der Effizienz beim Kopieren großer Datentabellen

Vorwort Dieser Artikel stellt hauptsächlich den r...

js canvas realisiert Bilder mit abgerundeten Ecken

In diesem Artikel wird der spezifische Code von J...

Tipps zur Verwendung des Top-Befehls in Linux

Lassen Sie mich zunächst die Bedeutung einiger Fe...