binlog 最容易和 redo log 混在一起理解。它们都叫日志,但站的位置完全不同:redo log 关心 InnoDB 崩溃后能不能把已提交修改重放回来,binlog 关心 Server 层已经提交过哪些变更,以及这些变更能不能被复制、归档和回放。

所以理解 binlog,重点不是只记住“它是逻辑日志”。更重要的是看清楚:它为什么能支撑主从复制、时间点恢复和数据同步,又为什么必须和 redo log 通过两阶段提交对齐。

先把机制边界说清楚

binlog 是 MySQL Server 层的逻辑日志,记录已经提交的数据库变更事件。它不关心 InnoDB 页怎么改,而是记录 SQL 语句或行变更结果。主从复制、误操作恢复、审计和数据同步都依赖 binlog。

整体路径

binlog 跟 redo log 长得像但职责完全不同

上面这张图先看入口和边界:宏观上,事务执行过程中 InnoDB 负责生成 redo,提交阶段 Server 层生成 binlog event。binlog 按文件顺序追加,副本通过复制线程读取这些事件并重放;恢复时也可以从某个全量备份位点开始回放 binlog 到目标时间点。

binlog 跟 redo log 的三大差别

第二张图再看结构关系。

底层流程

三种 format 的差别和坑

底层拆解先看数据结构。「binlog」至少涉及下面几类结构:

  • binlog 文件:按顺序追加的逻辑事件文件。
  • binlog index:记录当前实例有哪些 binlog 文件。
  • event:Query、Rows、GTID、XID 等不同事件类型。
  • GTID:描述全局事务身份,简化复制和恢复边界。
  • format:STATEMENT、ROW、MIXED 三种记录方式。

再看完整执行流程:

  1. 事务执行并产生数据变更。
  2. 提交阶段生成 binlog event。
  3. 根据 sync_binlog 策略把 binlog 刷盘。
  4. 复制线程读取 binlog 并发送给副本。
  5. 恢复工具按位点或 GTID 回放事件。

取舍与边界

binlog 在主从复制和数据恢复里的角色

版本差异上,MySQL 8.0 默认更强调 ROW 格式和 GTID 化管理,复制元数据和崩溃安全能力也更完善。STATEMENT 格式在某些场景日志更小,但遇到非确定函数、触发器或执行环境差异时风险更高。

binlog 的短板在于它是逻辑层日志。ROW 格式可靠但可能很大,大批量更新会制造海量日志;STATEMENT 更省空间但可重放性更依赖上下文;sync_binlog 配置太激进会牺牲性能,太宽松又会增加崩溃丢日志风险。

典型问题:用机制化例子排查

误操作恢复可以抽象成一条恢复链路:先用全量备份恢复基线,再按 binlog 位点或时间点回放变更。能不能恢复,取决于 binlog 是否完整、格式是否确定、位点是否清楚。

可以落到这些动作:

  • 核心库开启并保留足够周期的 binlog,周期按恢复目标而不是磁盘心情定。
  • 优先使用 ROW 格式保证复制和恢复确定性,同时监控日志体积。
  • sync_binlog 要结合 RPO 和磁盘性能设置。
  • 误操作恢复前先在隔离环境演练回放,避免二次破坏。

收束:binlog 是变更账本

binlog 是 MySQL 面向复制、归档和时间点恢复的变更账本。它不替代 redo,也不负责描述页怎么改;它记录的是 Server 层认可的提交事实。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 MySQL」,欢迎关注公众号 「十三Tech」。后续会继续按机制、图解和实战排查这条线更新。

十三Tech公众号二维码