Heim  >  Artikel  >  Datenbank  >  Binärprotokoll für MySQL-Betrieb und -Wartung

Binärprotokoll für MySQL-Betrieb und -Wartung

齐天大圣
齐天大圣Original
2020-06-01 10:40:121696Durchsuche

Das MySQL-Binärprotokoll speichert SQL-Anweisungen, die Datenänderungen verursachen oder verursachen können. Funktionen wie Echtzeit-Remote-Disaster-Recovery-Backup, Lese-/Schreibtrennung und Datenwiederherstellung können über Binärprotokolle durchgeführt werden. Schauen wir uns als Nächstes das MySQL-Binärprotokoll an.

Bin-Log-Protokoll aktivieren

Mysql aktiviert das Bin-Log-Protokoll standardmäßig nicht, wir müssen die Konfiguration selbst hinzufügen.

log-bin=mysql-bin
binlog_format=mixed
server-id   = 1
expire_logs_days = 10

log-bin Nach der Konfiguration dieses Elements ist die Binärprotokollfunktion aktiviert. mysql-bin ist der Name der bin-log-Protokolldatei.

expire_logs_days = 10 gibt an, dass nur die Bin-Log-Protokolle der letzten 10 Tage gespeichert werden.

Im Allgemeinen werden Bin-Log-Protokolle unter dem MySQL-Installationspfad /var/ gespeichert.

Betriebs- und Wartungstipps: Es ist am besten, keine binären Protokolldateien und Datenbankdatendateien abzulegen Wenn die Festplatte, auf der die Datendateien gespeichert sind, defekt ist, können Sie das Binärprotokoll einer anderen Festplatte verwenden, um die Daten wiederherzustellen

Mehrere nützliche Befehle

  • Flush-Protokolle: Neue Bin-Log-Protokolle erstellen

  • Master-Status anzeigen: Den letzten Bin-Log-Protokollstatus anzeigen.

  • Master zurücksetzen: Alle Bin-Log-Dateien löschen

MySQL > Master-Status anzeigen

Binärprotokoll für MySQL-Betrieb und -Wartung

Mysql-Protokoll anzeigen

Da es sich bei dem Protokoll um ein Binärprotokoll handelt, führt die Anzeige mit dem allgemeinen Befehl cat oder vim zu verstümmeltem Code . . MySQL stellt uns das Tool mysqlbinlog zur Verfügung. Verwenden Sie es, um es anzuzeigen.

./mysqlbinlog ../var/mysql-bin.000015
……
# at 123
#200601  8:35:19 server id 1  end_log_pos 154 CRC32 0xd25b404e  Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
……
  • at: POS-Knoten, wenn SQL startet

  • server_id: die Dienstnummer des Datenbankhosts

  • end_log_pos 154: POS-Knoten am Ende von SQL

Die allgemeinen Optionen von MySQL sind wie folgt:

  • --start-datetime : Lies die angegebene Zeit aus dem Binärprotokoll, die dem Zeitstempel des lokalen Computers entspricht oder später liegt

  • --stop-datetime: Lies die angegebene Zeit aus dem Binärprotokoll, die kleiner ist als der Zeitstempel oder gleich dem lokalen Computer. Der Zeitwert ist derselbe wie oben

  • --start-position: Lesen Sie die angegebene Positionsereignisposition aus dem Binärprotokoll als Start.

  • --stop-position: Lesen Sie die angegebene Positionsereignisposition aus dem Binärprotokoll als Ereignis ab

  • -d,-- Datenbank = Name: Nur Protokollvorgänge der angegebenen Datenbank anzeigen

Bin-Log-Protokolle verwenden, um Daten wiederherzustellen

  • SQL-Datei exportieren Befehl: mysqldump-Datenbankname [Datentabellenname 1 [Datentabellenname 2...]] > Externes Dateiverzeichnis (empfohlen die Verwendung von .sql)

  • SQL-Dateiimport Datenbank: mysql - u** -p** Datenbankname

Simulieren Sie nun ein Szenario: Eine Datenbank wird regelmäßig jede Nacht um 15 Uhr gesichert und Am nächsten Tag läuft die Website einen halben Tag lang normal. Plötzlich um 17 Uhr hat Programmierer A beim DELETE versehentlich keine WHERE-Bedingung hinzugefügt, und dann gingen alle Daten in einer der Tabellen verloren. Dann suchte Xiao A den technischen Direktor Dasheng auf und bat ihn, bei der Wiederherstellung der Daten zu helfen.

