binlog 最容易和 redo log 混在一起理解。它们都叫日志,但站的位置完全不同:redo log 关心 InnoDB 崩溃后能不能把已提交修改重放回来,binlog 关心 Server 层已经提交过哪些变更,以及这些变更能不能被复制、归档和回放。
所以理解 binlog,重点不是只记住“它是逻辑日志”。更重要的是看清楚:它为什么能支撑主从复制、时间点恢复和数据同步,又为什么必须和 redo log 通过两阶段提交对齐。
先把机制边界说清楚
binlog 是 MySQL Server 层的逻辑日志,记录已经提交的数据库变更事件。它不关心 InnoDB 页怎么改,而是记录 SQL 语句或行变更结果。主从复制、误操作恢复、审计和数据同步都依赖 binlog。
整体路径
上面这张图先看入口和边界:宏观上,事务执行过程中 InnoDB 负责生成 redo,提交阶段 Server 层生成 binlog event。binlog 按文件顺序追加,副本通过复制线程读取这些事件并重放;恢复时也可以从某个全量备份位点开始回放 binlog 到目标时间点。
第二张图再看结构关系。
底层流程
底层拆解先看数据结构。「binlog」至少涉及下面几类结构:
- binlog 文件:按顺序追加的逻辑事件文件。
- binlog index:记录当前实例有哪些 binlog 文件。
- event:Query、Rows、GTID、XID 等不同事件类型。
- GTID:描述全局事务身份,简化复制和恢复边界。
- format:STATEMENT、ROW、MIXED 三种记录方式。
再看完整执行流程:
- 事务执行并产生数据变更。
- 提交阶段生成 binlog event。
- 根据 sync_binlog 策略把 binlog 刷盘。
- 复制线程读取 binlog 并发送给副本。
- 恢复工具按位点或 GTID 回放事件。
取舍与边界
版本差异上,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」。后续会继续按机制、图解和实战排查这条线更新。

