Eine schnelle Lösung zum versehentlichen Löschen von MySQL-Daten (MySQL Flashback Tool)

Eine schnelle Lösung zum versehentlichen Löschen von MySQL-Daten (MySQL Flashback Tool)

Überblick

Binlog2sql ist ein Open-Source-MySQL-Binlog-Parsing-Tool, das in Python entwickelt wurde. Es kann Binlog in Original-SQL parsen. Es unterstützt auch das Parsen von Binlog in Rollback-SQL und das Entfernen des INSERT-SQL des Primärschlüssels. Es ist ein guter Helfer für DBAs und Betriebs- und Wartungspersonal bei der Datenwiederherstellung.

1. Installation und Konfiguration

1.1 Zweck

Schnelles Daten-Rollback (Flashback)
Reparatur verlorener Daten auf dem neuen Master nach Master-Slave-Wechsel Generierung von Standard-SQL aus Binlog und den abgeleiteten Funktionen Unterstützung von MySQL 5.6 und 5.7

1.2 Installation

Shell> Git-Klon https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
Shell> pip install -r Anforderungen.txt

2. Nutzung

2.1 Konfiguration vor der Verwendung

2.1.1 Parameterkonfiguration

[mysqld] 
Server-ID = 1 
log_bin = /var/log/mysql/mysql-bin.log 
max_binlog_size = 1 G 
binlog_format = Zeile 
binlog_row_image = voll

2.1.2 Mindestanzahl an Berechtigungen, die der Benutzer benötigt

Auswählen, Super-/Replikationsclient, Replikations-Slave

Empfohlene Autorisierung

Auswählen, Super-/Replikationsclient, Replikations-Slave

Berechtigungen

  • select: Sie müssen die Tabelle information_schema.COLUMNS auf der Serverseite lesen, die Metadaten der Tabellenstruktur abrufen und sie in eine visuelle SQL-Anweisung einfügen.
  • Super-/Replikationsclient: Beide Berechtigungen sind verfügbar. Sie müssen „SHOW MASTER STATUS“ ausführen, um die Binlog-Liste auf der Serverseite abzurufen.
  • Replikations-Slave: Erhalten Sie die Berechtigung zum Binlog-Inhalt über das BINLOG_DUMP-Protokoll

2.2 Grundlegende Verwendung

2.2.1 Grundlegende Verwendung

Standard-SQL analysieren

Shell> Python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -t test3 test4 --start-file='mysql-bin.000002'

Ausgabe:

INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'englisch', 4); #start 570 end 736 
UPDATE `test`.`test3` SET `addtime`='2016-12-10 12:00:00', `data`='中文', `id`=3 WHERE `addtime`='2016-12-10 13:03:22' AND `data`='中文' AND `id`=3 LIMIT 1; #start 763 end 954 
LÖSCHEN AUS `test`.`test3`, WO `addtime`='2016-12-10 13:03:38' UND `data`='english' UND `id`=4 LIMIT 1; #start 981 end 1147

Analysieren Sie das Rollback-SQL

Shell> Python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttest3 --start-file='mysql-bin.000002' --start-position=763 --stop-position=1147

Ausgabe:

INSERT INTO `test`.`test3`(`addtime`, `data`, `id`) VALUES ('2016-12-10 13:03:38', 'englisch', 4); #start 981 end 1147 
UPDATE `test`.`test3` SET `addtime`='2016-12-10 13:03:22', `data`='中文', `id`=3 WHERE `addtime`='2016-12-10 12:00:00' AND `data`='中文' AND `id`=3 LIMIT 1; #start 763 end 954

2.2.2 Optionen

MySQL-Verbindungskonfiguration

-h Host; -P Port; -u Benutzer; -p Passwort

Parsing-Modus

--stop-never Fahren Sie mit der Analyse des Binärprotokolls fort. Optional. Der Standardwert ist „False“, was bedeutet, dass bei Ausführung des Befehls eine Synchronisierung mit der neuesten Binärprotokollposition erfolgt.

-K, --no-primary-key Entfernt den Primärschlüssel aus INSERT-Anweisungen. Optional. Standardmäßig: False

