mysqlbinlog 是什么
mysqlbinlog 是 MySQL 自带的 binlog 解析工具,把二进制日志转成可读文本,用于事后恢复与问题定位。ROW 格式下事件是编码过的行镜像,必须加 --base64-output=DECODE-ROWS 配合 -vv 才能看到可读的伪 SQL;它还能按时间、位点、库过滤,也支持用 --read-from-remote-server 直接从运行中的实例拉取日志,不必登机器翻文件。
基本信息
| 位置 | 随 MySQL 发行,与 mysqld 同目录的客户端工具 |
|---|---|
| 格式要求 | ROW 格式需 --base64-output=DECODE-ROWS -vv 才可读 |
| 过滤方式 | 按时间、位点、库名过滤 |
| 远程读取 | --read-from-remote-server --host --user |
| 输出方式 | 重定向到文件或 --result-file 指定 |
| 权限要求 | 远程读取需要复制相关权限 |
解析与导出
解析与导出
# 查看某时间段事件(ROW 格式解出伪 SQL)
mysqlbinlog --base64-output=DECODE-ROWS -vv --start-datetime="2026-10-11 00:00:00" /var/log/mysql/mysql-bin.000123 | less
# 导出指定位点区间
mysqlbinlog --start-position=1944 --stop-position=3200 mysql-bin.000123 > /tmp/seg.sql
mysql -uroot -p < /tmp/seg.sql
# 只导出某个库的事件,并写入结果文件
mysqlbinlog --database=app --result-file=/tmp/app.sql mysql-bin.000123常用参数
| --database | 只输出指定库的事件 |
|---|---|
| --start/stop-datetime | 按时间范围过滤 |
| --start/stop-position | 按位点区间切段 |
| --read-from-remote-server | 从运行中的实例拉取日志 |
| --verbose/-vv | 输出伪 SQL 与列信息 |
| --result-file | 把输出写入文件而不是标准输出 |
典型使用场景
- 误删恢复:先定位删除前后的位点,再回放区间内的事件
- 问题定位:查某段时间内某张表到底发生了哪些变更
- 核对数据:把变更事件与业务日志对照,判断错误数据何时写入
- 远程拉取:不登录数据库主机也能拉取日志内容分析
- 链路排查:确认源端是否真的产生了预期的变更事件
常见输出读法
| 标识 | 含义 | 用途 |
|---|---|---|
| at N | 事件在位点 N 处 | 用于定位与切段回放 |
| server id | 产生事件的实例标识 | 多实例环境下区分来源 |
| Write_rows/Update_rows/Delete_rows | 行级变更类型 | ROW 格式下的核心事件 |
| ### INSERT/UPDATE | 解析出的伪 SQL | 人工确认变更内容 |
| GTID | 事件所属事务标识 | GTID 模式下按事务定位 |
回放导出的 SQL 前核对位点区间与已执行状态,避免重复执行同一批变更。
解析大文件很耗资源:优先用 --start-position/--stop-position 或时间过滤缩小范围,而不是先整文件导出来再看。