理解 MySQL 的 Undo 和 Redo 日志,你可以把它们想象成**“后悔药”和“记账本”**。
以下是两者的核心区别与作用,尽量通俗:
1. Redo Log —— “记账本”
作用:保证事务的持久性。防止 MySQL 突然宕机时,刚提交的数据丢失。
- 怎么工作? 当你修改数据时,MySQL 不会立刻把硬盘上的数据改了(太慢),而是先在 Redo Log(重做日志) 上记一笔:“我在第5页第3行写了一个‘A’”。
- 如果 MySQL 突然断电,重启后会根据这个记账本,把还没来得及写入硬盘的数据重新做一遍。
- 核心特点: 物理日志(记录的是“某个数据页被改成了什么”),循环写(日志写满了会覆盖旧的)。
2. Undo Log —— “后悔药”
作用:保证事务的原子性。用于回滚事务,并支持 MVCC(多版本并发控制)。
- 怎么工作? 当你修改数据时,MySQL 会先在 Undo Log(回滚日志) 里记一笔:“你原来在第五页第3行是‘B’”。
- 如果你执行了
ROLLBACK(回滚),系统会根据这个日志把数据改回去。 - 如果其他事务正在读这条数据,Undo 也能提供这条数据修改前的旧版本(保证读数据时不加锁)。
- 如果你执行了
- 核心特点: 逻辑日志(记录的是“如何回滚”的操作),服务于读和写。
总结区别(简单版)
| 维度 | Redo Log (重做日志) | Undo Log (回滚日志) |
|---|---|---|
| 一句话 | 保证提交了的数据不丢 (持久性) | 保证没提交的数据能撤 (原子性) |
| 使用时机 | 事务提交时写入 | 事务执行中写入 |
| 崩溃恢复 | 宕机重启后,用 Redo 重放已提交的事务 | 宕机重启后,用 Undo 回滚未完成的事务 |
| 类比 | 记账本 (丢了账本钱就乱了) | 后悔药 (吃了能回到之前的状态) |
简单记忆:Redo 负责把“已经做完了”的事情重新做一遍(防丢); Undo 负责把“没做完”的事情撤销掉(防错)。