-B, --flashback generiert Rollback-SQL, kann große Dateien analysieren und ist nicht durch den Speicher begrenzt. Optional. Der Standardwert ist „False“. Es kann nicht gleichzeitig mit „stop-never“ oder „no-primary-key“ hinzugefügt werden.

--back-interval -B-Modus, jedes Mal, wenn tausend Rollback-SQL-Zeilen gedruckt werden, wird für eine bestimmte Anzahl von Sekunden eine SLEEP-Anweisung hinzugefügt. Wenn Sie SLEEP nicht hinzufügen möchten, setzen Sie es bitte auf 0. Optional. Der Standardwert ist 1,0.

Steuerung des Auflösungsbereichs

--start-file: Für die Startanalysedatei ist nur der Dateiname erforderlich, kein vollständiger Pfad. muss.

--start-position/--start-pos Startposition der Analyse. Optional. Die Standardeinstellung ist die Startposition der Startdatei.

--stop-file/--end-file Stoppt die Dateianalyse. Optional. Standardmäßig ist die gleiche Datei als Startdatei festgelegt. Wenn der Analysemodus „Stop-Never“ ist, hat diese Option keine Wirkung.

--stop-position/--end-pos Stoppt die Analyse der Position. Optional. Der Standardwert ist die letzte Position der Stoppdatei. Wenn der Analysemodus „Stop-Never“ ist, ist diese Option ungültig.

--start-datetime Beginn der Analysezeit, Format „%Y-%m-%d %H:%M:%S“. Optional. Standardmäßig keine Filterung.

--stop-datetime Stoppt die Analysezeit im Format „%Y-%m-%d %H:%M:%S“. Optional. Standardmäßig keine Filterung.

Objektfilterung

-d, --databases analysiert nur das SQL der Zieldatenbank. Mehrere Datenbanken werden durch Leerzeichen getrennt, z. B. -d db1 db2. Optional. Der Standardwert ist leer.

-t, --tables analysiert nur das SQL der Zieltabelle. Mehrere Tabellen werden durch Leerzeichen getrennt, z. B. -t tbl1 tbl2. Optional. Der Standardwert ist leer.

--only-dml Nur DML analysieren, DDL ignorieren. Optional. Der Standardwert ist „False“.

--sql-type analysiert nur den angegebenen Typ und unterstützt INSERT, UPDATE und DELETE. Mehrere Typen werden durch Leerzeichen getrennt, beispielsweise --sql-type INSERT DELETE. Optional. Standardmäßig werden alle Hinzufügungen, Löschungen und Änderungen analysiert. Wenn dieser Parameter verwendet wird, aber kein Typ eingegeben wird, wird keiner der drei analysiert.

2.3 Anwendungsfälle

2.3.1 Die gesamten Tabellendaten wurden versehentlich gelöscht und ein Notfall-Rollback ist erforderlich

Eine ausführliche Einführung in Flashback finden Sie unter „Flashback Principle and Practice“ im Beispielverzeichnis example/mysql-flashback-priciple-and-practice.md

Die Originaldaten der TBL-Tabelle in der Testbibliothek

mysql> wähle * aus tbl; 
+----+--------+---------------------+ 
| ID | Name | Addzeit | 
+----+--------+---------------------+ 
| 1 | Xiao Zhao | 10.12.2016 00:04:33 | 
| 2 | Xiaoqian | 10.12.2016 00:04:48 | 
| 3 | Xiaosun | 13.12.2016 20:25:00 | 
| 4 | Xiao Li | 12.12.2016 00:00:00 | 
+----+--------+---------------------+ 
4 Zeilen im Satz (0,00 Sek.) 
​ 
mysql> aus Tabelle löschen; 
Abfrage OK, 4 Zeilen betroffen (0,00 Sek.) 
​ 
Um 20:28 wurde die Tbl-Tabelle aufgrund eines Fehlers gelöscht.mysql> select * from tbl; 
Leerer Satz (0,00 Sek.)

Schritte zum Wiederherstellen von Daten:

