ARIES算法简介
intro
- 日志顺序号(LSN)
- 支持物理逻辑redo。它是物理的,但在页内它可能是逻辑的。
- 使用脏页表来最大限度地减少恢复时不必要的重做。
- 使用模糊检查点机制,只记录脏页信息和相关的信息,甚至不要求将脏页写到磁盘。不在检查点时将脏页写入磁盘,而是连续地在后台刷新脏页面。
数据结构
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阶段
找到一个更新日志记录:
- 如果该页不在脏页表中,或者该更新日志记录的LSN小于脏页表中该页的RecLSN,跳过
- 否则从磁盘中调出该页,如果其PageLSN小于该日志记录的LSN,就重做。
undo阶段
对日志进行一遍反向扫描,对undo-list中的所有事务进行撤销。
用分析阶段所记录的每一个事务的最后一个LSN来快速定位。
每找到一个更新日志记录,就用它来执行一个undo。
产生一个包含undo的CLR,并将该CLR的UndoNextLSN设置为该更新日志记录的PrevLSN。
如果遇到一个CLR,它的UndoNextLSN已经指明需要Undo的LSN,且应该已经回滚。