Heim  >  Artikel  >  Datenbank  >  So verwenden Sie MySQL-Binlog zum Wiederherstellen von Daten

So verwenden Sie MySQL-Binlog zum Wiederherstellen von Daten

PHPz
PHPznach vorne
2023-05-31 08:40:304902Durchsuche

Bevor Sie MySQL-Binlog zur Datenwiederherstellung verwenden, muss Binlog zunächst aktiviert werden. Richten Sie hier eine Testumgebung ein, um zu erfahren, wie Sie MySQL Binlog zum Wiederherstellen der Datenbank verwenden. Das Prinzip ist relativ einfach. Binlog speichert geänderte Daten in MySQL. Wenn Sie beispielsweise eine Datenbank erstellen und einige Daten schreiben, werden diese im Binlog von MySQL gespeichert.

Wenn Sie sich erholen müssen, finden Sie zwei Positionen: eine Startposition und eine Endposition. Die Hälfte der Endposition ist die Position vor der Zerstörung oder Löschung der Daten. In MySQL 8 ist Binlog standardmäßig aktiviert

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------+
| Variable_name                   | Value                    |
+---------------------------------+--------------------------+
| log_bin                         | ON                       |
| log_bin_basename                | /data/mysql/binlog       |
| log_bin_index                   | /data/mysql/binlog.index |
| log_bin_trust_function_creators | OFF                      |
| log_bin_use_v1_row_events       | OFF                      |
| sql_log_bin                     | ON                       |
+---------------------------------+--------------------------+

Sie können sehen, dass log_bin aktiviert wurde, und Sie können auch sehen, dass sich der Speicherort im Verzeichnis /daba/mysql befindet und das Präfix binlog lautet

ls /data/mysql/binlog.*
/data/mysql/binlog.000143  /data/mysql/binlog.000144  /data/mysql/binlog.000145  /data/mysql/binlog.000146  /data/mysql/binlog.index

Sie können sehen dass es mehrere Binlog-Protokolldateien gibt, da hier die Testdatenbank (mit historischen Informationen und früheren Daten, die keinen Nutzen haben) zur Vereinfachung des Testens direkt zurückgesetzt wird. Seien Sie vorsichtig, wenn Sie alle Binlog-Dateien löschen. Wenn es sich um eine Produktionsumgebung handelt, ist der Wert der Daten unermesslich.

show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000143 |       156 | No        |
| binlog.000144 |       200 | No        |
| binlog.000145 |       156 | No        |
| binlog.000146 |       156 | No        |
+---------------+-----------+-----------+
4 rows in set (0.01 sec)

mysql> reset master;
Query OK, 0 rows affected (0.02 sec)

mysql> show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |       156 | No        |
+---------------+-----------+-----------+
1 row in set (0.00 sec)


ls /data/mysql/binlog.*
/data/mysql/binlog.000001  /data/mysql/binlog.index

Nachdem Sie den Reset (Reset Master) ausgeführt haben, können Sie sehen, dass die vorherige Binlog-Datei gelöscht wurde und eine neue Binlog-Datei generiert wird.

Sie können den Inhalt dieser Datei überprüfen.

$mysqlbinlog binlog.000001
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
...

Zu diesem Zeitpunkt fügen wir einige Daten hinzu.

mysql <<EOT
create database test_liuhaolin_com;
select now();
EOT

mysql <<EOT
use test_liuhaolin_com;

create table if not exists test(
	\`id\` int unsigned not null auto_increment primary key,
	\`key\` varchar(100),
	\`val\` varchar(255)
) engine=myisam charset=utf8mb4;
EOT

mysql <<EOT
use test_liuhaolin_com;
insert into test  values (&#39;1&#39;,&#39;website&#39;, &#39;https://www.liuhaolin.com&#39;);
EOT

Zu diesem Zeitpunkt haben wir versehentlich die Datenbank test_liuhaolin_com gelöscht Datenbank

Zunächst: Um Störungen zu vermeiden, wird das Flush-Protokoll ausgeführt, um eine neue Binlog-Datei zu generieren.

mysql> drop database test_liuhaolin_com;
Query OK, 1 row affected (0.09 sec)

Um Daten wiederherzustellen, müssen Sie zunächst herausfinden, wo die Daten gelöscht wurden.

mysql> show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |      1594 | No        |
+---------------+-----------+-----------+
1 row in set (0.00 sec)

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 |     1594 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.08 sec)

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |      156 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

Sie können sehen, dass in Zeile 113 eine Löschanweisung vorhanden ist. Schließlich können Sie zwei Orte finden: Den Startort, an dem die Daten wiederhergestellt werden müssen. und der Endspeicherort ist der Ort, an dem Sie den Datenbankspeicherort gelöscht haben.

mysqlbinlog binlog.000001 | grep -n  "drop database"
113:drop database test_liuhaolin_com

Sie können die Start- und Endpositionen in der Datei tmp.sql kennen.

  1. binlog
  2. Sie können sehen, dass die Startposition 233 ist.

binlog

Sie können sehen, dass die Endposition ist 1371, also führen Sie „Über Datenwiederherstellung“ aus.

mysqlbinlog --set-charset=utf8  binlog.000001 > tmp.sql

Zur Überprüfung können Sie vor der Ausführung prüfen, ob die Datenbank vorhanden ist. So verwenden Sie MySQL-Binlog zum Wiederherstellen von Daten

mysqlbinlog -v binlog.000001 --start-position=233 --stop-position=1371 | mysql

Das obige ist der detaillierte Inhalt vonSo verwenden Sie MySQL-Binlog zum Wiederherstellen von Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen