Erläutern Sie das Binlog-Protokoll von MySQL und wie Sie das Binlog-Protokoll zum Wiederherstellen von Daten verwenden

Erläutern Sie das Binlog-Protokoll von MySQL und wie Sie das Binlog-Protokoll zum Wiederherstellen von Daten verwenden

Wie wir alle wissen, sind Binlog-Protokolle für MySQL-Datenbanken sehr wichtig. Im Notfall eines Datenverlusts denken wir oft daran, die Binlog-Protokollfunktion zur Datenwiederherstellung zu verwenden (geplante vollständige Sicherung + Binlog-Protokollwiederherstellung inkrementeller Daten), um Gefahren zu vermeiden!

Ohne weitere Umschweife hier nun die Erklärung der Binlog-Protokollvorgänge:

1. Vorläufiges Verständnis von Binlog

Das Binärprotokoll von MySQL, binlog, kann als das wichtigste Protokoll von MySQL bezeichnet werden. Es zeichnet alle DDL- und DML-Anweisungen (außer Datenabfrageanweisungen select) in Form von Ereignissen auf und enthält auch die für die Ausführung der Anweisungen benötigte Zeit. Das Binärprotokoll von MySQL ist transaktionssicher.
------------------------------------------------------------------------------------------------------------------------------------------------------------
DDL
----Datendefinitionssprache Die wichtigsten Befehle der Datenbankdefinitionssprache sind CREATE, ALTER, DROP usw. DDL wird hauptsächlich verwendet, um die Struktur der Tabelle (TABLE), den Datentyp, Links und Einschränkungen zwischen Tabellen und andere Initialisierungsarbeiten zu definieren oder zu ändern. Sie werden hauptsächlich beim Erstellen von Tabellen verwendet.

DML
----Datenmanipulationssprache Die wichtigsten Befehle der Datenmanipulationssprache sind SELECT, UPDATE, INSERT und DELETE. Wie der Name schon sagt, werden diese vier Befehle verwendet, um die Daten in der Datenbank zu bearbeiten.
------------------------------------------------------------------------------------------------------------------------------------------------------------

Die allgemeinen Optionen für mysqlbinlog sind wie folgt:

--start-datetime: Liest aus dem Binärprotokoll eine Zeit, die gleich oder später als der Zeitstempel des lokalen Computers ist.

--stop-datetime: Liest aus dem Binärlog einen Zeitwert, der kleiner als der Zeitstempel oder gleich der Zeit des lokalen Computers ist. Der Wert ist derselbe wie oben.

--start-position: Liest die angegebene Position des Positionsereignisses aus dem Binärprotokoll als Start.

--stop-position: Liest als Ereignisende die angegebene Ereignisposition aus dem Binärlog

*********************************************************************

Im Allgemeinen führt das Aktivieren von Binlog zu einem Leistungsverlust von etwa 1 %.

Für Binlog-Protokolle gibt es zwei wichtige Verwendungsszenarien:

1) MySQL Master-Slave-Replikation : MySQL Replication startet das Binärprotokoll auf der Masterseite und der Master übergibt sein Binärprotokoll an die Slaves, um
Der Zweck der Master-Slave-Datenkonsistenz.

2) Natürlich werden die Daten mithilfe des Tools mysqlbinlog wiederhergestellt .

Das Binlog-Protokoll umfasst zwei Dateitypen:

1) Die Binärprotokoll-Indexdatei ( Dateinamenserweiterung ist .index ) wird zum Aufzeichnen aller Binärdateien verwendet

2) Binäre Protokolldateien ( Dateinamenserweiterung .00000* ) zeichnen alle DDL- und DML-Anweisungsereignisse (außer Select-Anweisungen zur Datenabfrage) in der Datenbank auf.

2. Öffnen Sie das Binlog-Protokoll:

1) Bearbeiten und öffnen Sie die MySQL-Konfigurationsdatei /etc/mys.cnf

[root@vm-002 ~]# vim /etc/my.cnf
Fügen Sie im Abschnitt [mysqld] hinzu
log-bin=mysql-bin bestätigt, dass es eingeschaltet ist (mysql-bin ist der Basisname oder Präfixname des Protokolls);

2) Starten Sie den mysqld-Dienst neu, damit die Konfiguration wirksam wird

[root@vm-002 ~]# /etc/init.d/mysqld stoppen
[root@vm-002 ~]# /etc/init.d/mysqld neu starten
Stoppen von mysqld: [ OK ]
mysqld wird gestartet: [ OK ]

3) Überprüfen Sie, ob Binlog aktiviert ist

