mysqlbinlog 是什么
mysqlbinlog 是 MySQL 官方的二进制日志解析工具,能把 binlog 转成可读文本,用于审计变更、定位误操作、按位点回放数据。ROW 格式下默认只能看到编码后的行事件,需要加 --base64-output=DECODE-ROWS -v 才能读出具体哪一行被改成什么。
基本信息
| 适用平台 | MySQL 5.7 / 8.0(建议使用与源库同版本的客户端工具) |
|---|---|
| 常用参数 | --start-datetime / --stop-datetime、--start-position / --stop-position、--base64-output=DECODE-ROWS -v |
| 输出用途 | 直接输出到屏幕或文件查看;管道给 mysql 客户端即为回放 |
| 权限要求 | 读取 binlog 文件需要文件系统权限;回放需要数据库写权限 |
典型使用场景
- 误删误改定位:按时间窗导出事件文本,找出具体是哪条语句或哪一行
- 精确回放:用位点区间只重放需要的那一段,避免整段重放引入二次问题
- 审计与追溯:核对某时段内的变更是否符合预期
- 数据补齐:从 binlog 中提取变更补到分析库或报表库
- 复制排障:对比主备位点,定位复制中断的具体事件
阅读 ROW 变更
阅读 ROW 变更
# 解析 ROW 格式,输出可读的行变化
tee /tmp/binlog-20261012.txt <<'EOF'
mysqlbinlog --base64-output=DECODE-ROWS -v \
--start-datetime='2026-10-12 02:00:00' --stop-datetime='2026-10-12 02:30:00' \
/var/lib/mysql/binlog.000123
EOF
# 关注事件头里的时间、位点、server id 与表名
grep -nE 'Table_map|Update_rows|Delete_rows|Insert_rows' /tmp/binlog-20261012.txt | head按位点回放
按位点回放
# 只回放指定区间:位点区间要反复核对,宁可窄不可宽
mysqlbinlog --start-position=4 --stop-position=154320 \
/var/lib/mysql/binlog.000123 | mysql -u root -p
# 回放前先备份目标库,并导出该区间为文本人工确认
mysqldump --single-transaction appdb > /backup/appdb-before-replay.sql常用参数读法
| 参数 | 作用 | 注意点 |
|---|---|---|
| --base64-output=DECODE-ROWS | 把 ROW 事件解码为可读形式 | 仅解码显示,回放时通常需先用文本确认 |
| -v / -vv | 输出列信息(-vv 更详细) | 信息量大,配合 grep 定位更高效 |
| --start/stop-datetime | 按时间窗筛选事件 | 时间基于服务器时区,跨时区要换算 |
| --start/stop-position | 按位点区间筛选事件 | 区间写宽会把无关变更一起重放 |
| 管道给 mysql | 把解析结果当作 SQL 回放 | 回放前务必备份目标库 |
排查误操作时先导出事件文本定位语句或行变化,再用精确位点回放;回放本身是对生产库的写操作,执行前先确认起点位点与目标环境。
跨大版本解析可能报错或丢字段:尽量使用与源库相同大版本的 mysqlbinlog,避免解析结果缺失关键事件。