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 11: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='2025-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 解析,大文件处理较慢) |