内容简介:该算法在1992的时候被提出,几乎所有db都用ARIES来做recovery,或着是它的变种,可见其地位。ARIES的核心思想如下。ARIES的前提是该数据库是STEAL + NO-FORSE。否则事情就简单了,不需要用ARIES这么复杂。可见最简单的实现当然是NO-STEAL + FORSE,也就不需要redo和undo了,但是性能低。而且当机器的内存不足以支撑事务所需要的大小时,也不可行。
该算法在1992的时候被提出,几乎所有db都用ARIES来做recovery,或着是它的变种,可见其地位。ARIES的核心思想如下。
-
Write-Ahead Logging
在内存中的所有修改,都要以log的形式在data之前刷到磁盘
-
Redo
重启的时候,对所有已提交的事务做redo
-
undo
重启的时候,对所有未提交的事务做undo
ARIES的前提是该数据库是STEAL + NO-FORSE。否则事情就简单了,不需要用ARIES这么复杂。
-
STEAl
允许未提交的事务将dirty data刷到磁盘
-
NO-FORSE
在事务提交之前,不强制将所有dirty data刷到磁盘
可见最简单的实现当然是NO-STEAL + FORSE,也就不需要redo和undo了,但是性能低。而且当机器的内存不足以支撑事务所需要的大小时,也不可行。
Write-Ahead Logging
如之前所说,为了解决断电以后的一致性问题。在内存中的所有修改,都要以log的形式在data之前刷到磁盘。在事务开始之前写一个
- undo log: record中保存旧值,db是STEAL才需要undo。或者用来做abort之后的撤销。
- redo log: record中保存新值,db是NO-FORSE才需要redo
- undo-redo log (ARIES属于这一种)
最简单的一条log的记录为
Log Sequence Number
为了更方便的追踪,现在每一条log record都会有一个对应的全局逻辑序号LSN。整个DB各个地方都会用到。
- flushedLSN,存在memory。表示磁盘上最新的log record的LSN。
- pageLSN,内嵌在page里。代表最新的对这个page update的log LSN。(每次对page update都要更新)
- recLSN , 也是内嵌在page里。与pageLSN相反,代表最旧的对这个page update的log LSN。(只更新一次)
- lastLSN,存在memory,每个事务都会维护。该事务最新的一个操作记录的LSN。
- MasterRecord,存在disk。指向最新的一个checkpoint。
只有当flushLSN >= pageLSN时,相关的page才能刷到磁盘。表示对这个page所做的所有log都已经落盘了。
Transaction Operation
-
txn start
- 写一条
记录
- 写一条
-
txn commit
- 写一条
记录 - 将log刷到磁盘
- 写一条
记录。代表这个事务已经正式完成了。但page是否已经刷到磁盘是确定。看到 记录即可以对该事务做undo。
- 写一条
-
txn abort
- 写一条
记录。 - 反向扫描log,对该事务做undo。可以用prevLSN加速。注意的是对每次更新都需要在log里写一条CLR。防止在undo的db崩溃。
- 结束后写一条
记录
Compensation Log Record(CLR)的格式与普通log一样,除了多加一条undo_next_lsn。
- 写一条
下面是一次abort的示意图。
Checkpoint
WAL有一个显著的问题,随着系统运行时间越长,log会变得越来越长,导致每次crash之后,dbms需要对整个log进行恢复操作。所以dbms定期会做checkpoint,将当前在内存中的数据全部刷到磁盘,则下次恢复只需从最新的checkpoint开始即可。
Blocking Checkpoint
最Basic的版本,也是性能最差的版本
- 停止接受开启新的事务。并等待还在运行中的事务结束。
- flush所有log和dirty page
- 写一条
记录到log
Fuzzy Checkpoint
ARIES中使用的版本。允许接受新的事务,并且不需要等待还在运行中的事务结束。
为了达到这两个目的,需要维护两张表来保证。
-
Active Transaction Table (ATT)
- txn_id: 当前正在运行的事务
- status:事务的状态(Running,Committing,Undo candidate)
- lastLSN: 事务最新一次update的LSN
ARIES需要对ATT做undo
-
Dirty Page Table (DPT)
- 所有未提交事务的dirty page。
- page中包含一个recLSN:第一次让该page变dirty的LSN
ARIES需要对DPT做redo
Fuzzy Checkpoint有两条log record需要添加。
-
-
:需要包含ATT和DPT。ARIES需要根据这两个信息做恢复。
ARIES
ARIES总共做如下三个步骤
-
Analysis
从最新一个checkpoint开始,从前往后读,确定ATT和DPT。
- 根据MasterRecord找到最新的一个Checkpoint
- 如果发现TXN-END,将该事务从ATT中删去。(该事务的所有log都刷到磁盘,不需要undo该事务)
- 将其他record中事务加到ATT
- 如果是update record。若当前page不在DPT,则加到DPT中,并将recLSN设为LSN(只更新这一次)。
-
Redo
从某个指定位置(DPT中最小的recLSN)开始,从前往后扫描,对已提交的事务(NO-FORSE, DPT)进行redo。
- 从DPT找到一个最小的recLSN。(最远的一条记录使DPT中某个page dirty)
- 从该位置往前扫描,对每条update record或者CLR,进行redo,除非满足下面其中一个条件可跳过:
- 该page不在DPT中。
- 该page在DPT中,但是这条update record的LSN比该page的recLSN大。(说明使该page变dirty的record还没出现,在recLSN之前的数据都已经落盘了)
- 该page的pageLSN大于当前record的LSN。(该page是从disk中读上来的,说明pageLSN之前的操作都已经落盘了,不需要在redo)
-
Undo
从后往前扫描,对未提交的事务(STEAL, ATT)进行undo
- 将所有ATT中标志状态为U的事务做undo
- 从后往前扫描,每次更新也需要写CLR。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。