告别复杂日志解析 用bin2sql轻松实现MySQL数据闪回

mysqlbinlog⼯具使用

复制代码
use test;
CREATE TABLE `t1` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(20) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO t1(id, name) SELECT 101, 'tome101';
INSERT INTO t1(id, name) SELECT 102, 'tome102';
INSERT INTO t1(id, name) SELECT 103, 'tome103';
INSERT INTO t1(id, name) SELECT 104, 'tome104';
INSERT INTO t1(id, name) SELECT 105, 'tome105';
INSERT INTO t1(id, name) SELECT 106, 'tome106';
INSERT INTO t1(id, name) SELECT 107, 'tome107';
INSERT INTO t1(id, name) SELECT 108, 'tome108';


UPDATE t1 SET name = 'jack101' WHERE id = 101;
UPDATE t1 SET name = 'jack103' WHERE id = 103;
UPDATE t1 SET name = 'jack105' WHERE id = 105;

DELETE FROM t1 WHERE id = 102;
DELETE FROM t1 WHERE id = 104;
DELETE FROM t1 WHERE id = 106;

此时: 通过命令

复制代码
show binlog events in 'binlog.000009' \G

可以看到所有产出的binlog日志:

查看binlog内容

复制代码
mysqlbinlog --no-defaults --database=test  --start-datetime='2025-3-12 1
 1:37:00'   mysql-bin.000009 | less

按照时间读取

复制代码
mysqlbinlog --no-defaults --database=test --base64-output=decode-rows -v    
binlog.000009 --start-datetime='2025-3-12 22:45:00'   --stop-datetime='20
 25-3-12 23:45:00'| less

#加上--base64-output=decode-rows --v 选项解析
##base64-output,可以控制输出语句输出base64编码的BINLOG语句;decode-rows选项将把基于行的事件解码成一个SQL语句

按照点位读取

复制代码
mysqlbinlog --no-defaults --database=test --base64-output=decode-rows -v    
binlog.000009 --start-position=xxxxx   --stop-position=xxxx| less

bin2sql⼯具恢复误删除数据

创建用户并给权限,插入测试数据

复制代码
create user 'dba'@'%'identified by 'mysql';
GRANT all ON *.* TO 'dba'@'%';
grant super on *.* to 'binlog2sql'@'%';
create table a1(id int,name varchar(10));
insert into a1 values (1,'a');

安装必要的依赖包

复制代码
yum -y install epel-release 

安装一个python3.8,这里我直接上传的软件包
1.上传软件包
2.
sudo yum groupinstall -y "Development Tools"
sudo yum install -y gcc gcc-c++ make zlib-devel bzip2 bzip2-devel readline-devel \
    sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel
3.
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall

安装bin2sql

复制代码
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
pip install -r requirements.txt 
pip3 install  pymysql 

说实话安装过程坑极多,给的安装教程又很简单

官网给的安装教程:真心希望能改进一下文档。。。

bin2sql 的使用:

标准用法-解析出执行过的sql
复制代码
python binlog2sql.py  -h127.0.0.1 -P3306  -udba -pmysql -dtest -ta1 --start-file='binlog.000001'
解析回滚SQL
复制代码
python binlog2sql.py --flashback -h127.0.0.1 -P3306  -udba -pmysql -dtest -ta1 --start-file='binlog.000001'

如上图,我执行了一条insert 语句 ,bin2sql 能解析出它的回滚语句是什么。

实战误删整张表数据,需要紧急回滚

表内容如下

恢复步骤

1.登录mysql,查看目前的binlog文件

2.最新的binlog文件是mysql-bin.000001,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。

复制代码
 python binlog2sql.py  -h127.0.0.1 -P3306  -udba -pmysql -dtest -tt1 --start-file='binlog.000001' --start-datetime='2025-3-12 17:45:00' --stop-datetime='2025-3-12 17:50:00'

如图,bin2sql 解析出了所有误操作删除的内容。

复制代码
python binlog2sql.py  -h127.0.0.1 -P3306  -udba -pmysql -dtest -tt1 --start-file='binlog.000001' --start-datetime='2025-3-12 17:45:00' --stop-datetime='2025-3-12 17:50:00' -B >rollback.sql | cat

执行sql 文件,数据恢复成功。

mysqlbinlog VS bin2sql

对比维度 mysqlbinlog (MySQL 官方工具) bin2sql (第三方开源工具)
核心功能 解析二进制日志,生成原始 SQL 或回滚语句 从二进制日志中解析出可读 SQL(正向/反向),支持事务拆分
优势 1. 官方支持 ,兼容性高 2. 直接集成于 MySQL,无需安装 3. 支持时间范围、数据库过滤等基础过滤 4. 可生成回滚 SQL(需配合 -v 或第三方脚本) 1. 输出 SQL 可读性更好 (直接展示 DML) 2. 支持事务拆分 ,精准定位操作 3. 提供用户权限解析(可选) 4. 支持生成反向 SQL(数据回滚) 5. 部分工具提供 Web 界面(如 Binlog2SQL)
劣势 1. 输出结果含底层细节(如 @1=...),需手动处理可读性 2. 复杂事务解析困难 (如大事务) 3. 无原生用户权限信息解析 4. 依赖命令行操作,对新手不友好 1. 依赖 Python 环境 2. 处理超大 binlog 时性能较低 3. 功能局限 (仅生成 SQL,无直接恢复功能) 4. 社区支持弱于官方工具 5. 部分场景需手动处理(如 DDL 语句)
典型场景 1. 快速查看 binlog 内容 2. 结合脚本实现数据恢复 1. 误操作数据恢复 (生成反向 SQL) 2. 审计日志分析
依赖环境 仅需 MySQL 客户端 需 Python 及依赖库(如 pymysql
输出灵活性 支持原始 SQL、ROW 格式解析、时间过滤 支持正向/反向 SQL、事务级过滤、表级过滤
用户友好性 低(需熟悉命令行参数) 中(提供更直观的 SQL 输出和过滤选项)
性能 高(C++ 编写,原生工具) 中低(Python 解析,大文件处理较慢)
相关推荐
爱吃烤鸡翅的酸菜鱼5 分钟前
【SpringMVC】概念引入与连接
java·开发语言·mysql
数据与后端架构提升之路8 分钟前
深度解析如何将图像帧和音频片段特征高效存储到向量数据库 Milvus
数据库·opencv·音视频
20242817李臻1 小时前
李臻20242817_安全文件传输系统项目报告_第9周
数据库·安全
小白考证进阶中1 小时前
0基础可以考MySQL OCP么?备考时间需要多久?
数据库·mysql·开闭原则
观无1 小时前
Redis远程链接应用案例
数据库·redis·缓存·c#
星星点点洲1 小时前
【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
数据库·缓存
努力奋斗的小杨1 小时前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
苹果酱05672 小时前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
枫叶20002 小时前
OceanBase数据库-学习笔记1-概论
数据库·笔记·学习·oceanbase
仲夏plus2 小时前
MySQL:慢SQL索引优化-使用explain/analyze进行耗时分析的方法
数据库