In den vorherigen drei Artikeln wurden gängige Sicherungsmethoden für MySQL-Datenbanken vorgestellt, darunter logische und physische Sicherungen. Dieser Artikel fasst den Inhalt zur Datenwiederherstellung von MySQL-Datenbanken zusammen. Diese Datenwiederherstellungslösungen wurden im vorherigen Backup-Inhalt vorgestellt. Hier fassen wir die Wiederherstellungslösungen zusammen und demonstrieren die Datenwiederherstellung in Kombination mit dem Binärprotokoll der Datenbank! 1. Wiederherstellungsplan 1. Wenn die Datenmenge nicht besonders groß ist, können Sie den MySQL-Clientbefehl oder den Quellbefehl verwenden, um die mit dem Befehl mysqldump gesicherten Daten wiederherzustellen. 2. Verwenden Sie mysqlbinlog für die zeitpunktbezogene Wiederherstellung 1. Einleitung mysqlbinlog ist ein Tool zum Lesen von Anweisungen aus Binärprotokollen, das nach der Installation mit MySQL geliefert wird. 2. Prinzip der Wiederherstellung binärer Protokolle Wenn Sie mysqldump zum Sichern der Datenbank verwenden, enthält die generierte Sicherungsdatei den Zeitpunkt des DML-Vorgangs der Datenbank und die Positionsinformationen des Binärprotokolls zum Zeitpunkt der Sicherung. Wenn es sich um eine einzelne Datenbank handelt, können Sie ab einem bestimmten Zeitpunkt beginnen und eine zeitpunktbezogene Wiederherstellung durchführen. Wenn es sich um eine Master-Slave-Architektur handelt, können Sie die Wiederherstellung basierend auf dem Zeitpunkt oder dem Positionspunkt gemäß --master-data=2 und --single-transaction während der Sicherung abschließen. 3. Beispiel für die Wiederherstellung eines Binärprotokolls (1) Beispiel für die Wiederherstellung einer einzelnen Datenbank Erstellen einer Datenbank und Einfügen von Testdaten mysql> ANZEIGEN DATENBANK ERSTELLEN test_db; mysql> CREATE TABLE `student` ( `id` int(11) NICHT NULL AUTO_INCREMENT, `name` varchar(20) NICHT NULL, `Alter` tinyint(4) DEFAULT NULL, PRIMÄRSCHLÜSSEL (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; mysql> INSERT INTO student (Name, Alter) VALUES('Jack',23),('Tomcat',24),('XiaoHong',22),('ZhangFei',29); Verwenden Sie mysqldump, um eine vollständige Sicherung durchzuführen, rollen Sie das Protokoll beim Sichern und merken Sie sich den Namen der Binärprotokolldatei und den Protokollspeicherort [root@WB-BLOG ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --Datenbanken test_db --Einzeltransaktion --Trigger --Routinen --Flush-Logs --Ereignisse > /tmp/test_db.sql [root@WB-BLOG ~]# mysql -e "Binärprotokolle anzeigen" > bin_pos_`date +%F`.out Sehen Sie sich an diesem Punkt den Namen der Binärprotokolldatei und den Speicherort des Protokollpunkts wie folgt an mysql> BINÄRPROTOKOLLE ANZEIGEN; +------------------+------------+ | Protokollname | Dateigröße | +------------------+------------+ |mysql-bin.000001 | 1497 | |mysql-bin.000002 | 397 | +------------------+------------+ 2 Zeilen im Satz (0,00 Sek.) Nach einiger Zeit der Verwendung habe ich versehentlich die folgende Anweisung ausgeführt und alle Daten in der Datenbank geändert. mysql> UPDATE STUDENT SET Name = "Administrator"; Nach einer Weile, vielleicht ein paar Minuten oder ein paar Stunden, meldete jemand, dass es ein Problem mit der Anmeldung auf der Website gab. Nach der Überprüfung stellte sich heraus, dass viele Daten versehentlich geändert wurden. Während dieser Zeit gab es immer noch Schreibvorgänge, wie beispielsweise die folgenden neuen Datensätze mysql> INSERT INTO student(Name, Alter) VALUES('Hbase',23),('BlackHole',30); Zu diesem Zeitpunkt müssen Sie die Daten wiederherstellen. Um zu verhindern, dass Daten geschrieben werden, können Sie zunächst die Tabelle sperren, den Schreibdienst anhalten, den Benutzer über die Systemwartung benachrichtigen und dann die folgenden Vorgänge ausführen: #Melden Sie sich bei der Datenbank an und sperren Sie die Tabelle. Zu diesem Zeitpunkt kann die Tabelle nur gelesen, aber nicht geschrieben werden.mysql> USE test_db; mysql> LOCK TABLE Student LESEN; #Öffnen Sie dann ein Sitzungsfenster erneut (beachten Sie, dass es erneut geöffnet wird), andernfalls wird die Sperre nach dem Beenden der Sitzung aufgehoben. Komprimieren und sichern Sie anschließend die vorhandenen Daten und Binärprotokolldateien [root@WB-BLOG mysql_logs]# tar zcvf mysql_data.tar.gz /mysql_data/* [root@WB-BLOG mysql_logs]# tar zcvf mysql_bin.tar.gz /mysql_logs/* #Importieren Sie die aktuellsten vollständigen Sicherungsdaten [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/test_db.sql #Sehen Sie sich die binären Protokolldateien und Protokollpunkte während der vollständigen Sicherung an [root@WB-BLOG ~]# cat bin_pos_2018-06-24.out Protokollname Dateigröße mysql-bin.000001 1497 mysql-bin.000002 397 #Konvertieren Sie die Binärprotokolldatei nach Punkt 861 in eine SQL-Datei [root@WB-BLOG bin]# ./mysqlbinlog /mysql_logs/mysql-bin.000002 --start-position=397 > /tmp/tmp.sql #Verwenden Sie den Vim-Editor, um diese SQL-Datei zu bearbeiten, suchen Sie die unbedingte UPDATE-Anweisung, löschen Sie sie und importieren Sie dann den SQL-Skriptinhalt, nachdem Sie die UPDATE-Anweisung in die Datenbank gelöscht haben [root@WB-BLOG bin]# vim /tmp/tmp.sql verwende `test_db`/*!*/; ZEITSTEMPEL FESTLEGEN=1522088753/*!*/; update student set name = 'admin' #Lösche diesen Satz [root@WB-BLOG bin]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql #Melden Sie sich bei der Datenbank an, um zu prüfen, ob die Daten wiederhergestellt wurden. Sie können prüfen, ob die versehentlich geänderten Daten wiederhergestellt wurden, dann die Tabelle entsperren und die Daten erneut vorbereiten. mysql> UNLOCK TABLES; (2) Beispiel für die Datenwiederherstellung in der Master-Slave-Architektur Umfeld Hauptdatenbank: 192.168.199.10 (node01) Stoppen Sie zuerst den SQL-Thread der Slave-Datenbank, sichern Sie dann alle Daten in der Slave-Datenbank und geben Sie die Informationen „SHOW SLAVE STATUS“ in die Sicherungsdatei ein. Die Ausgabeinformationen von „SHOW SLAVE STATUS“ zeichnen die Informationen der aktuellen Anwendung in der Master-Datenbank auf. #Melden Sie sich bei der Slave-Datenbank an und beenden Sie dann den SQL-Thread mysql> STOP SLAVE SQL_THREAD; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) # Notieren Sie dann die Binärprotokolldateiinformationen der aktuell in der Slave-Bibliothek angewendeten Master-Bibliothek [root@node02 mysql_data]# mysql -e "SHOW SLAVE STATUS \G" > slave_`date +%F`.info [root@node02 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --Datenbanken test_db --Routinen --Trigger --Einzeltransaktion > /tmp/mysql_test_db_`date +%F`.sql Nachdem die Sicherung auf dem Slave abgeschlossen ist, starten Sie den SQL-Thread des Slaves neu. mysql> STARTE SLAVE SQL_THREAD; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) Nachdem der SQL-Thread gestartet wurde, werden die DML-Vorgänge in der Masterdatenbank während des Sicherungszeitraums erneut mit der Slavedatenbank synchronisiert. Wenn in der Master-Datenbank ein Fehler auftritt und alle Daten in der Studententabelle aktualisiert werden, ohne Bedingungen hinzuzufügen, werden alle Daten in der Tabelle geändert. Zu diesem Zeitpunkt wird aufgrund des Synchronisierungsvorgangs auch die Slave-Datenbank geändert. #Melden Sie sich bei der Hauptdatenbank an, ändern Sie den externen Benutzer der Datenbank, sodass er vorübergehend keine Dienste bereitstellt, und rollen Sie dann das Protokoll mysql> UPDATE mysql.user SET Host = '127.0.0.1' WHERE User='tomcat'; Abfrage OK, 1 Zeile betroffen (0,00 Sek.) #Aktualisieren Sie die Berechtigungstabellemysql> FLUSH PRIVILEGES; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) #Rolling logmysql> LOGS LEEREN; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) #Übertragen Sie die Sicherungsdaten der Slave-Datenbank und die Slave-Informationen der Slave-Datenbank zum Zeitpunkt der Sicherung in die Master-Datenbank [root@node02 mysql_data]# scp /tmp/mysql_test_db_2018-06-24.sql 192.168.199.10:/root/ [root@node02 mysql_data]# scp slave_2018-06-24.info node01:/root/ Sichern Sie das Datenverzeichnis und das Binärprotokolldateiverzeichnis der Masterbibliothek [root@node01 mysql_logs]# tar zcvf mysql_master_data.tar.gz /mysql_data/* [root@node01 mysql_logs]# tar zcvf mysql_logs.tar.gz /mysql_logs/* Importieren Sie die Daten aus der aktuellsten Sicherung der Datenbank [root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/mysql_test_db_2018-03-26.sql #Hinweis: Der obige Vorgang kann die Tabelle der Hauptdatenbank nicht sperren, da sonst die vollständigen Sicherungsdaten nicht importiert werden können. Zeigen Sie den Namen und Speicherort der binären Protokolldatei der Master-Datenbank an, die zum Zeitpunkt der Sicherung aus der Slave-Datenbank übernommen wurde. [root@node01 mysql_logs]# cat /root/slave_2018-03-26.info Master_Log_File: master-bin.000002 #Der Name der binären Master-Logdatei, die während der Sicherung angewendet wurde Read_Master_Log_Pos: 395 #Der Speicherort der binären Master-Logdatei, die während der Sicherung angewendet wurde Ausgehend von dieser Protokolldatei und diesem Protokollpunkt konvertieren Sie die Protokolldateien nach Protokollpunkt 395 in SQL-Skripte. Wenn mehrere binäre Protokolldateien vorhanden sind, können diese gleichzeitig in SQL-Skripte konvertiert werden, wie unten gezeigt. [root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.000002 --start-position=395 > /tmp/tmp.sql #Fügen Sie master-bin.000003, master-bin.000004, master-bin.000005 in die Datei /tmp.sql ein [root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.00000{3,4,5} --start-position=395 > /tmp/tmp.sql Suchen Sie die fehlerhafte Update-Anweisung, löschen Sie sie und importieren Sie das inkrementelle SQL-Skript in die Datenbank [root@node01 mysql_logs]# vim /tmp/tmp.sql verwende `test_db`/*!*/; update student set name = 'admin' #Lösche diesen Satz [root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql Melden Sie sich bei der Datenbank an, um zu prüfen, ob die Daten normal sind und ob die versehentlich geänderten Daten wiederhergestellt wurden. Wenn sie wiederhergestellt wurden, sichern Sie die Daten in der Master-Datenbank und übertragen Sie sie dann in die Slave-Datenbank, um die Wiederherstellung der Slave-Datenbank abzuschließen. [root@node01 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --Datenbanken Test_DB --Routinen --Trigger --Einzeltransaktion --Master-Date=1 > /tmp/Master_Test_DB_`date +%F`.sql [root@node01 mysql_data]# scp /tmp/master_test_db_2018-06-24.sql node01:/root/ #Wenn die Slave-Datenbank auf schreibgeschützt eingestellt ist, müssen Sie zuerst die Schreibschutzbeschränkung entfernen mysql> SET GLOBAL read_only = OFF; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) #Daten aus der Datenbank importieren [root@node02 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/master_test_db_2018-06-24.sql # Nur-Lese-Slave aktivieren mysql> SET GLOBAL read_only = ON; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Da der Parameter --master-date=1 beim Sichern der Masterdatenbank hinzugefügt wurde, ist es nicht erforderlich, den Vorgang zum Ändern des Masters nach dem Importieren aus der Datenbank erneut auszuführen. Melden Sie sich bei der Slave-Datenbank an und prüfen Sie, ob die Informationen unter SHOW SLAVE STATUS normal sind. Wenn dies der Fall ist, melden Sie sich bei der Master-Datenbank an, ändern Sie die Autorisierungstabelle erneut und stellen Sie dann die Dienste extern bereit. mysql> UPDATE mysql.user setze Host = '192.168.0.%' WHERE Benutzer = 'tomcat'; mysql> FLUSH-PRIVILEGIEN; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Nach Abschluss der Ausführung werden die Master-Slave-Daten wiederhergestellt. Damit ist die Einführung in die Datenwiederherstellung abgeschlossen. Oben wird der Datenwiederherstellungsprozess einer Einzelinstanzdatenbank und einer Master-Slave-Datenbank mithilfe einer vollständigen Sicherung plus Binärprotokoll vorgestellt. Wenn Sie Fragen haben, kommentieren Sie diese bitte und weisen Sie darauf hin. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützt. Das könnte Sie auch interessieren:
|
<<: Detaillierte Erläuterung der Ideen zur Fehlerbehebung bei PHP+nginx-Dienstfehlern 500 502
>>: Drei Vererbungsmethoden in JavaScript
Inhaltsverzeichnis 1. Was ist eine doppelt verknü...
Inhaltsverzeichnis Vorwort Untersuchung vor Ort G...
Laut canisue (http://caniuse.com/#search=border-r...
In diesem Artikel wird der spezifische JS-Code zu...
Überlauf ausblenden Damit ist gemeint, dass Text-...
In diesem Artikelbeispiel wird der spezifische Co...
Der Dateiserver ist einer der am häufigsten verwe...
Das Vue-Projekt implementiert eine aktualisierte ...
Inhaltsverzeichnis JS erhält den Inhalt der TXT-D...
In diesem Artikel wird der spezifische Code von v...
Bevor wir über die CSS-Priorität sprechen, müssen...
Im vorherigen Blog hat Xiao Xiong die Methoden ve...
Häufige Anwendungsszenarien Die Schnittstellen ak...
1. Im vorherigen Kapitel haben wir gelernt, dass ...
Vorwort: In MySQL wird die Funktion CONCAT() verw...