1. Melden Sie sich bei MySQL an und zeigen Sie die aktuelle Binlog-Datei an

mysql> Masterstatus anzeigen; 
+------------------+------------+ 
| Protokollname | Dateigröße | 
+------------------+------------+ 
|mysql-bin.000051 | 967 | 
|mysql-bin.000052 | 965 | 
+------------------+------------+

2. Die neueste Binärprotokolldatei ist mysql-bin.000052. Suchen wir den Binärprotokollspeicherort der fehlerhaften SQL-Operation. Die Person, die den Fehler gemacht hat, kann nur den ungefähren Zeitpunkt des Fehlers kennen, daher filtern wir die Daten basierend auf der ungefähren Zeit.

Shell> Python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='2016-12-13 20:25:00' --stop-datetime='2016-12-13 20:30:00'

Ausgabe:

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:26:00', 4, 'Xiao Li'); #Start 317 Ende 487 Zeit 2016-12-13 20:26:26 
UPDATE `test`.`tbl` SET `addtime`='2016-12-12 00:00:00', `id`=4, `name`='Xiao Li' WHERE `addtime`='2016-12-13 20:26:00' AND `id`=4 AND `name`='Xiao Li' LIMIT 1; #Start 514 Ende 701 Zeit 2016-12-13 20:27:07 
LÖSCHEN AUS `test`.`tbl`, WO `addtime`='2016-12-10 00:04:33' UND `id`=1 UND `name`='小赵' LIMIT 1; #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
LÖSCHEN AUS `test`.`tbl`, WO `addtime`='2016-12-10 00:04:48' UND `id`=2 UND `name`='小钱' LIMIT 1; #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
LÖSCHEN AUS `test`.`tbl`, WO `addtime`='2016-12-13 20:25:00' UND `id`=3 UND `name`='Name' LIMIT 1; #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
LÖSCHEN AUS `test`.`tbl`, WO `addtime`='2016-12-12 00:00:00' UND `id`=4 UND `name`='Xiao Li' LIMIT 1; #Start 728 Ende 938 Zeit 2016-12-13 20:28:05

3. Wir haben festgestellt, dass der genaue Speicherort des falschen SQL zwischen 728 und 938 liegt. Wir filtern weiter basierend auf dem Speicherort, verwenden den Flashback-Modus, um das Rollback-SQL zu generieren, und prüfen, ob das Rollback-SQL korrekt ist (Hinweis: In einer realen Umgebung filtert dieser Schritt häufig das erforderliche SQL weiter heraus. Kombiniert mit grep, Editor usw.)

Shell> Python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-position=3346 --stop-position=3556 -B > rollback.sql | Katze

Ausgabe:

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-12 00:00:00', 4, 'Xiao Li'); #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-13 20:25:00', 3, 'Datei'); #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:48', 2, 'Datei'); #Start 728 Ende 938 Zeit 2016-12-13 20:28:05 
INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('2016-12-10 00:04:33', 1, 'Xiao Zhao'); #Start 728 Ende 938 Zeit 2016-12-13 20:28:05

4. Bestätigen Sie, dass das Rollback-SQL korrekt ist, und führen Sie die Rollback-Anweisung aus. Melden Sie sich bei MySQL an, um zu bestätigen, dass das Daten-Rollback erfolgreich war.

Shell> mysql -h127.0.0.1 -P3306 -uadmin -p'admin' < rollback.sql 
​ 
mysql> wähle * aus tbl; 
+----+--------+---------------------+ 
| ID | Name | Addzeit | 
+----+--------+---------------------+ 
| 1 | Xiao Zhao | 10.12.2016 00:04:33 | 
| 2 | Xiaoqian | 10.12.2016 00:04:48 | 
| 3 | Xiaosun | 13.12.2016 20:25:00 | 
| 4 | Xiao Li | 12.12.2016 00:00:00 | 
+----+--------+---------------------+

Abschluss

3.1 Einschränkungen (im Vergleich zu mysqlbinlog)

MySQL-Server muss gestartet sein, er kann im Offline-Modus nicht analysiert werden

