告别复杂日志解析 用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 解析,大文件处理较慢)
相关推荐
xieliyu.3 小时前
MySQL 六大基础约束详解:NOT NULL/DEFAULT/UNIQUE/ 主键 / 外键 / CHECK
android·数据库·sql·mysql
Anokata4 小时前
MYSQL SQL 执行系列1
android·sql·mysql
JSON_L4 小时前
MongoDB文档关系详解
数据库·mongodb
卓怡学长4 小时前
w268基于springboot + vue 物流系统
java·数据库·vue.js·spring boot·spring·intellij-idea
CodeStats4 小时前
《源纹天书》第一百四十一章至第一百四十五章:etcd升级、2PC的阻塞困境、3PC的超时突破、TCC的补偿之道、Saga的最终选择!
java·大数据·数据库·etcd·源纹天书
Java成神之路-4 小时前
彻底分清:垂直分库、水平分库、垂直分表、水平分表(附 Mycat 完整配置)
mysql
.Cnn5 小时前
Redis基础day02
java·数据库·redis
能有时光5 小时前
[MAF的Agent管道详解-07]利用AIAgent中间件构建Agent管道
java·数据库
迷枫7125 小时前
简单sql与dm功能实验记录
数据库·sql·oracle
蚁库5 小时前
Oracle 19c 文件系统安装实战教程:从规划到日常管理完整流程
数据库·oracle