mysql> Variablen wie „log_%“ anzeigen;
+---------------------------------+---------------------+
| Variablenname | Wert |
+---------------------------------+---------------------+
| log_bin | EIN |
| log_bin_trust_function_creators | AUS |
| log_bin_trust_routine_creators | AUS |
| log_fehler | /var/log/mysqld.log |
| log_ausgabe | DATEI |
| log_queries_not_using_indexes | AUS |
| log_slave_updates | AUS |
| log_slow_queries | AUS |
| log_warnungen | 1 |
+---------------------------------+---------------------+
9 Zeilen im Satz (0,00 Sek.)

3. Häufig verwendete Binlog-Protokolloperationsbefehle

1) Alle Binlog-Loglisten anzeigen

mysql> Master-Protokolle anzeigen;
+------------------+------------+
| Protokollname | Dateigröße |
+------------------+------------+
|mysql-bin.000001 | 149 |
|mysql-bin.000002 | 4102 |
+------------------+------------+
2 Zeilen im Satz (0,00 Sek.)

2) Überprüfen Sie den Masterstatus, d. h. den Nummernnamen des letzten (neuesten) Binlog-Protokolls und den POS-Endpunktwert seines letzten Operationsereignisses

mysql> Masterstatus anzeigen;
+------------------+----------+--------------+------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 4102 | | |
+------------------+----------+--------------+------------------+
1 Zeile im Satz (0,00 Sek.)

3) Flush aktualisiert das Protokoll und generiert ab diesem Zeitpunkt eine neue nummerierte Binlog-Protokolldatei

mysql> Protokolle leeren;
Abfrage OK, 0 Zeilen betroffen (0,13 Sek.)

mysql> Master-Protokolle anzeigen;
+------------------+------------+
| Protokollname | Dateigröße |
+------------------+------------+
|mysql-bin.000001 | 149 |
|mysql-bin.000002 | 4145 |
|mysql-bin.000003 | 106 |
+------------------+------------+
3 Zeilen im Satz (0,00 Sek.)

Beachten:

Immer wenn der mysqld-Dienst neu gestartet wird, wird dieser Befehl automatisch ausgeführt, um das Binlog-Protokoll zu aktualisieren. Wenn Sie beim Sichern von Daten mit mysqldump die Option -F hinzufügen, wird das Binlog-Protokoll ebenfalls aktualisiert.

4) Alle Binlog-Protokolle zurücksetzen (löschen)

mysql> Master zurücksetzen;
Abfrage OK, 0 Zeilen betroffen (0,12 Sek.)

mysql> Master-Protokolle anzeigen;
+------------------+------------+
| Protokollname | Dateigröße |
+------------------+------------+
|mysql-bin.000001 | 106 |
+------------------+------------+
1 Zeile im Satz (0,00 Sek.)

4. Es gibt zwei gängige Möglichkeiten, den Inhalt des Binlog-Protokolls anzuzeigen:

1) Verwenden Sie die in mysqlbinlog integrierte Anzeigebefehlsmethode:

Beachten:

-->binlog ist eine Binärdatei. Gewöhnliche Dateibetrachter wie cat, more und vim können sie nicht öffnen. Sie müssen den integrierten Befehl mysqlbinlog verwenden, um sie anzuzeigen.

-->binlog-Log- und Datenbankdateien liegen im selben Verzeichnis

-->Wenn bei Verwendung des Befehls mysqlbinlog in MySQL-Versionen unter 5.5 ein Fehler auftritt, fügen Sie die Option „--no-defaults“ hinzu

Überprüfen Sie das MySQL-Datenspeicherverzeichnis. Aus den folgenden Ergebnissen können wir ersehen, dass es /var/lib//mysql ist

[root@vm-002 ~]# ps -ef|grep mysql
root 9791 1 0 21:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/ lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9896 9791 0 21:18 Punkte/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 9916 9699 0 21:18 pts/0 00:00:00 mysql -px xxxx
root 9919 9715 0 21:23 Punkte/1 00:00:00 grep --color mysql

[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock Ops-Test

Verwenden Sie den Befehl mysqlbinlog, um den Inhalt des Binlog-Protokolls anzuzeigen. Nachfolgend sehen Sie eine Ausschnittanalyse:
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000002
..............
# bei 624
#160925 21:29:53 Server-ID 1 End-Log-Pos 796 Abfrage Thread-ID = 3 Exec-Zeit = 0 Fehlercode = 0
ZEITSTEMPEL EINSTELLEN=1474810193/*!*/;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2') #Ausgeführte SQL-Anweisung
/*!*/;
# bei 796
#160925 21:29:53 Server-ID 1 end_log_pos 823 Xid = 17 #Ausführungszeit
.............

erklären:

Server-ID 1: die Servicenummer des Datenbank-Hosts;
end_log_pos 796: POS-Knoten am Ende von SQL
thread_id=11: Threadnummer

2) Die obige Methode liest mehr Volltext der Binlog-Protokolle und es ist nicht einfach, die POS-Punktinformationen zu unterscheiden und anzuzeigen

