09 250509

3

因为如果先写数据库再写日志文件,发生故障后无法恢复这个修改。如果先写日志再写数据库,恢复时只需要多做一次undo

4

  1. 重做T1T3,回滚T2T4
  2. 重做T1,回滚T2T3
  3. 重做T1,回滚T2T3
  4. 重做T1,回滚T2

5

  1. A=8 B=7 C=11
  2. A=10 B=0 C=11
  3. A=10 B=0 C=11
  4. A=10 B=0 C=11
  5. A=10 B=0 C=11
  6. A=0 B=0 C=0

6

  • 事务故障的恢复
    • 对未提交事务进行强行回滚(ROLLBACK),清除该事务对数据库的所有修改,消除未提交事务的影响
    • 保障事务原子性
  • 系统故障的恢复
    • 清除尚未完成的事务对数据库的所有修改
      系统重新启动时,恢复程序要强行撤消(UNDO)所有未完成事务
    • 缓冲区中已完成事务提交的结果写入数据库
      系统重新启动时,恢复程序需要重做(REDO)所有已提交的事务
    • 实现上,需要日志文件的帮助
  • 介质故障的恢复
    • 装入数据库发生介质故障前某个时刻的数据副本
    • 重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库
    • 实现上,需要数据转储副本(即备份数据)和日志文件的帮助

7

  • 检查点记录是一类新的日志记录
  • 检查点记录的内容
    • 建立检查点时刻所有正在执行的事务清单
    • 这些事务最近一个日志记录的地址

8

恢复的时候不需要搜索整个日志,只需从上个检查点开始,效率更高
如下面图中从Tc开始处理就可,无需遍历前面的事务
Pasted image 20250509150259.png

9

  • 检查点之前提交的事务不需要恢复
  • 对于检查点之后才提交的事务,其恢复过程
    1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址
    2. 由该地址在日志文件中找到最后一个检查点记录
    3. 由该检查点记录得到检查点建立时刻所有正在执行的事务
    4. 从检查点开始正向扫描日志文件,直到日志文件结束,对读到的事务建立已提交和未提交队列
    5. 对已提交事务进行Redo操作对未提交事务进Undo操作
Built with MDFriday ❤️