Skip to content

理解 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 负责把“没做完”的事情撤销掉(防错)。

/src/technology/dateblog/2026/03/20260325-%E7%90%86%E8%A7%A3mysql%E7%9A%84undo%E5%92%8Credo%E6%97%A5%E5%BF%97.html