首页/数据/数据库速查/mysqlbinlog 常用参数
备份与恢复56 条

mysqlbinlog 常用参数

重放控制四件套:--start/stop-datetime(时间)、--start/stop-position(位点)、--database(过滤库)、--skip-gtids(剥离 GTID,按需);配套 --verbose 解析行事件。

数据库速查数据更新于 2026-10-13

mysqlbinlog 参数是什么

解析二进制日志时真正决定「取哪一段」的是四个参数:按时间用起止时间参数、按位点用起止位置参数,再用数据库过滤缩小范围;行格式还要加详细输出参数把事件翻译成伪 SQL。参数组合对了,重放才可控;组合错了,轻则白解析,重则重放错范围。

基本信息

时间窗口--start-datetime 与 --stop-datetime,按实例本地时区解释
位点窗口--start-position 与 --stop-position,只在同一文件内有效
库过滤--database=库名,基于事件中的默认库,不是精确过滤
GTID 处理--skip-gtids 剥离 GTID,便于重复重放
可读输出-v 输出伪 SQL,-vv 附加字段类型等注释

典型使用场景

  • 误删恢复:按时间窗口取故障前的日志段先审查再重放
  • 精细化重放:位点窗口用于只重放某个事务区间
  • 单库排查:用库过滤先缩小范围,人工确认后再全量解析
  • 重复重放场景:剥离 GTID 后重放,避免被判定为已执行
  • 审计输出:生成可读文本交给业务方核对变更内容

审查与重放

审查与重放
# 先解析成可读 SQL 人工审查
mysqlbinlog -vv --start-position=12345 --stop-position=23456 \
  mysql-bin.000046 > review.sql
grep -n "DELETE FROM appdb.orders" review.sql | head        # 定位误删语句
# 按时间窗口解析(注意时区)
mysqlbinlog --start-datetime='2026-10-11 10:00:00' --stop-datetime='2026-10-11 10:30:00' \
  mysql-bin.000046 > window.sql
# 确认无人为误删后再重放
mysqlbinlog --start-position=12345 --stop-position=23456 mysql-bin.000046 | mysql -uroot -p

参数速查

参数作用注意
起止时间按时间窗口截取事件按实例时区解释,跨时区要换算
起止位点按偏移量窗口截取偏移量只在同一文件内可比
库名过滤只输出该默认库的事件跨库语句可能与预期不符
剥离 GTID输出中不写 GTID 信息重复重放时常用,正式恢复要谨慎
详细输出把行事件翻译为伪 SQL伪 SQL 仅供审查,不能手工执行
位点与时间可以混用:先用时间定位大致范围,再用位点精确到单个事务,是恢复场景里更稳的做法。
重放前必须有人工审查环节:直接把日志管道进数据库,等于把原始错误再执行一遍。

易错点

  • 时间参数按本地时区解释却按 UTC 估算:窗口偏了整段时间,恢复结果差一段数据
  • 把位点参数用在另一个日志文件上:偏移量含义完全不同,重放范围会错得离谱
  • 依赖库过滤做精确筛选:跨库或未显式指定库的语句可能被漏掉
  • 伪 SQL 拿来手工执行:注解形式的行事件必须整体重放,人工搬运必出错

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqlbinlog

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