首页/数据/数据库速查/mysqlbinlog 查看二进制日志

mysqlbinlog 查看二进制日志

binlog 是数据变更流水,也是复制与按时间点恢复(PITR)的基础;mysqlbinlog 把二进制内容解码为可读文本。

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

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_NEXTGTID 环境下的下一事务编号重放时决定是否剥离 GTID
DELIMITER语句定界符声明解析工具自动输出,不需要手工改动
行格式必须加 -vv 才能看到伪 SQL;语句格式本身就是 SQL 文本,不需要额外参数。
正在写入的日志文件直接读取可能不完整:先执行 FLUSH LOGS 切到新文件,再复制旧文件副本解析。

恢复前确认四件事

  • 确认全量备份的时间点:日志重放必须从备份对应的位置开始,否则会漏或多
  • 确认日志是否完整:从备份点到故障点之间的所有日志文件都要在手上
  • 确认解析时间窗口:先解析成文件人工审查,确认范围正确再执行
  • 确认恢复目标:恢复到故障前还是故障后,决定停在哪一秒或哪个位点

易错点

  • 正在写入的日志直接解析:读到半截事件,重放时出现事务不完整
  • 把行格式解码出的伪 SQL 手工执行:插入与更新是分开的注释片段,人工拼接必然出错
  • 重放前不做备份:恢复动作本身不可逆,出错后没有回退路径
  • 忽略 GTID 处理:带 GTID 重放可能被从库判定为已执行而直接跳过

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqlbinlog — Utility for Processing Binary Log Files

相关工具

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