Vorwort: Das am häufigsten verwendete logische MySQL-Backup-Tool ist mysqldump. Im Allgemeinen sichern wir die gesamte Instanz oder einen Teil der Geschäftsdatenbank. Ich bin nicht sicher, ob Sie eine Wiederherstellung durchgeführt haben. Es kann viele Wiederherstellungsszenarien geben, z. B. das Wiederherstellen einer Datenbank oder einer Tabelle. Wie stellt man also eine einzelne Datenbank oder Tabelle aus einem vollständigen Backup wieder her? Welche versteckten Fallstricke gibt es? Schauen wir uns diesen Artikel gemeinsam an. 1. So stellen Sie eine einzelne Datenbank oder Tabelle wieder her Im vorherigen Artikel wurde die Sicherung und Wiederherstellung von MySQL vorgestellt. In jeder unserer Datenbankinstanzen kann es mehr als eine Datenbank geben. Normalerweise soll die Sicherung die gesamte Instanz sichern, aber die Wiederherstellungsanforderungen sind unterschiedlich. Ich möchte beispielsweise nur eine bestimmte Datenbank oder eine bestimmte Tabelle wiederherstellen. Was soll ich jetzt tun? Wenn die Datenmenge in Ihrer Instanz nicht groß ist, können Sie die gesamte Instanz in einer anderen Umgebung wiederherstellen und dann die erforderliche Datenbank oder Tabelle zur Wiederherstellung separat sichern. Allerdings ist diese Methode nicht flexibel genug und nur anwendbar, wenn die Datenmenge relativ gering ist. Tatsächlich ist es recht praktisch, eine einzelne Datenbank aus einem vollständigen Backup wiederherzustellen. Es gibt einen Parameter --one-database, mit dem die Wiederherstellung einer einzelnen Datenbank angegeben werden kann. Im Folgenden finden Sie eine konkrete Demonstration: # Alle Bibliotheken anzeigen und sichernmysql> show databases; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |mysql | | Leistungsschema | |sbtest| |System| |testdb| | testdb2 | +--------------------+ mysqldump -uroot -pxxxx -R -E --single-transaction --all-databases > all_db.sql # Löschen Sie die Testdb-Datenbank und führen Sie eine einzelne Datenbankwiederherstellung durch mysql> drop database testdb; Abfrage OK, 36 Zeilen betroffen (2,06 Sek.) # Wenn die Testdb-Datenbank vor der Wiederherstellung nicht vorhanden ist, müssen Sie sie manuell erstellen: mysql -uroot -pxxxx --one-database testdb < all_db.sql Zusätzlich zu den oben genannten Methoden können Sie auch eine manuelle Überprüfung verwenden, um eine einzelne Datenbank oder Tabelle wiederherzustellen. Zu diesem Zeitpunkt sind die bekannten sed- und grep-Befehle in Linux praktisch. Wir können diese beiden Befehle verwenden, um die Anweisungen einer einzelnen Datenbank oder einer einzelnen Tabelle aus dem vollständigen Backup herauszufiltern. Die Screening-Methode ist wie folgt: # Wiederherstellen einer einzelnen Datenbank aus einem vollständigen Backup sed -n '/^-- Aktuelle Datenbank: `testdb`/,/^-- Aktuelle Datenbank: `/p' all_db.sql > testdb.sql # Einzeltabellenanweisungen herausfiltern cat all_db.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test_tb`/!d;q' > /tmp/test_tb_info.sql grep --ignore-case 'insert into `test_tb`' > /tmp/test_tb_data.sql 2. Vorsicht vor Fallstricken Die oben beschriebene Methode zum manuellen Filtern zur Wiederherstellung einer einzelnen Datenbank oder einer einzelnen Tabelle scheint einfach und bequem zu sein, birgt jedoch tatsächlich eine kleine Tücke. Lassen Sie uns dies im Folgenden im Detail demonstrieren: # Sichern Sie die gesamte Instanz mysqldump -uroot -pxxxx -R -E --single-transaction --all-databases > all_db.sql # Manuelles Sichern von test_tb und anschließendes Löschen von test_tb mysql> Tabelle test_tb_bak wie test_tb erstellen; Abfrage OK, 0 Zeilen betroffen (0,03 Sek.) mysql> in test_tb_bak einfügen, auswählen * aus test_tb; Abfrage OK, 4 Zeilen betroffen (0,02 Sek.) Datensätze: 4 Duplikate: 0 Warnungen: 0 mysql> Tabelle test_tb löschen; Abfrage OK, 0 Zeilen betroffen (0,02 Sek.) # Filtern Sie die Anweisungen zum Erstellen der Tabelle test_db und zum Einfügen der Daten aus dem vollständigen Backup cat all_db.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `test_tb`/!d;q' > test_tb_info.sql grep --ignore-case 'insert in `test_tb`' > test_tb_data.sql # Überprüfen Sie die Anweisung. Sie scheint in Ordnung zu sein. cat test_tb_info.sql Tabelle löschen, wenn `test_tb` vorhanden ist; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET Zeichensatzclient = utf8 */; Tabelle erstellen `test_tb` ( `inc_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel automatisch inkrementieren', `col1` int(11) NICHT NULL, `col2` varchar(20) DEFAULT NULL, `col_dt` Datum/Uhrzeit DEFAULT NULL, `create_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Erstellungszeit', `update_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP KOMMENTAR 'Änderungszeit', PRIMÄRSCHLÜSSEL (`inc_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Testtabelle'; /*!40101 SET Zeichensatzclient = @saved_cs_client */; Katze test_tb_data.sql INSERT INTO `test_tb` VALUES (1,1001,'dsfs','2020-08-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'), (2,1002,'vfsfs','2020-09-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'), (3,1003,'adsfsf',NULL,'2020-09-17 06:19:27','2020-09-17 06:19:27'), (4,1004,'walfd','2020-09-17 14:19:27','2020-09-17 06:19:27','2020-09-18 07:52:13'); # Führen Sie eine Wiederherstellungsoperation für eine einzelne Tabelle aus mysql -uroot -pxxxx testdb < test_tb_info.sql mysql -uroot -pxxxx testdb < test_tb_data.sql # Zeigen Sie die wiederhergestellten Daten an und vergleichen Sie sie mit der Sicherungstabellemysql> select * from test_tb; +--------+------+--------+---------------------+---------------------+---------------------+ | inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit | +--------+------+--------+---------------------+---------------------+---------------------+ | 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 | | 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 | | 3 | 1003 | adsfsf | NULL | 17.09.2020 06:19:27 | 17.09.2020 06:19:27 | | 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 06:19:27 | 18.09.2020 07:52:13 | +--------+------+--------+---------------------+---------------------+---------------------+ 4 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus test_tb_bak; +--------+------+--------+---------------------+---------------------+---------------------+ | inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit | +--------+------+--------+---------------------+---------------------+---------------------+ | 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 | +--------+------+--------+---------------------+---------------------+---------------------+ 4 Zeilen im Satz (0,00 Sek.) Wenn Sie genau hinsehen, werden Sie feststellen, dass mit den wiederhergestellten Daten etwas nicht stimmt. Es scheint, dass die Zeit nicht stimmt. Wenn Sie noch einmal genau hinsehen, werden Sie feststellen, dass die Zeit teilweise um 8 Stunden abweicht! Nach eingehender Untersuchung stellten wir fest, dass es ein Problem mit der Wiederherstellung der Zeitdaten des Zeitstempeltypfelds gab. Genauer gesagt zeichnete die Sicherungsdatei die Zeitzone 0 auf, aber unser System verwendet im Allgemeinen die Zeitzone Ost 8, sodass der Fehler von 8 Stunden auftrat. Dann fragen Sie sich vielleicht, warum es kein Problem geben sollte, wenn alles wiederhergestellt ist? Gute Frage. Um das herauszufinden, werfen wir einen Blick auf die Sicherungsdatei. # Anfang der Sicherungsdatei – MySQL-Dump 10.13 Distrib 5.7.23 für Linux (x86_64) -- -- Host: localhost Datenbank: -- ------------------------------------------------------ --Serverversion 5.7.23-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 NAMEN FESTLEGEN utf8 */; /*!40103 SETZEN @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SETZE ZEITZONE='+00:00' */; Beachten Sie die beiden obigen Zeilen /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SETZEN @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; # Ende der Sicherungsdatei /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SETZEN SIE FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SETZEN SIE UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@ALTER_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@ALTE_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump abgeschlossen am 18.09.2020 15:56:40 Wenn Sie sich die Sicherungsdatei genau ansehen, werden Sie feststellen, dass in der von mysqldump gesicherten Datei die Sitzungszeitzone zuerst auf 0 und am Ende wieder auf die ursprüngliche Zeitzone geändert wird. Dies bedeutet, dass die in der Sicherungsdatei aufgezeichneten Zeitstempeldaten auf der Zeitzone 0 basieren. Wenn das gefilterte SQL direkt ausgeführt wird, wird der Zeitstempel der Zeitzone 0 in das System der Zeitzone Ost 8 eingefügt, was offensichtlich einen Zeitunterschied von 8 Stunden verursacht. Ich frage mich, ob Sie verstehen, was ich hier gelesen habe. Wer Erfahrung mit Backup und Wiederherstellung hat, wird es vielleicht leichter verstehen. Die Lösung für das obige Problem ist ebenfalls sehr einfach: Ändern Sie vor dem Ausführen der SQL-Datei die aktuelle Sitzungszeitzone auf 0. Lassen Sie es uns noch einmal demonstrieren: # Löschen Sie die Tabelle test_db datamysql> truncate table test_tb; Abfrage OK, 0 Zeilen betroffen (0,02 Sek.) # Fügen Sie die Zeitzonendeklaration am Anfang der Datei vim test_tb_data.sql hinzu setze Sitzung TIME_ZONE='+00:00'; INSERT INTO `test_tb` VALUES (1,1001,'dsfs','2020-08-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'), (2,1002,'vfsfs','2020-09-04 12:12:36','2020-09-17 06:19:27','2020-09-17 06:19:27'), (3,1003,'adsfsf',NULL,'2020-09-17 06:19:27','2020-09-17 06:19:27'), (4,1004,'walfd','2020-09-17 14:19:27','2020-09-17 06:19:27','2020-09-18 07:52:13'); # Führen Sie die Wiederherstellung aus und vergleichen Sie, um festzustellen, ob die Daten korrekt sindmysql> select * from test_tb; +--------+------+--------+---------------------+---------------------+---------------------+ | inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit | +--------+------+--------+---------------------+---------------------+---------------------+ | 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 | +--------+------+--------+---------------------+---------------------+---------------------+ 4 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus test_tb_bak; +--------+------+--------+---------------------+---------------------+---------------------+ | inc_id | col1 | col2 | col_dt | Erstellungszeit | Aktualisierungszeit | +--------+------+--------+---------------------+---------------------+---------------------+ | 1 | 1001 | dsfs | 04.08.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 2 | 1002 | vfsfs | 04.09.2020 12:12:36 | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 3 | 1003 | adsfsf | NULL | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | | 4 | 1004 | walfd | 17.09.2020 14:19:27 | 17.09.2020 14:19:27 | 18.09.2020 15:52:13 | +--------+------+--------+---------------------+---------------------+---------------------+ 4 Zeilen im Satz (0,00 Sek.) Zusammenfassen: Im Internet kann man leicht nach Methoden suchen, um eine einzelne Datenbank oder Tabelle wiederherzustellen. Die meisten davon erwähnen die oben erwähnte Methode der manuellen Überprüfung mithilfe der Befehle sed und grep. Die meisten Artikel erwähnen jedoch keine möglichen Probleme. Wenn Ihr Tabellenfeld den Typ „Zeitstempel“ hat, sollten Sie bei der Verwendung dieser Methode besonders vorsichtig sein. Unabhängig davon, mit welchen Wiederherstellungsanforderungen wir konfrontiert sind, müssen wir besonders vorsichtig sein, damit sich die Situation nicht verschlimmert, je mehr wir wiederherstellen. Am besten ist es, vor der Wiederherstellung eine leere Instanz zum Üben zu haben. Oben finden Sie Einzelheiten zum Wiederherstellen einer einzelnen Datenbank oder einer einzelnen Tabelle in MySQL sowie Hinweise zu den möglichen Fallstricken. Weitere Informationen zum Wiederherstellen einer einzelnen Datenbank oder einer einzelnen Tabelle in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: JavaScript implementiert einfache Rechnerfunktion
>>: VUE realisiert Registrierungs- und Login-Effekte
Szenario: Ein Prüfdokument hat n Prüfdetails und ...
Prinzip Setzen Sie beim Schweben einen Schatten a...
Vorwort Kürzlich stieß ich auf eine Anforderung. ...
Mit etwa Version 0.6 wurde Privileged in Docker e...
Docker Compose Docker Compose unterteilt die verw...
Bitte sehen Sie sich den folgenden Screenshot an,...
Da ich heute nichts zu tun habe, habe ich ein paa...
Das Hintergrundbild ist wahrscheinlich eine diese...
Die MySQL-Versionsnummer ist 5.7.28. Tabelle A ha...
Beim Entwickeln von Anwendungen, die eine Datenba...
Inhaltsverzeichnis Warum die Auto-Inkrement-ID ak...
CentOS 8 ist offiziell veröffentlicht! CentOS ent...
1. Verbindung zwischen Docker-Containern Docker i...
Entwickeln Sie ein Zahlenratespiel, bei dem zufäl...
Konfigurationsanweisungen Linux-System: CentOS-7....