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) | 事务执行时生成 | 事务提交后写入 |