1. Szenariobeschreibung: Häufig ist der Zugriff auf Daten nicht möglich, weil die MySQL-Datenbank nicht gestartet werden kann. Die Anwendungsdaten gehen dabei jedoch in der Regel nicht verloren. Es sind lediglich andere Dateien wie der Systemtabellenbereich beschädigt oder es liegt ein MySQL-Fehler vor. Wenn zu diesem Zeitpunkt keine Sicherungskopie erstellt wird, denken viele Leute, die Daten seien verloren. Tatsächlich können die Daten jedoch meistens gerettet werden. Wenn die MySQL-Datentabellenbereichsdatei (ibdata) beschädigt ist oder nicht geändert bzw. gelöscht wird, kann der MySQL-Dienst nicht neu gestartet werden. Gleichzeitig werden MySQL-Daten nicht rechtzeitig gesichert. Wie können wir so viele MySQL-Daten wie möglich wiederherstellen? ? 2. Falldemonstration: 2.1. Bestätigen Sie, wie viele Datensätze jede Tabelle in der Datenbank vor dem MySQL-Fehler hatfür n in `mysql -e "use db_bbs;show tables;"|sed '1d'`;do echo $n; mysql -e "use db_bbs;select count(*) from $n;";done >test.txt Wie viele Tabellen sind in der Datenbank, bevor der MySQL-Fehler bestätigt wird? Insgesamt gibt es 39 Tabellen: [root@10-10-127-11 ~]# mysql -e "db_bbs verwenden;Tabellen anzeigen;"|sed '1d'|wc -l 39 2.2. Simulieren Sie den Fehler beim Löschen von ibdata:Löschen Sie die ibdata-Datei (dies ist in Produktionsumgebungen nicht zulässig). innodb_force_recovery =6 Verwenden Sie die erzwungenen Startparameter von MySQL, um den MySQL-Dienst zu diesem Zeitpunkt zu starten, aber es ist zwecklos. Da die Datentabellenbereichsdatei ibdata gelöscht wurde, kann der MySQL-Dienst derzeit nicht gestartet werden. 2.3. Möglichkeiten zum Abrufen von Daten:Erstellen Sie zunächst die fehlende Tabellenstruktur: Installieren Sie zunächst mysql-utilities auf dem ausgefallenen MySQL-Server. yum -y installiere MySQL-Dienstprogramme Verwenden Sie mysqlfrm, um die Anweisung zur Tabellenerstellung aus der .frm-Datei abzurufen: Analysieren Sie eine .frm-Datei, um Anweisungen zur Tabellenerstellung zu generieren mysqlfrm --diagnostic [root@test02 db_bbs]# mysqlfrm --diagnostic /data/mysql/data/db_bbs/t_admin.frm |grep -v "^#" TABELLE `db_bbs`.`t_admin` erstellen ( `f_id` int(4) NICHT NULL AUTO_INCREMENT, `f_type` tinyint(1) NICHT NULL, `f_username` varchar(80) NICHT NULL, `f_password` varchar(80) NICHT NULL, `f_nick_name` varchar(80) NICHT NULL, `f_real_name` varchar(80) NICHT NULL, `f_create_time` bigint(4) NICHT NULL, `f_update_time` bigint(4) NICHT NULL, `f_last_login_time` bigint(4) DEFAULT NULL, `f_last_login_ip` varchar(80) DEFAULT NULL, `f_status` tinyint(1) NICHT NULL, PRIMÄRSCHLÜSSEL `PRIMARY` (`f_id`) MIT BTREE )ENGINE=InnoDB ROW_FORMAT = 2; Importieren Sie alle Anweisungen zur Tabellenerstellung in die Datei /tmp/create.sql: [root@test02 ~]# cd /data/mysql/data/db_bbs/ [root@test02 db_bbs]# für n in `ls -l /data/mysql/data/db_bbs/*.frm|awk -F '/' '{print $NF}'|xargs -n 40`;do mysqlfrm --diagnostic $n|grep -v "^#" >>/tmp/create.sql;fertig Importieren Sie die generierten Anweisungen zur Tabellenerstellung in die neue MySQL-Instanzbibliothek: [root@10-10-127-11 ~]# mysql db_bbs < erstellen.sql FEHLER 1064 (42000) in Zeile 2: Ihre SQL-Syntax weist einen Fehler auf. Überprüfen Sie im Handbuch zu Ihrer MySQL-Serverversion die richtige Syntax in der Nähe von „5“ in Zeile 10. Der Grund dafür ist, dass das erhaltene SQL zur Tabellenerstellung den Parameter ROW_FORMAT = 2 enthält. Die Stapelersetzungsbefehle lauten wie folgt: cat /tmp/create.sql|sed -e 's/ENGINE=InnoDB ROW_FORMAT = 2;/ENGINE=InnoDB ;/g'|grep ROW_FORMAT |uniq -c cat /tmp/create.sql|sed -e 's/ENGINE=InnoDB ROW_FORMAT = 5;/ENGINE=InnoDB ;/g'|grep ROW_FORMAT |uniq -c sed -i 's/ENGINE=InnoDB ROW_FORMAT = 2;/ENGINE=InnoDB ;/g' /tmp/create.sql sed -i 's/ENGINE=InnoDB ROW_FORMAT = 5;/ENGINE=InnoDB ;/g' /tmp/create.sql cat /tmp/create.sql|grep ROW_FORMAT |uniq -c Beim Exportieren von Anweisungen zur Tabellenerstellung in eine neue MySQL-Instanz meldet die Datenbank db_bbs einen Fehler. Das Feld ist zu lang: [root@10-10-127-11 ~]# mysql db_bbs -f < erstellen.sql FEHLER 1074 (42000) in Zeile 232: Spaltenlänge zu groß für Spalte „f_content“ (max = 16383); verwenden Sie stattdessen BLOB oder TEXT FEHLER 1074 (42000) in Zeile 299: Spaltenlänge zu groß für Spalte 'f_desc' (max = 16383); verwenden Sie stattdessen BLOB oder TEXT FEHLER 1074 (42000) in Zeile 365: Spaltenlänge zu groß für Spalte „f_body_image“ (max = 16383); verwenden Sie stattdessen BLOB oder TEXT FEHLER 1074 (42000) in Zeile 406: Spaltenlänge zu groß für Spalte „f_content“ (max = 16383); verwenden Sie stattdessen BLOB oder TEXT FEHLER 1074 (42000) in Zeile 433: Spaltenlänge zu groß für Spalte 'f_summary' (max = 16383); verwenden Sie stattdessen BLOB oder TEXT Nach der Änderung des Feldlängentyps importieren Sie die SQL-Tabellenerstellung erneut in die neue MySQL-Datenbank [root@10-10-127-11 ~]# mysql db_bbs -f < erstellen.sql [root@10-10-127-11 ~]# [root@10-10-127-11 ~]# [root@10-10-127-11 ~]# mysql -e "db_bbs verwenden;Tabellen anzeigen;"|sed '1d'|wc -l 39 ###Verwerfen Sie die .ibd-Datei, die keine Daten in der neu erstellten MySQL-Instanz enthält, und importieren Sie dann die .idb-Datei der fehlerhaften Datenbank### Verwerfen Sie die Daten-IBD-Datei der neu erstellten Bibliothek: mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;fertig [root@10-10-127-11 db_bbs]# ll *.ibd|wc -l 39 [root@10-10-127-11 db_bbs]# mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;fertig [root@10-10-127-11 db_bbs]# ll *.ibd|wc -l ls: kann nicht auf *.ibd zugreifen: Keine solche Datei oder kein solches Verzeichnis *Sie können sehen, dass alle .idb-Dateien verworfen wurden. Kopieren Sie dann die alten .ibd-Dateien mit Daten in das Verzeichnis ./data/db_bbs/ der neuen MySQL-Instanz. Vergessen Sie nicht, den Besitzer zu ändern: chown mysql. Importieren Sie dann diese Datendateien in die Datenbank**. [root@test02 db_bbs]# scp *.ibd [email protected]:/data/mysql/data/db_bbs/ Passwort von [email protected]: browse_record.ibd 100 % 100 MB 50,0 MB/s 00:02 t_admin.ibd ........ ........ [root@10-10-127-11 db_bbs]# ll *.ibd|wc -l 39 [root@10-10-127-11 db_bbs]# ll *.ibd -rw-r----- 1 root root 104857600 14. März 21:56 browse_record.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_admin.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_anonymous_code.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_apply.ibd -rw-r----- 1 root root 9437184 14. März 21:56 t_attach.ibd -rw-r----- 1 root root 147456 14. März 21:56 t_banner.ibd -rw-r----- 1 root root 163840 14. März 21:56 t_banner_log.ibd -rw-r----- 1 root root 114688 14. März 21:56 t_black_ip.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_black_user.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_block_userbaseinfo.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_collect.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_country_code.ibd -rw-r----- 1 root root 163840 14. März 21:56 t_ct_goods.ibd -rw-r----- 1 root root 131072 Mär 14 21:56 t_ct_goods_record.ibd -rw-r----- 1 Wurzel Wurzel 9437184 14. März 21:56 t_ct_integral.ibd -rw-r----- 1 root root 46137344 14. März 21:56 t_ct_integral_record.ibd -rw-r----- 1 root root 27262976 14. März 21:56 t_ct_news.ibd -rw-r----- 1 root root 9437184 14. März 21:56 t_ct_order.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_feedback.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_lexicon.ibd -rw-r----- 1 root root 327680 14. März 21:56 t_logs.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_manage.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_module.ibd -rw-r----- 1 root root 9437184 14. März 21:56 t_post_extend.ibd -rw-r----- 1 root root 12582912 Mär 14 21:56 t_post.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_post_video.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_realtime_message.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_recommend.ibd -rw-r----- 1 root root 46137344 14. März 21:56 t_reply.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_reward.ibd -rw-r----- 1 root root 196608 Mär 14 21:56 t_sensitive_word.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_system_message.ibd -rw-r----- 1 root root 9437184 14. März 21:56 t_userbaseinfo.ibd -rw-r----- 1 root root 344064 14. März 21:56 t_userextendinfo.ibd -rw-r----- 1 root root 12582912 Mär 14 21:56 t_user_health.ibd -rw-r----- 1 root root 98304 14. März 21:56 t_user_message.ibd -rw-r----- 1 root root 442368 14. März 21:56 t_user_read_module_log.ibd -rw-r----- 1 root root 17825792 14. März 21:56 t_viewpoint.ibd -rw-r----- 1 root root 114688 14. März 21:56 t_white_ip.ibd [root@10-10-127-11 db_bbs]# chown mysql.mysql *.ibd mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;fertig Beim Importieren des Tablespace der einzelnen Tabellen treten Fehler bei einzelnen Tabellen auf: [root@10-10-127-11 db_bbs]# mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;fertig FEHLER 1808 (HY000) in Zeile 1: Schema-Fehler (Tabelle hat Zeilenformat ROW_TYPE_DYNAMIC, .ibd-Datei hat Zeilenformat ROW_TYPE_COMPACT.) Überprüfen Sie die Tabellendatei und stellen Sie fest, dass nur die Tabelle „browse_record“ beim Importieren in den unabhängigen Tabellenbereich einen Fehler meldet, was dazu führt, dass die Datenwiederherstellung dieser Tabelle fehlschlägt. [root@10-10-127-11 db_bbs]# mysqlcheck -c db_bbs db_bbs.browse_record Warnung: InnoDB: Tablespace wurde für Tabelle „browse_record“ verworfen Fehler: Der Tablespace für die Tabelle „browse_record“ wurde verworfen. Fehler: Beschädigt db_bbs.t_admin OK db_bbs.t_anonymous_code OK db_bbs.t_apply OK db_bbs.t_attach OK db_bbs.t_banner OK db_bbs.t_banner_log OK db_bbs.t_black_ip OK db_bbs.t_black_user OK db_bbs.t_block_userbaseinfo OK db_bbs.t_collect OK db_bbs.t_Ländercode OK db_bbs.t_ct_goods OK db_bbs.t_ct_goods_record OK db_bbs.t_ct_integral OK db_bbs.t_ct_integral_record OK db_bbs.t_ct_news OK db_bbs.t_ct_order OK db_bbs.t_feedback OK db_bbs.t_lexicon OK db_bbs.t_logs OK db_bbs.t_manage OK db_bbs.t_module OK db_bbs.t_post OK db_bbs.t_post_extend OK db_bbs.t_post_video OK db_bbs.t_realtime_message OK db_bbs.t_recommend OK db_bbs.t_reply OK db_bbs.t_reward OK db_bbs.t_sensitive_word OK db_bbs.t_system_message OK db_bbs.t_user_health OK db_bbs.t_user_message OK db_bbs.t_user_read_module_log OK db_bbs.t_userbaseinfo OK db_bbs.t_userextendinfo OK db_bbs.t_viewpoint OK db_bbs.t_white_ip OK Die Lösung für den oben genannten Fehler beim Wiederherstellen der Tabelle browse_record lautet wie folgt: Referenz: https://blog.csdn.net/weixin_30607659/article/details/94987901 Löschen Sie die in die neue MySQL-Instanz importierte Browse_Record-Tabelle und führen Sie dann die folgende Tabellenerstellungsanweisung aus, um eine neue Browse_Record-Tabelle zu erstellen: Tabelle „browse_record“ erstellen ( `id` int(4) unsigned NOT NULL AUTO_INCREMENT, `post_id` int(4) unsigned NICHT NULL, `user_id` int(4) unsigned NICHT NULL, `status` tinyint(1) unsigned NICHT NULL, `update_time` bigint(4) unsigned NICHT NULL, `create_time` bigint(4) unsigned NICHT NULL, PRIMÄRSCHLÜSSEL (`id`) MIT BTREE, SCHLÜSSEL `browse` (`post_id`,`user_id`) MIT BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=kompakt; Tipp: Wenn Sie die browse_record-Tabelle in der neuen MySQL-Instanz löschen und der Löschvorgang fehlschlägt, löschen Sie einfach die db_bbs-Datenbank in der neuen MySQL-Instanz, importieren Sie die Tabellenerstellungsanweisungen für alle db_bbs-Tabellen erneut und führen Sie dann den folgenden Befehl aus: mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a DISCARD TABLESPACE" ;fertig Importieren Sie den Tablespace erneut in die neue MySQL-Instanz: [root@10-10-127-11 db_bbs]# mysql -e "Tabellen aus db_bbs anzeigen" | grep -v Tables_in_db_bbs| while read a; do mysql -e "ALTER TABLE db_bbs.$a import TABLESPACE" ;fertig [root@10-10-127-11 db_bbs]# Die Datenreparatur ist hier abgeschlossen Überprüfen Sie die Tabellen in der MySQL db_bbs-Bibliothek: [root@10-10-127-11 db_bbs]# mysqlcheck -c db_bbs db_bbs.browse_record OK db_bbs.t_admin OK db_bbs.t_anonymous_code OK db_bbs.t_apply OK db_bbs.t_attach OK db_bbs.t_banner OK db_bbs.t_banner_log OK db_bbs.t_black_ip OK db_bbs.t_black_user OK db_bbs.t_block_userbaseinfo OK db_bbs.t_collect OK db_bbs.t_Ländercode OK db_bbs.t_ct_goods OK db_bbs.t_ct_goods_record OK db_bbs.t_ct_integral OK db_bbs.t_ct_integral_record OK db_bbs.t_ct_news OK db_bbs.t_ct_order OK db_bbs.t_feedback OK db_bbs.t_lexicon OK db_bbs.t_logs OK db_bbs.t_manage OK db_bbs.t_module OK db_bbs.t_post OK db_bbs.t_post_extend OK db_bbs.t_post_video OK db_bbs.t_realtime_message OK db_bbs.t_recommend OK db_bbs.t_reply OK db_bbs.t_reward OK db_bbs.t_sensitive_word OK db_bbs.t_system_message OK db_bbs.t_user_health OK db_bbs.t_user_message OK db_bbs.t_user_read_module_log OK db_bbs.t_userbaseinfo OK db_bbs.t_userextendinfo OK db_bbs.t_viewpoint OK db_bbs.t_white_ip OK 2.4. Holen Sie sich die in die neue MySQL-Instanz db_bbs-Bibliothek importierten Tabellendatensätze und vergleichen Sie sie mit der Tabellendatensatzdatei test.txt der Originalbibliothek[root@10-10-127-11 ~]# für n in `mysql -e "use db_bbs;show tables;"|sed '1d'`;do echo $n; mysql -e "use db_bbs;select count(*) from $n;";done >test.txt11 Vergleichen Sie es mit der Tabellendatensatzdatei test.txt der Originalbibliothek. [root@test02 ~]# vimdiff test.txt11 test.txt Die Tabellendatensätze sind hier vollständig konsistent. Die MySQL-Datenreparatur ist abgeschlossen. Quellen: Dies ist das Ende dieses Artikels zum Wiederherstellen von Daten aus versehentlich gelöschten IBData-Dateien in MySQL 5.7.33. Weitere Informationen zu versehentlich gelöschten IBData in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: 4 flexible SCSS-Kompilierungsausgabestile
>>: Docker entfernt abnormale Containervorgänge
Inhaltsverzeichnis 1. Panorama II. Hintergrund 1....
Beim Absenden eines Formulars kann es vorkommen, d...
Wenn wir den Quellcode vieler Websites überprüfen...
1. Einführung in Middleware 1. Grundlegende Konze...
1. Installieren Sie das Baidu Eslint Rule-Plugin ...
Vorwort In einem üblichen Geschäftsszenario müsse...
Dieser Artikel beschreibt anhand eines Beispiels,...
Inhaltsverzeichnis JavaScript-Prototypenkette Obj...
Schauen wir uns zunächst die relativen Längeneinh...
Stellungnahme : In diesem Artikel erfahren Sie, w...
Ich lerne derzeit etwas über Redis und Container ...
Was ist sie? „em“ bezieht sich auf die Schrifthöhe...
Inhaltsverzeichnis Migrationstools Anwendungstran...
Es gibt drei Typen von regulären Matching-Selekto...
Dockerfile ist eine Datei, die zum Erstellen eine...