mysqlbinlog 是什么
二进制日志(binlog)记录所有数据变更,是主从复制与按时间点恢复(PITR)的基础。mysqlbinlog 是 MySQL 自带的解析工具,把二进制内容解码成可读文本:既能人工审查某段时间改了什么,也能把日志管道回数据库完成重放。
基本信息
| 日志位置 | SHOW VARIABLES LIKE 'log_bin_basename' 得到文件前缀 |
|---|---|
| 日志清单 | SHOW BINARY LOGS 列出所有文件与大小 |
| 日志格式 | ROW / STATEMENT / MIXED,5.7 起默认 ROW |
| 解析工具 | mysqlbinlog,属于客户端工具包 |
| 读取权限 | 需要 REPLICATION SLAVE 权限读取二进制日志 |
典型使用场景
- 误删数据后按时间点恢复:先恢复全备,再用 binlog 重放到故障前一秒
- 变更审计:查某个时间段内谁改了哪张表,定位误操作来源
- 主从复制排障:确认事件是否已写入主库日志、内容是否与预期一致
- 数据对比:解析特定库或表的事件,与业务日志交叉验证
- 迁移验证:确认目标库已应用全部事件,偏移是否追平
查看与解析
查看与解析
# 先看有哪些日志文件
mysql -uroot -p -e "SHOW BINARY LOGS;"
# 按行事件解码成伪 SQL,便于人工审查
mysqlbinlog --base64-output=DECODE-ROWS -vv /var/lib/mysql/mysql-bin.000123 | head -100
# 截取时间窗口的内容到文件
mysqlbinlog --start-datetime='2026-10-11 10:00:00' --stop-datetime='2026-10-11 11:00:00' \
/var/lib/mysql/mysql-bin.000123 > part.sql
# 直接重放(先审查再执行)
mysqlbinlog /var/lib/mysql/mysql-bin.000123 | mysql -uroot -p输出逐列读法
| 输出片段 | 含义 | 注意 |
|---|---|---|
| #at 12345 | 事件在文件中的偏移量 | 用作 start-position 与 stop-position |
| #241011 10:02:33 server id | 事件时间与来源实例 | 时间取实例时区,跨时区要换算 |
| ### INSERT INTO | 行格式下的伪 SQL 注释 | 不能直接手工执行,需整体重放 |
| SET @@SESSION.GTID_NEXT | GTID 环境下的下一事务编号 | 重放时决定是否剥离 GTID |
| DELIMITER | 语句定界符声明 | 解析工具自动输出,不需要手工改动 |
行格式必须加 -vv 才能看到伪 SQL;语句格式本身就是 SQL 文本,不需要额外参数。
正在写入的日志文件直接读取可能不完整:先执行 FLUSH LOGS 切到新文件,再复制旧文件副本解析。
恢复前确认四件事
- 确认全量备份的时间点:日志重放必须从备份对应的位置开始,否则会漏或多
- 确认日志是否完整:从备份点到故障点之间的所有日志文件都要在手上
- 确认解析时间窗口:先解析成文件人工审查,确认范围正确再执行
- 确认恢复目标:恢复到故障前还是故障后,决定停在哪一秒或哪个位点