Database System Concepts——读书笔记 第十九章 恢复系统

发布时间 2023-06-09 07:59:12作者: sahara-随笔

系统崩溃后,系统会检查日志以找到最后一个<checkpoint L>记录(这可以通过从日志末尾向后搜索日志来完成,直到找到第一个<checkpoint L>记录),L是检查点时活动的事务列表
重做或撤消操作只需要应用于L中的事务,以及在<checkpoint L>记录写入日志后开始执行的所有事务。让我们将这组事务表示为T。

  • 对于T中没有记录或的所有事务Tk在日志中记录,执行undo(Tk)。
  • 对于T中的所有事务Tk,使得记录或记录<Tk abort>出现在日志中,执行重做(Tk)。

请注意,事务或代表事务执行的每个更新操作,包括将数据项恢复到其旧值所采取的操作(如:回滚操作),现在都已记录在日志中。

当数据库系统在崩溃后重新启动时,恢复操作分为两个阶段:
在redo阶段,系统通过从最后一个检查点向前扫描日志来回放所有事务的更新。重放的日志记录包括系统崩溃前回滚的事务的日志记录,以及系统崩溃发生时未提交的事务的记录。此阶段还确定崩溃时未完成的所有事务,因此必须回滚这些事务。这种不完整的事务要么在检查点时是活动的,因此会出现在检查点记录的事务列表中,要么会在之后开始;此外,这种不完整的事务既没有也没有记录在日志中。
在redo阶段结束时,undo list包含所有未完成事务的列表,也就是说,它们在崩溃之前既没有提交也没有完成回滚。
在undo阶段,系统回滚undo list中的所有事务。它通过从日志末尾向后扫描日志来执行回滚。
a.每当它在undo list中找到属于某个事务的日志记录时,它都会执行撤消操作,就像在回滚失败事务时找到日志记录一样, 并且将redo-only log写入日志。
b.当系统在undo list中找到事务Ti的日志记录时,它会将日志记录写入日志,并从undo list中删除Ti。
c.一旦undo list变为空,即系统已找到最初在撤消列表中的所有事务的日志记录,undo阶段即终止。

redo阶段尽管这可能看起来很浪费,但即使对于失败的事务重复历史记录也可以简化恢复方案

数据库恢复子系统的常见技术和方案对比(二)