Die binlog_test-Datenbank hat nur eine Benutzertabelle

Die Daten vor der Sicherung um drei Uhr morgens lauten wie folgt:

+---------+----------+---------------------+
| user_id | username | add_time            |
+---------+----------+---------------------+
|       1 | gwx      | 2018-07-05 13:00:31 |
|       2 | snn      | 2018-07-05 14:00:00 |
|       3 | zy       | 2018-07-05 15:00:00 |
+---------+----------+---------------------+

Um 3 Uhr in am Morgen, die Sicherungsdaten

mysqldump binlog_test -l -F > /root/sql_backup/20180706.sql
ll /root/sql_backup/
总用量 4
-rw-r--r-- 1 root root 2149 7月   6 13:42 20180706.sql
=======数据备份完成=========

Die Website läuft seit einiger Zeit normal und viele Benutzer haben sich registriert

INSERT INTO `user` (username) values('user1'),('user2'),('user3');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
select * from user;
+---------+----------+---------------------+
| user_id | username | add_time            |
+---------+----------+---------------------+
|       1 | gwx      | 2018-07-05 13:00:31 |
|       2 | snn      | 2018-07-05 14:00:00 |
|       3 | zy       | 2018-07-05 15:00:00 |
|       4 | user1    | 2018-07-06 15:01:18 |
|       5 | user2    | 2018-07-06 15:01:18 |
|       6 | user3    | 2018-07-06 15:01:18 |
+---------+----------+---------------------+
==============新增了3个用户user1 user2 及user3==============

Um 17 Uhr nachmittags begann Little A, sich dumm zu benehmen

DELETE FROM user;
Query OK, 6 rows affected (0.00 sec)
=========没where条件,数据全没了===========

Der kleine A fand den Großen Weisen, um bei der Wiederherstellung der Daten zu helfen, und der Große Weise stellte zuerst die Daten von gestern wieder her. Die Daten wurden um 3 Uhr morgens wiederhergestellt.

service nginx stop;  # 大圣先关闭了nginx,使网站用户暂时访问不了数据库
Stoping nginx...  done 
MariaDB [binlog_test]> flush logs;  #生成新的binlog日志
MariaDB [binlog_test]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |     1536 |              |                  |
+------------------+----------+--------------+------------------+
mysql -v -f binlog_test < /root/sql_backup/20180706.sql

Zu diesem Zeitpunkt war der Große Weise wiederhergestellt die Daten um 3 Uhr morgens letzte Nacht

MariaDB [binlog_test]> select * from user;
+---------+----------+---------------------+
| user_id | username | add_time            |
+---------+----------+---------------------+
|       1 | gwx      | 2018-07-05 13:00:31 |
|       2 | snn      | 2018-07-05 14:00:00 |
|       3 | zy       | 2018-07-05 15:00:00 |
+---------+----------+---------------------+
=============昨晚凌晨三点数据恢复完成===============

Als nächstes wurden die Daten zwischen 3 Uhr morgens und DELETE wiederhergestellt

Suchen Sie zuerst den POS-Punkt zum Löschen. Nach der Sicherung lautet das Protokoll 000002. Nach dem Löschen. Flush-Protokolle sind ebenfalls 000003, also suchen Sie einfach den POS-Punkt vor 000002 und löschen Sie ihn.

# /usr/local/mariadb/bin/mysqlbinlog --stop-position=629  >
&#39;mysql-bin.000002&#39; >
| mysql binlog_test;

MariaDB [binlog_test]> select * from user;
+---------+----------+---------------------+
| user_id | username | add_time            |
+---------+----------+---------------------+
|       1 | gwx      | 2018-07-05 13:00:31 |
|       2 | snn      | 2018-07-05 14:00:00 |
|       3 | zy       | 2018-07-05 15:00:00 |
|       4 | user1    | 2018-07-06 15:01:18 |
|       5 | user2    | 2018-07-06 15:01:18 |
|       6 | user3    | 2018-07-06 15:01:18 |
+---------+----------+---------------------+
==============数据都回来了========================

Das obige ist der detaillierte Inhalt vonBinärprotokoll für MySQL-Betrieb und -Wartung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn