深入浅出 MySQL 搞懂 MySQL Undo/Redo Log,彻底掌握事务回滚与持久化
Undo Log(回滚日志)
基本概念
Undo Log(回滚日志)是数据库事务管理的关键组件,用于记录数据修改前的旧值,支持事务回滚与 MVCC。
生命周期管理
- 生成时机:在事务开始执行任何 DML 操作前生成
- 提交处理:事务提交时不会立即删除
- 回收机制:通过后台的 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 是记录事务中所有数据修改操作的日志文件,确保事务的持久性。
特点
- 物理日志:记录的是数据页的物理变化
- 顺序写入:采用追加写入的方式
- 循环使用:采用环形缓冲区的设计
工作原理
- 日志先行机制(WAL)
- 循环写入机制
- 崩溃恢复流程
innodb_flush_log_at_trx_commit 参数
| 设置值 | 描述 | 风险 | 性能 |
|---|---|---|---|
| 0 | 每秒批量写入 | 最多丢失1秒 | 最高 |
| 1(默认) | 每次提交 | 无数据丢失 | 最低 |
| 2 | 写入OS Cache | 进程崩溃无丢 | 中等 |
总结
| 特性 | Undo Log | Redo Log |
|---|---|---|
| 作用 | 回滚、MVCC | 持久性 |
| 类型 | 逻辑日志 | 物理日志 |
| 保证 | 原子性、隔离性 | 持久性 |