MySQL binlog记录所有写操作,需用mysqlbinlog工具解析为可读格式;支持按时间、位置、数据库等筛选,推荐ROW格式以保障安全可靠。

MySQL 的 binlog(二进制日志)记录了所有对数据库执行的写操作(如 INSERT、UPDATE、DELETE、DDL 等),是主从复制、数据恢复和审计的关键依据。直接查看 binlog 文件是二进制格式,无法直接阅读,必须通过 mysqlbinlog 工具解析为可读的 SQL 或事件格式。
使用 mysqlbinlog 命令解析 binlog 文件
mysqlbinlog 是 MySQL 自带的命令行工具,用于将二进制日志转换为文本形式。基本用法如下:
- 解析本地 binlog 文件:
mysqlbinlog /var/lib/mysql/mysql-bin.000001 - 指定编码避免乱码(尤其含中文时):
mysqlbinlog --base64-output=DECODE-ROWS -v --charset=utf8mb4 /var/lib/mysql/mysql-bin.000001 - 按时间范围筛选:
mysqlbinlog --start-datetime="2024-05-10 10:00:00" --stop-datetime="2024-05-10 12:00:00" mysql-bin.000001 - 按位置点筛选(需已知起始/结束 position):
mysqlbinlog --start-position=154 --stop-position=320 mysql-bin.000001
理解 binlog 格式与事件类型
MySQL 支持三种 binlog_format:STATEMENT、ROW 和 MIXED。目前推荐 ROW 格式,它记录每一行数据变更的详细前后镜像,更安全可靠。
- Query_event:记录原始 SQL(如 CREATE、ALTER、BEGIN 等)
- Write_rows_event / Update_rows_event / Delete_rows_event:在 ROW 模式下,分别表示插入、更新、删除操作;会显示表名、列信息及具体字段值(可能以 base64 编码)
- Xid_event:标记事务提交(COMMIT)
- Rotate_event:表示 binlog 切换到下一个文件
加 -v(verbose)参数可看到行事件的解码内容;加 -vv 可进一步显示字段元数据(如列名、类型)。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
定位关键操作:查删改与时间点恢复
日常排查中常需快速定位误操作(如误删表、错更新)。建议组合使用以下方式:
- 用
grep快速过滤关键词:mysqlbinlog mysql-bin.000001 | grep -A 5 -B 5 "DROP TABLE\|DELETE FROM\|UPDATE.*WHERE" - 结合
--base64-output=DECODE-ROWS -v查看某条 UPDATE 的前像(before image)和后像(after image),确认修改范围 - 提取某个时间段的完整 SQL 并重放(注意先停写、过滤掉不相关库表):
mysqlbinlog --database=myapp --start-datetime="..." --stop-datetime="..." mysql-bin.* > replay.sql
注意事项与常见问题
解析 binlog 不只是“看内容”,更要关注上下文和安全性:
- 确保 binlog 开启且格式为 ROW:
SHOW VARIABLES LIKE 'log_bin';和SHOW VARIABLES LIKE 'binlog_format'; - 不要直接在生产库上执行未验证的 binlog 回滚语句;建议先在测试库验证逻辑
- ROW 模式下大字段(如 TEXT、BLOB)可能被截断显示,实际内容仍完整保存在 binlog 中
- 加密 binlog(binlog_encryption=ON)需提供密钥文件才能解析,否则报错 “Failed to open file”









