外观
一句话答案
undo log 记录数据修改前的值,用于事务回滚(INSERT→DELETE)和 MVCC 版本链的快照读。
核心要点
| 日志 | 所属层 | 作用 | 格式 | 写入时机 |
|---|---|---|---|---|
| redo log | InnoDB 引擎层 | 崩溃恢复(保证持久性) | 物理日志(记录数据页的物理修改) | 事务执行过程中持续写 |
| undo log | InnoDB 引擎层 | 事务回滚 + MVCC 版本链 | 逻辑日志(记录逆操作) | 事务执行过程中持续写 |
| binlog | MySQL Server 层 | 主从复制 + 数据归档恢复 | 逻辑日志(SQL语句或行变更) | 事务提交时一次性写 |
关键区别:
- redo log 是循环写(固定大小,写满后从头覆盖),binlog 是追加写(可保留完整历史)
- redo log 是 InnoDB 引擎私有,binlog 是 MySQL Server 层,所有引擎共享
- redo log 用于实例恢复(宕机后恢复内存数据),binlog 用于数据恢复(时间点恢复)和主从同步
追问与易错
追问方向:
- undo log 什么时候被清理?
- 长事务为什么有害?
- undo log 和 MVCC 什么关系?
易错点:
- ❌ undo log 就是备份——是逻辑逆操作日志
- ❌ 事务提交后 undo 立即删——其他事务可能还在读
💡 记忆锚点
undo log 是数据的"后悔药":INSERT 了就记一条 DELETE,UPDATE 了就记住旧值。事务回滚时吃后悔药恢复原样(保证原子性),同时这些旧版本串成版本链供 MVCC 快照读使用。注意长事务会让 undo log 堆积不能清理,像后悔药过期不扔占满药柜。