告别复杂日志解析 用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 解析,大文件处理较慢)
相关推荐
天翼云开发者社区23 分钟前
国产数据库高光时刻!天翼云TeleDB荣登TPC-DS全球测评总榜第二
数据库·云计算
潘达斯奈基~25 分钟前
万字总结数据分析思维
数据库·python·数据分析
堕落年代27 分钟前
使用MySQL的Binlog来同步数据到ES当中
mysql·elasticsearch·adb
hdhdhdhdhdhdhdh35 分钟前
如何最好地复制MS SQL Server中的整个数据库?
数据库
bxp132139 分钟前
springcloud gateway通过数据库获取路由信息
数据库·spring cloud·gateway
kfepiza1 小时前
Fedora41安装MySQL8.4.4
linux·mysql
PingCAP1 小时前
TiDB 观测性解读(一)丨索引观测:快速识别无用索引与低效索引
数据库·tidb
m0_748235072 小时前
Python高级之操作Mysql
python·mysql·adb
笑远2 小时前
无服务器数据库
数据库·云原生·serverless
s听风忆雪2 小时前
navicat16 升级到 navicat17 之后原来的连接找不到了 mac用户
mysql·macos·navicat