深入浅出 MySQL 搞懂 MySQL Undo/Redo Log,彻底掌握事务回滚与持久化

Undo Log(回滚日志)

基本概念

Undo Log(回滚日志)是数据库事务管理的关键组件,用于记录数据修改前的旧值,支持事务回滚与 MVCC。

生命周期管理

  1. 生成时机:在事务开始执行任何 DML 操作前生成
  2. 提交处理:事务提交时不会立即删除
  3. 回收机制:通过后台的 purge 线程异步清理

Undo Log 类型(逻辑日志)

  • INSERT 操作:记录对应的 DELETE 操作
  • DELETE 操作:记录完整的行数据
  • UPDATE 操作:记录修改前的旧值

存储结构

  • 采用段式管理:InnoDB 使用回滚段(Rollback Segment)组织 Undo 日志
  • 默认配置:每个数据库实例包含 128 个回滚段

作用

事务原子性

Undo Log 是 MySQL 实现事务原子性的核心机制。当事务发生系统错误、用户执行 ROLLBACK 语句、或死锁检测触发回滚时,MySQL 利用 Undo Log 将数据恢复到事务开始前的状态。

并发控制(MVCC)

  • 版本链管理:每条记录都包含 DB_TRX_ID 和 DB_ROLL_PTR
  • 快照读实现
  • 隔离级别支持

Redo Log(重做日志)

基本概念

Redo Log 是记录事务中所有数据修改操作的日志文件,确保事务的持久性。

特点

  • 物理日志:记录的是数据页的物理变化
  • 顺序写入:采用追加写入的方式
  • 循环使用:采用环形缓冲区的设计

工作原理

  1. 日志先行机制(WAL)
  2. 循环写入机制
  3. 崩溃恢复流程

innodb_flush_log_at_trx_commit 参数

设置值描述风险性能
0每秒批量写入最多丢失1秒最高
1(默认)每次提交无数据丢失最低
2写入OS Cache进程崩溃无丢中等

总结

特性Undo LogRedo Log
作用回滚、MVCC持久性
类型逻辑日志物理日志
保证原子性、隔离性持久性