Der Parameter binlog_row_image muss FULL sein. MINIMAL wird noch nicht unterstützt.

Die Analysegeschwindigkeit ist nicht so schnell wie bei mysqlbinlog

3.2 Vorteile (im Vergleich zu mysqlbinlog)

Reine Python-Entwicklung, einfach zu installieren und zu verwenden

Integrierte Flashback- und No-Primary-Key-Parsing-Modi, keine Installation von Patches erforderlich

Im Flashback-Modus ist es besser für Flashback-Kämpfe geeignet.

Parsen in Standard-SQL zum leichteren Verständnis und Screening

Der Code lässt sich leicht ändern und kann eine individuellere Analyse unterstützen

Zusammenfassen

Das Obige ist eine schnelle Lösung für das vom Editor eingeführte Problem des versehentlichen Löschens von MySQL-Daten. Ich hoffe, es wird allen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Binlog-Protokollanalysetools zur Überwachung von MySQL: Canal
  • 5 MySQL-GUI-Tools, die Ihnen bei der Datenbankverwaltung empfohlen werden
  • Detaillierte Erklärung des MySQL-Überwachungstools mysql-monitor
  • Eine detaillierte Einführung in den Aufbau und die Verwendung des Tools Anemometer zeigt MySQL Slow Logs grafisch an
  • So verwenden Sie MySQL-Stresstest-Tools
  • Das Pycharm-Tool konnte keine Verbindung zur MySQL-Datenbank herstellen
  • So reparieren Sie beschädigte MySQL-Datenbankdateien schnell mit den Tools myisamchk und mysqlcheck
  • Analyse von Mysql-Datenmigrationsmethoden und -Tools
  • Das KTL-Tool realisiert die Methode zum Synchronisieren von Daten von MySQL zu MySQL
  • So stellen Sie eine Verbindung zum MySQL-Visualisierungstool Navicat her
  • Empfehlen Sie mehrere MySQL-bezogene Tools

<<:  JavaScript zur Implementierung eines einfachen Web-Rechners

>>:  So lösen Sie das Problem, dass bei der Installation von VMware-Tools unter VMware die Installationsdatei nicht angezeigt wird

Artikel empfehlen

Der Browser der Betaversion IE9 unterstützt HTML5/CSS3

Manche Leute sagen, dass IE9 die zweite Revolutio...

Einfache Implementierungsmethode der Vue3-Quellcodeanalyse

Inhaltsverzeichnis Vorwort 🍹Vorbereitung 🍲vue3-Nu...

Lösungen für Probleme bei der Verwendung von addRoutes in Vue-Projekten

Inhaltsverzeichnis Vorwort 1. 404 Seite 1. Ursach...

Ein Beispiel für die Implementierung eines adaptiven Quadrats mit CSS

Die traditionelle Methode besteht darin, ein Quad...

Zusammenfassung der Wissenspunkte zur MySQL-Master-Slave-Replikation

Eine Optimierungslösung, wenn ein einzelner MySQL...

Detaillierte Anweisungen zur Installation der MySQL5.7-Datenbank unter Centos7.2

Das MySQL auf dem Server ist in der Version 8.0.1...

Vue implementiert das Methodenbeispiel der Tab-Routing-Umschaltkomponente

Vorwort In diesem Artikel wird die Verwendung des...

So stellen Sie ein SpringBoot-Projekt mit Dockerfile bereit

1. Erstellen Sie ein SpringBoot-Projekt und packe...

Detaillierte Erklärung der JQuery-Datagrid-Abfrage

Inhaltsverzeichnis Fügen Sie dem Tree-Element Cod...

Docker stellt eine MySQL-Remoteverbindung bereit, um 2003-Probleme zu lösen

Herstellen einer Verbindung mit MySQL Hier verwen...

CSS-Lösung für mehrspaltiges Layout

1. Feste Breite + adaptiv Erwarteter Effekt: fest...

Einfaches Beispiel für HTML-Textformatierung (ausführliche Erklärung)

1. Textformatierung: Dieses Beispiel zeigt, wie T...