本文介绍使用 mysqldump 和 binlog 进行 MySQL 逻辑备份和恢复。

环境:

MySQL: 8.0.25 MySQL Community Server - GPL

操作系统: Windows 10 家庭中文版,版本号 1803

CPU: 4核,AMD A4-5000 APU,1.50 GHz

逻辑全量备份数据库 tmp

mysqldump -h127.0.0.1 -P3306 -uroot -p —single-transaction —master-data=2 —databases tmp > tmp-mysqldump-20211111.sql

正常的数据库写操作

UPDATE tmp SET status = 2 WHERE id = 1;

INSERT INTO tmp (id, status) VALUES (4, 1);

漏了 WHERE 从句,错误地删除了 tmp 表的所有记录

DELETE FROM tmp;

在MySQL 恢复实例上,用上面 tmp 数据库的全量备份恢复 tmp 数据库到全量备份时的状态

mysql -h127.0.0.1 -P3316 -uroot < tmp-mysqldump-20211111.sql

将误删除时间点前后一段时间的 binlog 转换成 sql 文件

mysqlbinlog —start-datetime=”2021-11-11 20:43:00” —stop-datetime=”2021-11-11 20:50:00” —verbose D:\ProgramData\MySQL8.0\Data\SYZHOU1402-bin.000120 > binlog-around-wrong-delete.sql

从 binlog 转换出的 sql 文件搜索 “DELETE”,找到 DELETE 语句的 binlog 记录开始位置为 3184,结束位置为 3255

将 binlog 中, 从全量备份 sql 文件中记录的 binlog 位置 2409 开始,到 DELETE 语句的 binlog 记录开始位置 3184 为止的记录转换成 sql 文件

mysqlbinlog —start-position=2409 —stop-position=3184 D:\ProgramData\MySQL8.0\Data\SYZHOU1402-bin.000120 > binlog-between-full-backup-and-wrong-delete.sql

在MySQL 恢复实例上,执行从全量备份 sql 文件中记录的 binlog 位置 2409 开始,到 DELETE 语句的 binlog 记录开始位置 3184 为止的数据库写操作

mysql -h127.0.0.1 -P3316 -uroot < binlog-between-full-backup-and-wrong-delete.sql

参考

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery-binlog.html

https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery-positions.html