Hier ist ein bequemerer Abfragebefehl:

Befehlsformat:

mysql> Binlog-Ereignisse anzeigen [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

Parametererklärung:

IN 'log_name': Geben Sie den Namen der abzufragenden Binlog-Datei an (wenn nicht angegeben, ist es die erste Binlog-Datei).
FROM pos: Geben Sie den Startpunkt der Suche an (wenn nicht angegeben, wird am ersten Pos-Punkt der gesamten Datei begonnen)
LIMIT [Offset,]: Offset (0, wenn nicht angegeben)
row_count: Abfrage der Gesamtzahl der Zeilen (alle Zeilen, wenn nicht angegeben)

mysql> Master-Protokolle anzeigen;
+------------------+------------+
| Protokollname | Dateigröße |
+------------------+------------+
|mysql-bin.000001 | 125 |
|mysql-bin.000002 | 823 |
+------------------+------------+
2 Zeilen im Satz (0,00 Sek.)

mysql> Binlog-Ereignisse in „mysql-bin.000002“ anzeigen\G;
*************************** 1. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 4
Event_type: Format_desc
Server-ID: 1
End_log_pos: 106
Info: Serverversion: 5.1.73-log, Binlogversion: 4
*************************** 2. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 106
Event_type: Abfrage
Server-ID: 1
End_log_pos: 188
Info: Verwenden Sie „ops“; löschen Sie die Tabelle „Kunden“
*************************** 3. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 188
Event_type: Abfrage
Server-ID: 1
End_log_pos: 529
Info: verwenden Sie `ops`; CREATE TABLE IF NOT EXISTS `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NICHT NULL,
`Geschlecht` enum('m','w') NICHT NULL STANDARD 'm',
`Alter` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB STANDARD-CHARSET=utf8
*************************** 4. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 529
Event_type: Abfrage
Server-ID: 1
End_log_pos: 596
Info: BEGIN
*************************** 5. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 596
Ereignistyp: Intvar
Server-ID: 1
End_log_pos: 624
Info: INSERT_ID=1
*************************** 6. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 624
Event_type: Abfrage
Server-ID: 1
End_log_pos: 796
Info: Verwenden Sie „ops“. Fügen Sie in das Mitglied („Name“, „Geschlecht“, „Alter“, „Klassen-ID“) Werte ein („wangshibo“, „m“, 27, „cls1“), („guohuihui“, „w“, 27, „cls2“).
*************************** 7. Reihe ***************************
Protokollname: mysql-bin.000002
Position: 796
Ereignistyp: Xid
Server-ID: 1
End_log_pos: 823
Informationen: COMMIT /* xid=17 */
7 Zeilen im Satz (0,00 Sek.)

FEHLER:
Keine Abfrage angegeben

MySQL>

Die obige Anweisung kann die angegebene Binlog-Protokolldatei in Form gültiger Ereigniszeilen zurückgeben und mithilfe von „Limit“ den Startversatz des POS-Punkts angeben, um die Anzahl der Einträge abzufragen!
Nachfolgend sehen Sie ein Beispiel für die Funktionsweise:

a) Fragen Sie das erste (früheste) Binlog-Protokoll ab:

mysql> Binlog-Ereignisse anzeigen\G;

b) Abfrage der Datei mysql-bin.000002:

mysql> Binlog-Ereignisse in „mysql-bin.000002“ anzeigen\G;

c) Geben Sie die Abfragedatei mysql-bin.000002 an, beginnend bei POS-Punkt: 624:

mysql> zeige Binlog-Ereignisse in „mysql-bin.000002“ von 624\G;

d) Geben Sie an, dass die Datei mysql-bin.000002 abgefragt werden soll, beginnend bei Positionspunkt 624, und fragen Sie 10 Datensätze ab (also 10 Anweisungen).

mysql> zeige Binlog-Ereignisse in „mysql-bin.000002“ ab 624 Limit 10\G;

e) Geben Sie die Abfragedatei mysql-bin.000002 an, starten Sie die Abfrage ab Positionspunkt: 624, verschieben Sie 2 Zeilen (d. h. überspringen Sie 2 in der Mitte) und fragen Sie 10 Datensätze ab

mysql> zeige Binlog-Ereignisse in „mysql-bin.000002“ ab 624 Limit 2,10\G;

5. Verwenden Sie das Binlog-Protokoll, um MySQL-Daten wiederherzustellen

Die folgenden Operationen werden an der Member-Tabelle der Ops-Bibliothek durchgeführt

mysql> Ops verwenden;
mysql> CREATE TABLE IF NOT EXISTS `member` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `name` varchar(16) NICHT NULL,
-> `Geschlecht` enum('m','w') NICHT NULL STANDARD 'm',
-> `Alter` tinyint(3) unsigned NOT NULL,
-> `classid` char(6) DEFAULT NULL,
-> PRIMÄRSCHLÜSSEL (`id`)
->) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Abfrage OK, 0 Zeilen betroffen (0,10 Sek.)

mysql> Tabellen anzeigen;
+-----------------+
| Tabellen_in_Ops |
+-----------------+
| Mitglied |
+-----------------+
1 Zeile im Satz (0,00 Sek.)

mysql> desc-Mitglied;
+---------+---------------------+------+-----+---------+----------------+
| Feld | Typ | Null | Schlüssel | Standard | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NEIN | PRI | NULL | auto_increment |
| Name | varchar(16) | NEIN | | NULL | |
| Geschlecht | Aufzählung('m','w') | NEIN | | m | |
| Alter | tinyint(3) unsigniert | NEIN | | NULL | |
| Klassen-ID | char(6) | JA | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
5 Zeilen im Satz (0,00 Sek.)

Geben Sie vorab zwei Daten ein

mysql> einfügen in Mitglied(`Name`,`Geschlecht`,`Alter`,`Klassen-ID`) Werte('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
Abfrage OK, 2 Zeilen betroffen (0,08 Sek.)
Datensätze: 2 Duplikate: 0 Warnungen: 0
mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+----------+-----+-----+---------+
2 Zeilen im Satz (0,00 Sek.)

Beginnen wir mit der Szenensimulation:

1)

Die Ops-Bibliothek führt täglich um 4 Uhr morgens eine geplante vollständige Sicherungsaufgabe wie folgt aus:
[root@vm-002 ~]# crontab -l
0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz

Hier ist eine manuelle Ausführung zum Sichern der Ops-Datenbank in der Datei /opt/backup/ops_$(date +%F).sql.gz:
[root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date +%F).sql.gz
Passwort eingeben:
[root@vm-002 ~]# ls /opt/backup/
ops_2016-09-25.sql.gz
-----------------

Parameterbeschreibung:

-B: Datenbank angeben
-F: Protokoll aktualisieren
-R: Sicherungsspeichervorgang usw.
-x: Tabelle sperren
--master-data: Fügen Sie der Sicherungsanweisung die Anweisung CHANGE MASTER sowie die Binärprotokolldatei und Standortinformationen hinzu
-----------------

Sobald die Datenbanksicherung abgeschlossen ist, müssen Sie sich keine Sorgen mehr über Datenverlust machen, da vollständige Sicherungsdaten vorliegen! !

Da die Option -F in der obigen vollständigen Sicherung verwendet wird, aktualisiert das System das Protokoll automatisch, wenn der Datensicherungsvorgang beginnt, sodass automatisch ein neues Binlog-Protokoll generiert wird. Dieses neue Binlog-Protokoll wird verwendet, um die Datenbankvorgänge „Hinzufügen, Löschen und Ändern“ nach der Sicherung aufzuzeichnen.

Hör zu:

mysql> Masterstatus anzeigen;
+------------------+----------+--------------+------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 106 | | |
+------------------+----------+--------------+------------------+
1 Zeile im Satz (0,00 Sek.)

Das heißt, mysql-bin.000003 wird verwendet, um alle „Hinzufügen-, Löschen- und Ändern“-Vorgänge in der Datenbank nach 4:00 Uhr aufzuzeichnen.

2)

Ich gehe morgens um 9 Uhr zur Arbeit. Aus geschäftlichen Gründen werden verschiedene „Hinzufügen-, Löschen- und Ändern“-Vorgänge an der Datenbank ausgeführt.

Beispielsweise werden Daten in die Mitgliedertabelle unter der Ops-Datenbank eingefügt oder geändert:

Geben Sie zunächst morgens die Daten ein:

mysql> einfügen in ops.member(`Name`,`Geschlecht`,`Alter`,`Klassen-ID`) Werte('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
Abfrage OK, 5 Zeilen betroffen (0,08 Sek.)
Datensätze: 5 Duplikate: 0 Warnungen: 0

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)

3)

Mittags wurde die Datenänderungsoperation erneut durchgeführt:

mysql> aktualisiere ops.member set name='Element', wobei id=4 ist;
Abfrage OK, 1 Zeile betroffen (0,07 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

mysql> aktualisiere ops.member set name='Element', wobei id=2 ist;
Abfrage OK, 1 Zeile betroffen (0,06 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | Xiaoer | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | Li Si | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)

4)

Um 18:00 Uhr kam es auf unerklärliche Weise zu einer Tragödie!

Ich habe versehentlich die Drop-Anweisung ausgeführt und die Ops-Bibliothek direkt gelöscht! Zu Tode erschrocken!
mysql> Datenbankoperationen löschen;
Abfrage OK, 1 Zeile betroffen (0,02 Sek.)

5)

Geraten Sie in solchen Momenten nicht in Panik! ! !

Überprüfen Sie zunächst sorgfältig das letzte Binlog-Protokoll und notieren Sie die wichtigsten POS-Punkte. Welcher POS-Punktvorgang hat die Datenbank beschädigt (normalerweise in den letzten Schritten)?

Sichern Sie zuerst die letzte Binlog-Protokolldatei:
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# cp -v mysql-bin.000003 /opt/backup/
`mysql-bin.000003' -> `/opt/backup/mysql-bin.000003'
[root@vm-002 mysql]# ls /opt/backup/
mysql-bin.000003 ops_2016-09-25.sql.gz

Führen Sie dann einen Vorgang zum Aktualisieren des Protokollindex aus und starten Sie eine neue Binlog-Protokolldatei neu. Es liegt auf der Hand, dass mysql-bin.000003

In diese Datei wird nicht erneut geschrieben, da es für uns praktisch ist, die Ursache zu analysieren und den Ops-Knoten zu finden. Alle Datenbankvorgänge werden in Zukunft in die nächste Protokolldatei geschrieben.

mysql> Protokolle leeren;
Abfrage OK, 0 Zeilen betroffen (0,13 Sek.)

mysql> Masterstatus anzeigen;
+------------------+----------+--------------+------------------+
| Datei | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 106 | | |
+------------------+----------+--------------+------------------+
1 Zeile im Satz (0,00 Sek.)

6)

Lesen Sie das Binlog-Protokoll und analysieren Sie das Problem.
Die Methode zum Lesen von Binlog-Protokollen wurde oben erwähnt.

Methode 1: Verwenden Sie mysqlbinlog, um Binlog-Protokolle zu lesen:

[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003

Methode 2: Beim Server anmelden und anzeigen (empfohlen)

mysql> Binlog-Ereignisse in „mysql-bin.000003“ anzeigen;

+------------------+-----+----------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------+
| Logname | Pos | Ereignistyp | Server-ID | End_log_pos | Info |
+------------------+-----+----------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000003 | 4 | Format_desc | 1 | 106 | Serverversion: 5.1.73-log, Binlogversion: 4 |
| mysql-bin.000003 | 106 | Abfrage | 1 | 173 | BEGIN |
| mysql-bin.000003 | 173 | Intvar | 1 | 201 | INSERT_ID=3 |
| mysql-bin.000003 | 201 | Abfrage | 1 | 444 | verwende „ops“; füge ein in ops.member(„Name“, „Geschlecht“, „Alter“, „gsan“, „w“, 21, „cls5“, („lisi“, „m“, 20, „cls4“), („wangwu“, „w“, 26, „cls6“) |
| mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ |
| mysql-bin.000003 | 471 | Abfrage | 1 | 538 | BEGINNEN |
| mysql-bin.000003 | 538 | Abfrage | 1 | 646 | verwende „ops“; aktualisiere ops.member set name='Objekt', wobei id= |
| mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ |
| mysql-bin.000003 | 673 | Abfrage | 1 | 740 | BEGIN |
| mysql-bin.000003 | 740 | Abfrage | 1 | 848 | verwende „ops“; aktualisiere ops.member set name='Benutzername', wobei id= |
| mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ |
| mysql-bin.000003 | 875 | Abfrage | 1 | 954 | Datenbankoperationen löschen |
| mysql-bin.000003 | 954 | Rotieren | 1 | 997 | mysql-bin.000004;pos=4 |
+------------------+-----+----------+-----------+-------------+-------------------------+--------------------------------------------------------------------------------------------------------------------------+
13 Zeilen im Satz (0,00 Sek.)

oder:

mysql> Binlog-Ereignisse in „mysql-bin.000003“ anzeigen\G;
.........
.........
*************************** 12. Reihe ***************************
Protokollname: mysql-bin.000003
Position: 875
Event_type: Abfrage
Server-ID: 1
End_log_pos: 954
Info: Datenbankoperationen löschen
*************************** 13. Reihe ***************************
Protokollname: mysql-bin.000003
Position: 954
Event_type: Drehen
Server-ID: 1
End_log_pos: 997
Info: mysql-bin.000004;pos=4
13 Zeilen im Satz (0,00 Sek.)

Durch Analyse wurde festgestellt, dass das POS-Punktintervall, das den Datenbankschaden verursacht hat, zwischen 875 und 954 lag (berechnet anhand der POS-Knoten im Protokollintervall) und nur auf einen Wert vor 875 wiederhergestellt werden muss.

7)

Stellen Sie zunächst um 4 Uhr morgens die vollständigen Sicherungsdaten wieder her:
[root@vm-002 ~]# cd /opt/backup/
[root@vm-002 Sicherung]# ls
mysql-bin.000003 ops_2016-09-25.sql.gz
[root@vm-002 Sicherung]# gzip -d ops_2016-09-25.sql.gz
[root@vm-002 Sicherung]# mysql -uroot -p -v < ops_2016-09-25.sql
Passwort eingeben:
--------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */
--------------

--------------
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */
--------------

.............
.............

--------------
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
--------------

Auf diese Weise werden alle Sicherungsdaten vor dem frühen Morgen des gleichen Tages (4:00 Uhr) wiederhergestellt.

mysql> show databases; #Es wurde festgestellt, dass die Ops-Datenbank wiederhergestellt wurde
mysql> Ops verwenden;
Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen
Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten

Datenbank geändert
mysql> Tabellen anzeigen;
+-----------------+
| Tabellen_in_Ops |
+-----------------+
| Mitglied |
+-----------------+
1 Zeile im Satz (0,00 Sek.)

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+----------+-----+-----+---------+
2 Zeilen im Satz (0,00 Sek.)

MySQL>


Allerdings wurden dadurch nur die Daten vor 4 Uhr morgens an diesem Tag wiederhergestellt, die Daten zwischen 4:00 und 18:00 Uhr wurden nicht wiederhergestellt! !
Was sollte ich tun?
Keine Panik! Dies kann anhand des zuvor erwähnten neuen Binlog-Protokolls von mysql-bin.000003 wiederhergestellt werden.

8)

Wiederherstellen von Daten aus Binlog
Das Syntaxformat des Wiederherstellungsbefehls lautet:
mysqlbinlog mysql-bin.0000xx | mysql -u Benutzername -p Passwort Datenbankname

--------------------------------------------------------
Erklärung gängiger Parameteroptionen:
--start-position=875 Startpositionspunkt
--stop-position=954 Endpunkt
--start-datetime="2016-9-25 22:01:08" Startzeit
--stop-datetime="2019-9-25 22:09:46" Endzeit
--database=zyyshop gibt an, dass nur die zyyshop-Datenbank wiederhergestellt werden soll (auf einem Host befinden sich häufig mehrere Datenbanken, nur lokale Protokolle sind beschränkt)

--------------------------------------------------------
Weniger gebräuchliche Optionen:
-u --user=name Benutzername für die Verbindung mit dem Remote-Host
-p --password[=name] Passwort für die Verbindung mit dem Remote-Host
-h --host=name Ruft Binlog-Protokolle vom Remote-Host ab
--read-from-remote-server Binlog-Protokolle von einem MySQL-Server lesen
--------------------------------------------------------

Zusammenfassung: Tatsächlich wird der gelesene Binlog-Protokollinhalt über das Pipe-Zeichen an den MySQL-Befehl übergeben. Diese Befehle und Dateien sollten möglichst als absolute Pfade geschrieben werden.

