zoukankan      html  css  js  c++  java
  • 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,且应该已经回滚。

  • 相关阅读:
    100到简单加减乘除算法的程序
    安卓日程管理系统中的bug
    绑定到Collection与绑定到CollectionViewSource的不同及解决方案
    【WPF】完美的布局不留白——解决WrapPanel右侧留白问题
    WPF里最简单的控件的Style你能写对么?(默认Style是有问题的)
    WPF Bug清单之(13)——应该出现却没有出现的ListView水平滚动条
    [WPF Bug清单]之(12)——与自定义Attached Property相关的Binding Path运行时错误
    请争取你可以拥有的——即使你不在乎
    C#编码风格——using语句的位置
    【WPF】实现QQ中的分组面板(2)——添加动画
  • 原文地址:https://www.cnblogs.com/ohmhong/p/6870018.html
Copyright © 2011-2022 走看看