410 字
2 分钟
InnoDB Undo Log 的回滚与 MVCC 作用
Undo Log 保存足以撤销数据修改的旧信息。事务更新记录时,InnoDB 在写入新版本前保留旧版本所需内容,并把版本通过记录的隐藏字段串联起来。事务回滚时可以据此撤销修改;普通一致性读也可以沿版本链回溯,结合 ReadView 找到对当前事务可见的版本。因此 Undo Log 同时服务回滚和 MVCC。
它与 Redo Log 的方向不同:Redo 描述如何重做页修改,面向崩溃恢复;Undo 描述如何撤销事务修改或提供旧版本,面向事务回滚与一致性读。Undo 本身也需要持久化保护,不能理解成只存在内存的临时副本。
事务提交不代表所有旧版本立即删除。仍可能有活跃 ReadView 需要旧版本,后台 purge 只有在版本不再被任何读视图需要时才能清理。长事务长期持有快照会阻碍清理,造成历史版本积累、磁盘占用和查询成本增加;排查时应关注长事务和历史列表等指标,而不是只扩大表空间。
追问
- Undo Log 是否可以重做数据页? 不能把它当作 Redo Log;二者记录目的和恢复方向不同。
- 提交后 Undo Log 立刻消失吗? 不会。旧版本可能还被其他事务的 ReadView 使用,待不再需要后才由 purge 清理。
- 长事务为什么影响数据库? 它可能长时间保留旧快照,阻止 purge 回收版本,令 Undo 历史持续增长。
InnoDB Undo Log 的回滚与 MVCC 作用
https://blog.xqcherry.top/posts/interview/mysql/undo-log/ 目录