利用binlog2sql数据闪回实战
目录
- 前言
- 准备
- 查看被删除的数据
- 回滚
- 可能遇到的问题
- 引号问题
- 回滚数据字段错位
- 小结
- 参考
前言
- 常与数据库打交道,难免遇到误删或误修改数据的情况,本文使用
binlog2sql实现数据回滚的操作。虽说这款工具许久未更新,好在binlog这种底层的东西没什么变化,依旧能用。
准备
-
开启binlog

-
查看
binlog_format格式,binlog2sql要求必须是ROW

-
克隆源码
git clone git@github.com:danfengcao/binlog2sql.git
- 运行环境,我使用conda创建python 3.5的环境
conda create -n binlog python=3.5
- 安装依赖
pip install -r requirements.txt
-
t_user表测试数据2条

-
删除数据
DELETE FROM `t_user`;

查看被删除的数据
- 查看现在的binlog文件名
show MASTER STATUS;

- 运行命令
python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -proot -dtest -tt_user --start-file=binlog.000095 --start-datetime="2025-11-09 16:58:00" --stop-datetime="2025-11-10 00:00:00"
部分参数解释: -d 库名 -t 表名

回滚
- 运行命令生成SQL文件
python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -proot -dtest -tt_user --start-file=binlog.000095 --start-position=1813 --stop-position=2116 -B > rollback.sql
部分参数解释: --start-position 与前面看到的#start 1813 对应 , --stop-position 同理


- 把回滚语句执行一遍数据就回来了。


可能遇到的问题
引号问题
- binlog2sql文档里面使用的命令是单引号,实际上我在Windows 10要使用双引号。例如
--start-datetime="2025-11-09 16:58:00"。
回滚数据字段错位
- 比如name字段对应到了email字段,我在mysql 8某些版本有遇到这个问题。
- 解决方案
pip install pymysql==0.9.3
pip install mysql-replication==0.21
小结
- 先找到binlog文件名,然后执行命令找到误操作的语句,再得到回滚SQL。另外,删除表后无法回滚。
参考
- https://www.bilibili.com/video/BV1UY411U74g/
- https://github.com/danfengcao/binlog2sql
- https://github.com/danfengcao/binlog2sql/issues/64