a) Vollständige Wiederherstellung (Sie müssen mysql-bin.000003 manuell mit vim bearbeiten und die Drop-Anweisung entfernen)

[root@vm-002 Backup]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

b) Geben Sie den Endpunkt der Wiederherstellung an (teilweise Wiederherstellung):

--stop-position=471 pos Endknoten (471 entsprechend dem Transaktionsintervall)

Beachten:

Dieser POS-Endknoten befindet sich zwischen den „Originaldaten der Mitgliedstabelle“ und den Daten vor der Aktualisierung von „name=‘李四‘“, sodass die Daten vor der Änderung von „name=‘李四‘“ wiederhergestellt werden können.

Die Funktionsweise ist wie folgt:

[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=471 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)

Stellen Sie die Daten bis zu dem Zeitpunkt wieder her, als „name='李四'“ geändert wurde (673 im Hinblick auf das Transaktionsintervall).

[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | Li Si | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)

c) Geben Sie die Wiederherstellung des PSO-Punktintervalls an (teilweise Wiederherstellung):

Aktualisieren Sie die Daten von name='李四'. Das Protokollintervall ist: Pos[538] --> End_log_pos[646]. Das Transaktionsintervall ist: Pos[471] --> End_log_pos[673]

Aktualisieren Sie die Daten von name='小等'. Das Protokollintervall ist: Pos[740] --> End_log_pos[848], und das Transaktionsintervall ist: Pos[673] --> End_log_pos[875]

