首页/数据/备份与容灾速查/mysqlbinlog 解析与回放
数据库与云备份56 条

mysqlbinlog 解析与回放

官方 binlog 解析工具:按时间或位点区间导出事件、审计变更、按点回放;ROW 格式需解码参数才能直观阅读内容。

备份与容灾速查数据更新于 2026-10-13

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,避免解析结果缺失关键事件。

易错点

  • 跨大版本解析 binlog:可能报错或丢字段,定位与回放结果都不可靠
  • 回放到已有数据的环境前未确认起点位点:重复回放造成主键冲突或数据翻倍
  • 位点区间取过宽:无关变更一起被重放,引发新的数据问题
  • ROW 格式直接看原始输出:只看到编码事件,无法判断具体被改动的行

数据来源与参考

  • MySQL 8.0 Reference Manual(mysqlbinlog)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