【MySQL】Binlog解析全攻略:5种场景+实操步骤
Binlog(二进制日志)是 MySQL 核心日志之一,记录数据库所有数据变更操作(增删改、表结构调整等),是数据恢复、主从复制、问题排查的关键工具。本文将详细拆解 基于位点、时间、GTID、指定数据库、加密 Binlog 的 5 种解析方法,附完整命令与场景说明,新手也能直接上手。
一、基于位点解析(精准定位变更位置)
适用场景:已知数据变更发生的 Binlog 文件及大致位点(如主从同步中断时定位错误位点)
实操步骤:
- 查看当前 Binlog 状态
先确认当前正在写入的 Binlog 文件、当前位点及 GTID:
show master status\G
输出结果中:
File:当前 Binlog 文件名(如mysql-bin.000006)
Position:当前位点(如 212,初始位点通常为155)

- 生成测试 Binlog(可选)
若需验证解析效果,可执行测试操作生成变更记录:
# 示例:创建测试表并插入数据
create table maria.binlog_test(id int);
insert into maria.binlog_test select 1;
再次执行 show master status\G,记录变更后的位点(如 763):

3. 执行 Binlog 解析
进入 Binlog 存储目录(路径与 my.cnf 中 log-bin 配置一致),执行解析命令:
# 进入Binlog目录
cd /data/mysql/binlog/
# 解析命令:--start-position=起始位点 --stop-position=结束位点(可选)
mysqlbinlog --start-position=212 --stop-position=763 mysql-bin.000006 -vv > /data/binlog_parse_01.sql
- 参数说明:-vv 输出详细行数据(含字段值),> 重定向到指定文件便于查看。
4. 查看解析结果
cat /data/binlog_parse_01.sql


二、基于时间解析(按时间范围筛选)
适用场景:已知数据变更的大致时间(如排查某时间段的数据异常)
实操步骤:
# 解析指定时间后的数据(格式:YYYY-MM-DD HH:MM:SS)
mysqlbinlog --start-datetime="2026-02-03 15:29:55" mysql-bin.000006 > /data/binlog_parse_02.sql
# 解析时间区间内的数据(添加--stop-datetime)
mysqlbinlog --start-datetime="2026-02-03 15:29:55" --stop-datetime="2026-02-03 15:33:48" mysql-bin.000006 > /data/binlog_parse_02_1.sql
注意:
- 时间格式需严格匹配,建议精确到分钟(秒级可选)。
- 若 Binlog 文件较多,可先用
mysqlbinlog --base64-output=decode-rows -v 文件名 | grep "时间关键词"快速定位目标文件。
三、基于 GTID 解析(精准定位单个事务)
适用场景:MySQL 8.0+ 版本,已开启 GTID(全局事务 ID),需精准定位单个事务(如主从复制中跳过错误事务)
实操步骤:
- 确认 GTID 状态
先确保 GTID 已开启,查看当前已执行的 GTID:
show master status\G
输出中 Executed_Gtid_Set 字段即为已执行的 GTID。

- 解析指定 GTID 的事务
# 解析指定 GTID 的事务(示例 GTID:dac2d0d1-d4cc-11f0-8896-000c295cba4b:1-94954)
mysqlbinlog --include-gtids 'dac2d0d1-d4cc-11f0-8896-000c295cba4b:1-94954' mysql-bin.000007 -vv > /data/binlog_parse_03.sql
# 查看解析结果
cat /data/binlog_parse_03.sql
参数说明:--include-gtids 指定需解析的 GTID(多个用逗号分隔),支持范围(如 1-100)。
四、仅解析指定数据库的 Binlog
适用场景:多库共用一个 MySQL 实例,仅需查看某一数据库的变更(如隔离业务库数据操作)
实操步骤:
- 生成多库测试数据(可选)
# 查看当前位点
show master status\G
-- 切换到maria库创建表
use maria;
create table binlog_test_01(id int);
-- 切换到test库创建表
use test;
create table aaa(id int);
-- 记录位点范围(起始:948,结束:1339)
show master status\G

- 解析指定数据库
# -d 参数指定数据库名,限定位点范围
mysqlbinlog --start-position=948 --stop-position=1339 -d maria mysql-bin.000006 -vv > /data/binlog_parse_04.sql
# 查看解析结果(仅包含 maria 库的变更)
cat /data/binlog_parse_04.sql
解析结果仅包含 maria 库的变更,test 库的操作会被过滤。

五、解析加密的 Binlog
适用场景:MySQL 开启 Binlog 加密存储(增强数据安全性),需通过服务认证解析(本地文件无法直接读取)
步骤 1:开启 Binlog 加密(前置配置)
# 1. 编辑配置文件
vim /data/mysql/conf/my.cnf
# 2. 添加加密配置
early-plugin-load = keyring_file.so # 加载密钥文件插件
keyring_file_data = /data/mysql/keyring # 密钥存储路径
binlog_encryption = on # 开启 Binlog 加密
# 3. 重启 MySQL 服务
/etc/init.d/mysql.server restart
# 4. 验证加密是否开启
show binary logs;

步骤 2:解析加密 Binlog
直接读取加密文件会报错,需通过 --read-from-remote-server 参数从 MySQL 服务读取:
# 解析加密 Binlog(执行后输入 MySQL 密码,即可生成解密后的解析文件)
mysqlbinlog --read-from-remote-server -uroot -p --start-position=212 --stop-position=548 mysql-bin.000007 -vv > /data/binlog_parse_05.sql
# 查看解析结果
cat /data/binlog_parse_05.sql
其中 --read-from-remote-server 表示从服务端读取 Binlog,而非本地文件。

步骤 3:关闭 Binlog 加密(可选)
# 1. 编辑配置文件,移除加密相关配置
vim /data/mysql/conf/my.cnf
# 删除以下行:
# early-plugin-load = keyring_file.so
# keyring_file_data = /data/mysql/keyring
# binlog_encryption = on
# 2. 备份旧加密 Binlog(避免重启失败)
# 把当前的Binlog移除,因为重启MySSQL会加载之前的Binlog,而之前的Binlog是加密的,会重启失败
# 重建备份目录backup,并且把Binlog移到该目录下
mkdir /data/mysql/backup
mv /data/mysql/binlog/* /data/mysql/backup/
# 3. 重启 MySQL 服务
/etc/init.d/mysql.server restart
# 4. 验证加密关闭
show binary logs;

总结
| 解析方式 | 核心参数 | 适用场景 |
| 基于位点 | –start-position/–stop-position | 已知变更位点 |
| 基于时间 | –start-datetime/–stop-datetime | 已知变更时间 |
| 基于 GTID | –include-gtids | MySQL 8.0+ 精准定位事务 |
| 指定数据库 | -d 数据库名 | 多库隔离,仅需某库变更 |
| 加密 Binlog | –read-from-remote-server | 开启 Binlog 加密的场景 |
注意事项:
- 解析时需确保
mysqlbinlog工具版本与 MySQL 服务器版本一致(避免兼容性问题)。
- 敏感环境中,解析结果文件需做好权限控制(如
chmod 600),防止数据泄露。
- 若需恢复数据,可直接执行解析后的 SQL 文件(
mysql -uroot -p xxx.sql)。
如果遇到解析失败、位点定位不准等问题,欢迎在评论区交流~ 后续将更新 Binlog 日志清理、主从复制实战等内容,记得关注!



