本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

深入浅出:Oracle中的重做(Redo)与撤销(Undo)如何协同工作

什么是重做和撤销?

想象你正在玩一个电子游戏,游戏有两个神奇功能:

  1. 撤销(Undo):就像"后悔药",可以让你回到上一步操作前的状态
  2. 重做(Redo):就像"时光机",可以重现你之前的所有操作

Oracle数据库正是用这两个机制来确保数据安全,即使系统崩溃也不会丢失重要信息。

一个生动例子

假设我们在数据库中执行以下操作:

  1. 新增一条数据(INSERT)
  2. 修改这条数据(UPDATE)
  3. 删除这条数据(DELETE)
  4. 最后确认保存(COMMIT)

让我们看看每个步骤中重做和撤销如何工作。

1. 新增数据(INSERT)

发生了什么

  • 数据库会同时做两件事:
  • 记下"撤销笔记"(Undo):记录如何删除这条新增的数据
  • 记下"重做笔记"(Redo):记录如何重新新增这条数据

如果突然断电

  • 因为还没确认保存,就像你写了一半的短信没发送
  • 重启后,系统发现这个操作没完成,自动丢弃这个半成品

2. 修改数据(UPDATE)

发生了什么

  • 这次"撤销笔记"更详细:记录修改前的原始值
  • "重做笔记"记录修改后的新值

有趣的现象

  • 即使系统崩溃,重启后:
  • 先用"重做笔记"重现已记录的操作
  • 再用"撤销笔记"回滚未完成的操作
  • 就像游戏自动帮你恢复到最近的安全点

3. 删除数据(DELETE)

发生了什么

  • "撤销笔记"记录被删除的完整数据
  • "重做笔记"记录删除操作本身

4. 确认保存(COMMIT)

关键时刻

  • 这时数据库会确保所有"重做笔记"都安全写入硬盘
  • 即使之后系统崩溃,也能100%恢复已确认的数据

为什么撤销信息也需要重做保护?

这就像你不仅记下要做的事情清单(重做),还记下了"如果后悔该怎么办"的说明(撤销)。为了保证万无一失,连"后悔说明"本身也需要备份!

实际应用中的智慧

  1. 回滚比想象中简单
  • 回滚时不需要读重做日志,直接从撤销信息操作
  • 就像你不需要重看所有操作录像,直接按撤销说明操作就行
  1. 系统设计精妙之处
  • 重做日志主要是顺序写入,很少读取
  • 这种设计避免了读写冲突,提高了性能
  1. 崩溃恢复机制
  • 先重放所有操作(前滚)
  • 再撤销未完成的操作(回滚)
  • 确保数据文件最终一致

总结

Oracle通过重做和撤销的双重保障:

  • 重做日志像飞机的黑匣子,记录所有操作
  • 撤销信息像应急手册,提供回退方案
    两者配合,确保数据在任何情况下都能保持一致性,就像有个24小时不休息的数据保镖,随时准备应对各种意外情况。

------------------作者介绍-----------------------

姓名:黄廷忠

现就职:Oracle中国高级服务团队

曾就职:OceanBase、云和恩墨、东方龙马等