ARIES算法简介

intro

  1. 日志顺序号(LSN)
  2. 支持物理逻辑redo。它是物理的,但在页内它可能是逻辑的。
  3. 使用脏页表来最大限度地减少恢复时不必要的重做。
  4. 使用模糊检查点机制,只记录脏页信息和相关的信息,甚至不要求将脏页写到磁盘。不在检查点时将脏页写入磁盘,而是连续地在后台刷新脏页面。

数据结构

LSN

每个日志记录都有一个唯一标识该记录的日志顺序号(LSN)。
LSN:由一个文件号以及在该文件中的偏移量组成。

每一页也维护一个叫页日志顺序号(PageLSN)的标识。每当一个更新操作发生在某页上时,该操作将其日志记录的LSN存储在该页的PageLSN域中。在恢复的撤销阶段,LSN值小于或等于PageLSN值的日志记录将不在该页上执行,因为它的动作已经在该页上了。

每个日志记录包含同一事务的前一日志记录的LSN,放在PrevLSN中,使得一个事务可以由后向前提取,而不必读整个日志。事务回滚中会产生一些特殊的redo-only的日志,称为补偿日志记录(Compensation Log Record, CLR)。CLR中还有额外的称为UndoNextLSN的字段,记录下一个需要undo的日志的LSN。

脏页表

包含一个在数据库缓冲区中已经更新的页的列表,为每一页保存其PageLSN和一个称为RecLSN的字段。RecLSN用于标识已经实施于该页的磁盘上的版本的日志记录。当某页首次被放入脏页表中,它的RecLSN值被设置为日志的当前末尾。

检查点日志记录

包含脏页表和活动事务的列表。

恢复算法

恢复的过程包含三个阶段:

  • 分析阶段:决定哪些事务要撤销,哪些页在崩溃时是脏的,以及重做阶段应从哪个LSN开始
  • redo阶段:从分析阶段决定的位置开始,执行重做,将DB恢复到发生崩溃前的状态
  • undo阶段:这一阶段回滚在发生崩溃时那些不完全的事务

分析阶段

找到最后的完整检查日志记录,将该记录读入脏页表。将redoLSN设为脏页表中页的RecLSN的最小值。

将undo-list初始设置为检查点日志记录中的事务列表,从检查点正向扫描,发现新的begin,就加入;发现end,就删去。也记录undo-list每一个事务的最后一个记录,在undo阶段使用。

一旦有更新页的记录,不在脏页表,也加入脏页表。

redo阶段

找到一个更新日志记录:

  1. 如果该页不在脏页表中,或者该更新日志记录的LSN小于脏页表中该页的RecLSN,跳过
  2. 否则从磁盘中调出该页,如果其PageLSN小于该日志记录的LSN,就重做。

undo阶段

对日志进行一遍反向扫描,对undo-list中的所有事务进行撤销。

用分析阶段所记录的每一个事务的最后一个LSN来快速定位。

每找到一个更新日志记录,就用它来执行一个undo。

产生一个包含undo的CLR,并将该CLR的UndoNextLSN设置为该更新日志记录的PrevLSN。

如果遇到一个CLR,它的UndoNextLSN已经指明需要Undo的LSN,且应该已经回滚。

posted @ 2017-05-17 23:02  ohmhong  阅读(4765)  评论(0编辑  收藏  举报