undo log、redo log和bin log详解

kayokoi 发布于 2025-06-05 50 次阅读


1. Redo Log(重做日志)

  • 作用:主要用于崩溃恢复,确保事务的持久性(Durability)。当数据库异常重启时,通过重放redo log将未刷盘的脏页恢复到最新状态。
  • 物理/逻辑:记录的是物理日志,描述数据页的具体修改(例如页号、偏移量等)。
  • 写入方式:顺序写入,采用循环覆盖模式(固定空间,写满后覆盖旧日志)。
  • 写入时机
    • 事务执行过程中,修改操作会先写入内存的redo log buffer。
    • 提交事务时强制刷盘(innodb_flush_log_at_trx_commit=1时)。
    • 其他情况如buffer占用过半或后台线程定期刷盘。
  • 其他特性
    • 与undo log关联:undo log的修改也会生成redo log,确保undo log的持久性。
    • 两阶段提交:事务提交时,redo log先标记为prepare状态,binlog写入后再标记为commit。

2. Undo Log(撤销日志)

  • 作用:主要用于事务回滚和 MVCC(多版本并发控制) ,实现原子性(Atomicity)。记录事务修改前的数据状态,用于逆向操作。
  • 物理/逻辑:属于逻辑日志,记录与操作相反的逻辑(如INSERT对应DELETE)。
  • 写入方式:随机读写,存储于回滚段(rollback segment)中。
  • 持久性保障:依赖redo log保护,undo log的修改会伴随redo log的生成。
  • 应用场景
    • 事务回滚时,根据undo log逆向恢复数据。
    • MVCC中提供历史版本数据,支持一致性读。

3. Bin Log(二进制日志)

  • 作用:用于数据归档主从复制时间点恢复。记录所有对数据库的修改操作(包括非事务引擎的操作)。
  • 物理/逻辑:属于逻辑日志,记录SQL语句或行变更的逻辑操作(如UPDATE语句)。
  • 写入方式:追加写入,保存全量日志,不会覆盖旧记录。
  • 写入时机:事务提交后一次性写入(sync_binlog参数控制刷盘策略)。
  • 与事务的关系
    • 所有存储引擎的修改均会记录。
    • 在两阶段提交中,binlog写入是事务提交的关键步骤,确保redo log与binlog的一致性。

三者的核心区别与联系

特性 Redo Log Undo Log Bin Log
作用 崩溃恢复,持久性 事务回滚,MVCC 数据归档,主从复制
日志类型 物理日志(页修改) 逻辑日志(逆向操作) 逻辑日志(SQL或行变更)
存储引擎 InnoDB特有 InnoDB特有 MySQL Server层,所有引擎可用
写入方式 循环写入 随机读写 追加写入
持久性依赖 独立持久化 依赖redo log保护 独立持久化
事务提交阶段 两阶段提交(prepare/commit) 事务执行时生成 事务提交后写入