c1)

Um name='李四' separat wiederherzustellen, können Sie Folgendes tun:

Separate Wiederherstellung gemäß dem Binlog-Protokollintervall:

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=538 --stop-position=646 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

Separate Wiederherstellung nach Transaktionsintervall
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c2)

Um name='小二' separat wiederherzustellen, können Sie Folgendes tun:
Separate Wiederherstellung gemäß dem Binlog-Protokollintervall:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=740 --stop-position=848 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

Separate Wiederherstellung nach Transaktionsintervall
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=673 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c3)

Um die mehrstufigen Vorgänge name='李四' und name='小二' gemeinsam wiederherzustellen, müssen Sie das Transaktionsintervall einhalten. Dies geht folgendermaßen:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

Sehen Sie sich die Datenbank an:

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | Xiaoer | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | Li Si | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)

Dadurch wird der Datenzustand vor der Löschung wiederhergestellt! !

Zusätzlich:

Sie können auch ein Zeitknotenintervall für die Wiederherstellung (teilweise Wiederherstellung) angeben:
Zusätzlich zur Verwendung der POS-Knotenmethode zur Wiederherstellung können Sie auch eine Wiederherstellung durchführen, indem Sie ein Zeitknotenintervall angeben. Um nach Zeit wiederherzustellen, müssen Sie den Befehl mysqlbinlog verwenden, um den Binlog-Protokollinhalt zu lesen und den Zeitknoten zu finden.

Wie oben, nach versehentlichem Löschen der Ops-Bibliothek:

Führen Sie zuerst eine vollständige Sicherungswiederherstellung durch
[root@vm-002 Sicherung]# mysql -uroot -p -v < ops_2016-09-25.sql

Anzeigen der Ops-Datenbank

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
+----+----------+-----+-----+---------+
2 Zeilen im Satz (0,00 Sek.)

MySQL>

Überprüfen Sie das mysq-bin00003-Protokoll, um den Zeitknoten zu finden

