删库不跑路,用 binlog 来恢复。
binlog 是二进制日志文件,它的作用一是增量备份,作用二是主从复制,即主节点维护一个 binlog 日志文件,从节点从 binlog 中同步数据,也可以通过 binlog 日志来实现高级数据恢复。
上一篇介绍了:Binlog实现MySQL主从复制
本篇主要探讨:怎么使用 binlog 恢复 MySQL 数据
这也是 MySQL 的重要知识点及高频面试点,宝妹儿顺便将这个题目以及答案,整理到2023版《MySQL 大厂高频面试题大全》PDF了,方便系统学习、面试通关。
宝妹儿精编的2023版《MySQL 大厂高频面试题大全》,已收录100+道真题,近30000字,长期迭代、持续更新。吃透它,应付MySQL面试没问题。
公号Java面试题宝,自取。
大家好,我是爱分享的程序员宝妹儿,分享即学习。
1 使用 binlog 恢复数据的一些场景
在生产环境中,难免会遇到一些突发的特殊情况,例如:
- 不小心把数据给删除了
- 数据被误操作修改了
- 磁盘故障、文件损坏,数据丢失或损坏了
- 数据库崩溃或服务器故障
在实际应用场景中,有些意外和突发事件是难以避免的,如果遇到了上述情况,可以使用 binlog 来恢复 MySQL 数据。
2 使用 binlog 恢复数据的必要条件
使用 binlog 恢复数据的前提是要有备份数据,当数据出现严重问题无法恢复时,我们可以将备份数据还原到数据库,回滚到备份时的状态,避免数据丢失。
备份可以是完整的数据库备份,也可以是定期的增量备份。
3 binlog 恢复数据的操作方法
binlog 恢复数据主要有如下 7 个步骤:
1)查看当前 binlog 的位置
首先,我们要确定需要恢复的时间点(范围),定位需要恢复的数据以及相关的 binlog 文件。
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000008 | 1847 | | | | +------------------+----------+--------------+------------------+-------------------+
2)tb_person 表中插入两条记录
insert into tb_person set name="person_1", address="beijing", sex="man", other="test-1"; insert into tb_person set name="person_2", address="beijing", sex="man", other="test-2";
3)记录当前 binlog 位置
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000008 | 2585 | | | | +------------------+----------+--------------+------------------+-------------------+
4)查询数据
mysql> select * from tb_person where name ="person_2" or name="person_1"; +----+----------+---------+-----+--------+ | id | name | address | sex | other | +----+----------+---------+-----+--------+ | 6 | person_1 | beijing | man | test-1 | | 7 | person_2 | beijing | man | test-2 | +----+----------+---------+-----+--------+
5)删除一条: delete from tb_person where name =”person_2″;
mysql> select * from tb_person where name ="person_2" or name="person_1"; +----+----------+---------+-----+--------+ | id | name | address | sex | other | +----+----------+---------+-----+--------+ | 6 | person_1 | beijing | man | test-1 | +----+----------+---------+-----+--------+
6)binlog 恢复(指定 pos 点恢复/部分恢复)
mysqlbinlog --start-position=1847 --stop-position=2585 mysql-bin.000008 > test.sql mysql> source /var/lib/mysql/3306/test.sql
7)数据恢复完成
mysql> select * from tb_person where name ="person_2" or name="person_1"; +----+----------+---------+-----+--------+ | id | name | address | sex | other | +----+----------+---------+-----+--------+ | 6 | person_1 | beijing | man | test-1 | | 7 | person_2 | beijing | man | test-2 | +----+----------+---------+-----+--------+
再来看一个示例:
某个电商系统中,有一个名为 orders
的数据表,存储了订单信息,因误操作部分订单数据被删除了。
现在要使用 binlog 来恢复这些被删除的订单数据。
准备工作
首先,要确保 MySQL 数据库已启用 binlog 功能,并且相关的 binlog 日志文件已经生成。
通过查看 MySQL 配置文件或运行以下命令来确认:
SHOW VARIABLES LIKE 'log_bin';
log_bin
的值为 ON
,表示 binlog 功能已启用。
查找删除操作的 binlog 位置
确定删除操作在 binlog 中的位置,找到删除操作发生的时间点和对应的 binlog 文件名及位置。
查找步骤:
查看表结构,确定要恢复的数据表名称,例如 orders
。
SHOW CREATE TABLE orders;
进入 MySQL 的命令行终端,执行以下命令:
FLUSH LOGS;
刷新 binlog ,生成一个新的 binlog 文件。
执行删除操作之后,再执行以下命令:
SHOW BINLOG EVENTS;
显示当前所有的 binlog 事件,并查找与删除操作相关的事件,记录对应的 binlog 文件名和位置。
创建恢复脚本
找到删除操作在 binlog 中的位置之后,再创建恢复脚本。
这个脚本将利用 binlog 日志文件中的信息来恢复被删除的数据。
# 设置恢复起始位置 SET GLOBAL gtid_purged = 'BINLOG_FILE_NAME:BINLOG_POSITION'; # 恢复数据 BEGIN; ROLLBACK TO BINLOG 'BINLOG_FILE_NAME' , BINLOG_POSITION; COMMIT;
将上述脚本中的 BINLOG_FILE_NAME
和 BINLOG_POSITION
,替换为实际的 binlog 文件名和位置。
执行该脚本后,会回滚到指定的 binlog 位置。
执行恢复操作
执行上一步创建的恢复脚本来还原被删除的数据。
在 MySQL 命令行终端中,执行以下命令:
SOURCE /path/to/recovery_script.sql;
确保将 /path/to/recovery_script.sql
替换为实际的恢复脚本文件路径。
执行该命令后,MySQL 将根据 binlog 文件中的信息恢复数据,并将被删除的订单数据还原到之前的状态。
验证和测试恢复结果
这是最后一步,执行一些查询操作,来检查下数据是否正确恢复,并与备份数据进行对比。
SELECT * FROM orders;
逐行检查结果,确保被删除的订单数据已恢复,并与备份数据保持一致。
总结
本文介绍了使用 binlog 恢复 MySQL 数据的 7 个重要步骤,并且用电商示例做了进一步解析。
使用 binlog 恢复 MySQL 数据,简单地说,就是让 MySQL 将保存在 binlog 日志中指定段落区间的 sql 语句,逐个重新执行一次而已。
在进行 MySQL 数据恢复时,需要考虑数据一致性、数据依赖关系以及恢复后的验证等问题。
最后,宝妹儿再提醒下:在进行任何数据恢复操作前,记得一定要备份所有数据。
我是爱分享的程序员宝妹儿,分享即学习。
如果觉得有用,请顺手【点赞】支持下哦,这将是对宝妹儿的最大鼓励,谢谢~
PS.
本文收录于宝妹儿精编的 2023版《MySQL 大厂高频面试题大全》PDF。
搞定这100道题,足以应对MySQL面试。
[…] 查看详解篇:Bin log数据恢复,7个步骤搞定,再不怕MySQL宕机了 […]