redolog和binlog的刷新

张开发
2026/4/23 10:56:53 15 分钟阅读

分享文章

redolog和binlog的刷新
一、完整事务提交流程全程基于 InnoDB 引擎、MySQL 默认的两阶段提交2PC机制结合你之前学的 binlog cache、redo log buffer把每个动作的先后顺序、写入时机讲死避免混淆。前置准备事务执行阶段提交前执行 DML 语句生成 undo log 写入 undo log buffer用于回滚和 MVCC生成本次修改的 redo log写入redo log bufferInnoDB 内存生成对应的 binlog 事件写入当前线程的 binlog cacheServer 层内存这个阶段redo log 和 binlog 都只在内存里没有刷入磁盘事务未提交宕机直接丢失。第一阶段Prepare 阶段redo log 首次刷盘当你执行COMMIT指令首先进入 Prepare 阶段核心动作只有 2 个将 redo log buffer 里当前事务的完整 redo log强制 fsync 刷入物理磁盘受innodb_flush_log_at_trx_commit1约束双 1 配置下必须刷盘给磁盘上这条刚刷入的 redo log打上Prepare准备就绪状态标记。关键细节这个阶段结束后redo log 已经完成持久化哪怕数据库 / 服务器宕机重启后也能找到这条 Prepare 状态的 redo log不会丢失此时 binlog 还在 binlog cache 内存里没有写入磁盘事务还不算真正提交。第二阶段Commit 阶段核心回答你的问题这个阶段严格遵循「先 binlog 落盘后 redo log 打 commit」的顺序拆成 2 个不可逆的子步骤子步骤 1binlog 持久化先做必须落盘把当前线程 binlog cache 里的完整事务 binlog先write写入操作系统的 Page Cache内核内存根据sync_binlog参数配置执行fsync强制刷入物理磁盘双 1 配置sync_binlog1这里必须直接把 Page Cache 里的 binlog 刷入物理磁盘完成 binlog 的持久化sync_binlogN1先写入 Page Cache累计 N 个事务后再统一刷盘但只有刷盘完成后才会进入下一步。子步骤 2redo log 写入 commit 标记后做binlog 落盘才执行只有 binlog 完成磁盘持久化后MySQL Server 层才会向 InnoDB 引擎发送最终的commit指令InnoDB 收到指令后给磁盘上已经存在的、Prepare 状态的 redo log追加打上 Commit提交状态标记并将这个状态修改刷入磁盘到这一步事务才算真正提交完成随后清空 binlog cache、redo log buffer 里对应的内容。

更多文章