[root@vm-002 ~]# cd /var/lib/mysql
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003
.............
.............
BEGINNEN
/*!*/;
# bei 173
#160925 21:57:19 Server-ID 1 end_log_pos 201 Intvar
SETZEN SIE INSERT_ID=3/*!*/;
# bei 201
#160925 21:57:19 Server-ID 1 end_log_pos 444 Abfrage Thread-ID=3 exec_time=0 error_code=0
verwenden Sie „ops“/*!*/;
ZEITSTEMPEL EINSTELLEN=1474811839/*!*/;
einfügen in ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') #Ausgeführte SQL-Anweisung
/*!*/;
# bei 444
#160925 21:57:19 Server-ID 1 end_log_pos 471 Xid = 66 #Ausführungszeit starten
BEGEHEN /*!*/;
# bei 471
#160925 21:58:41 Server-ID 1 end_log_pos 538 Abfrage thread_id=3 exec_time=0 error_code=0 #Endzeit
ZEITSTEMPEL FESTLEGEN=1474811921/*!*/;
BEGINNEN
/*!*/;
# bei 538
#160925 21:58:41 Server-ID 1 End-Log-Pos 646 Abfrage Thread-ID = 3 Exec-Zeit = 0 Fehlercode = 0
ZEITSTEMPEL FESTLEGEN=1474811921/*!*/;
update ops.member set name='李四' where id=4 # Ausgeführte SQL-Anweisung
/*!*/;
# bei 646
#160925 21:58:41 Server-ID 1 end_log_pos 673 Xid = 68 #Ausführungszeit starten
BEGEHEN /*!*/;
# bei 673
#160925 21:58:56 Server-ID 1 end_log_pos 740 Abfrage thread_id=3 exec_time=0 error_code=0 #Endzeit
ZEITSTEMPEL FESTLEGEN=1474811936/*!*/;
BEGINNEN
/*!*/;
# bei 740
#160925 21:58:56 Server-ID 1 End-Log-Pos 848 Abfrage Thread-ID = 3 Exec-Zeit = 0 Fehlercode = 0
ZEITSTEMPEL FESTLEGEN=1474811936/*!*/;
update ops.member set name='Element' where id=2 # Ausgeführte SQL-Anweisung
/*!*/;
# bei 848
#160925 21:58:56 Server-ID 1 end_log_pos 875 Xid = 69 #Ausführungszeit starten
BEGEHEN /*!*/;
# bei 875
#160925 22:01:08 Server-ID 1 end_log_pos 954 Abfrage thread_id=3 exec_time=0 error_code=0 #Endzeit
ZEITSTEMPEL EINSTELLEN=1474812068/*!*/;
Datenbankoperationen löschen
/*!*/;
# bei 954
#160925 22:09:46 Server-ID 1 end_log_pos 997 Rotieren zu mysql-bin.000004 pos: 4
TRENNUNGSZEICHEN ;
# Ende der Protokolldatei
ROLLBACK /* hinzugefügt von mysqlbinlog */;
/*!50003 SETZEN SIE COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

Stellen Sie die Daten vor dem Ändern von „name='李四'“ wieder her.

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:57:19" --stop-datetime="2016-09-25 21:58:41" --

Datenbank=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)


[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:41" --stop-datetime="2016-09-25 21:58:56" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | Li Si | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)


[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:56" --stop-datetime="2016-09-25 22:01:08" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> wähle * aus Mitglied;
+----+----------+-----+-----+---------+
| ID | Name | Geschlecht | Alter | Klassen-ID |
+----+----------+-----+-----+---------+
| 1 | wangshibo | m | 27 | cls1 |
| 2 | Xiaoer | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | Li Si | m | 22 | cls3 |
| 5 | Zhangsan | W | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
+----+----------+-----+-----+---------+
7 Zeilen im Satz (0,00 Sek.)


Dadurch wird der Zustand vor der Löschung wiederhergestellt!

Zusammenfassen:

Die sogenannte Wiederherstellung besteht darin, dass MySQL die im angegebenen Absatzintervall im Binlog-Protokoll gespeicherten SQL-Anweisungen nacheinander erneut ausführt.

Die obige Erklärung des MySQL-Binlog-Protokolls und der Methode zur Verwendung des Binlog-Protokolls zur Wiederherstellung von Daten ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • MySQL-Binärprotokolldatei - Datenbank wiederherstellen
  • Bringen Sie Ihnen bei, die Protokolldatei (binlog) der MySQL-Datenbank automatisch wiederherzustellen
  • Detaillierte Erklärung zum Wiederherstellen von Datenbankdaten über das MySQL-Binärprotokoll
  • MySQL verwendet Binlog-Protokolle zur Implementierung der Datenwiederherstellung
  • Erfahren Sie, wie Sie MySQL-Daten über Protokolldateien wiederherstellen

<<:  Tutorial zur Nginx-Standortkonfiguration von Grund auf

>>:  JavaScript implementiert die H5-Goldmünzenfunktion (Beispielcode)

Artikel empfehlen

So konfigurieren Sie inländische Quellen in CentOS8 yum/dnf

CentOS 8 hat das Installationsprogramm für Softwa...

Analyse der Unfallursachen durch Unicode-Signatur BOM

Möglicherweise verwenden Sie hier Include-Dateien,...

JavaScript-Grundlagenreihe: Funktionen und Methoden

Inhaltsverzeichnis 1. Der Unterschied zwischen Fu...

So löschen Sie die Hintergrundfarbe des A-Tags, wenn in H5 darauf geklickt wird

1. Die blaue Farbe des Tags wird aufgehoben, wenn...

Ausführliche Erklärung des Binlogs in MySQL 8.0

1 Einleitung Das Binärprotokoll zeichnet SQL-Anwe...

Häufige Fragen und Antworten im Vorstellungsgespräch für Stellen als Webdesigner

1. Was sind die Vorlagen für ASP.NET-Webanwendunge...

Docker installiert Redis und führt den visuellen Client für den Betrieb ein

1 Einleitung Redis ist eine leistungsstarke, auf ...

Natives JS zur Implementierung eines atmenden Karussells

Heute zeige ich Ihnen ein mit nativem JS implemen...

JS tiefe und flache Kopierdetails

Inhaltsverzeichnis 1. Was bedeutet „Shallow Copy“...

Tutorial zur Installation von VMware, Nmap und Burpsuite

Inhaltsverzeichnis VMware BurpSuite 1. Virtuelles...

MySQL-Fehlernummer 1129 – Lösung

SQLyog stellt eine Verbindung zu MySQL her, Fehle...

Details nach dem Setzen des src des Iframes auf about:blank

Nachdem die Quelle des Iframes auf „about:blank“ g...