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 仅供审查,不能手工执行 |
位点与时间可以混用:先用时间定位大致范围,再用位点精确到单个事务,是恢复场景里更稳的做法。
重放前必须有人工审查环节:直接把日志管道进数据库,等于把原始错误再执行一遍。