Tags: [ database chinese note ]
ARIES Database Crash Recovery Algorithms
ARIES
Algorithms for Recovery and Isolation Exploiting Semantics
ARIES 恢复协议的main idea:
- Write Ahead Logging: Any change is recorded in log on stable storage before the database change is written to disk (STEAL + NO-FORCE)
- Repeating History During Redo: restart时,回溯操作并将数据库恢复到崩溃前的确切状态
- Logging Changes During Undo: 将Undo操作记录到日志中,以确保在重复失败的情况下不会重复操作
WAL Records
每个log record中包含一个log sequence number (LSN)
- Data page中有pageLSN: 该page的最新更新的LSN
- flushedLSN: 到目前为止已刷新的最大LSN
- 在第 i 页可以写入磁盘之前,我们必须至少将日志刷新到 $pageLSN_i <= flushedLSN$ 的位置
Normal Execution
Transaction Commit
- 事务提交时,先在log buffer(WAL文件)中写一个
COMMIT
标识,再将所有log records刷到disk中,包括刚记录的COMMIT
标识- log刷新是对disk的顺序同步写入
- 当
COMMIT
标识储存在disk上时,DBMS会向application返回一个事务已提交的确认 - 之后DBMS会在log buffer中写一个
TXN-END
表示事务在系统中已经全部完成,不会再记录任何log recordTXN-END
是internal bookkeeping,不需要立即刷到disk上
Transaction Abort
Abort是仅适用于一个事务的ARIES撤销操作的一种特殊情况
- 在log record中添加
prevLSN
prevLSN
记录事务先前的LSN
,DBMS使用这些prevLSN
构造一个linked-list,更轻松地遍历log去查找records
- 引入Compensation Log Record(CLR, 与BEGIN, UPDATE等并列)
- 描述为了撤销先前更新记录的操作而采取的操作
- has all the fields of an update log record and the
undoNext
pointer (下一个要撤销的LSN) - CLR不需要撤销
- 要Abort事务的话
- 先将
ABORT
记录到memory的log buffer中 - 然后它以相反的顺序撤销(undone)事务的update更,以从数据库中删除它们的影响
- 对于每个撤销的update,DBMS在log中创建CLR并恢复旧值
- 在所有abort txs的updates都被恢复后,DBMS最终写入
TXN-END
的log record
- 先将
Checkpointing
DBMS一般会定期获取checkpoints,将buffer pool中的dirty pages写入disk
used to minimize how much of the log it has to replay upon recovery
这里讨论两种blocking checkpoint methods(阻塞checkpoint的方法),DBMS会在checkpoint过程中暂停transactions,确保DBMS在checkpoint期间不会错过对page的update
Blocking Checkpoint
DBMS将everything暂停,确保a consistent snapshot写入disk
- 暂停任何新txs的开始
- 等到所有active txs完成执行
- 刷新disk上的dirty page
另一种更好一点的Blocking Checkpoints
DBMS可以不必等到所有active txs完成执行 我们必须记录checkpoint开始的时候的内部系统状态
- 暂停任何新的txs的开始
- 在DBMS执行checkpoint的时候暂停txs
(记录checkpoint和checkpoint之间的)
引入几个两个Table:
Active Transaction Table (ATT)
ATT表示DBMS中active transactions的状态 在DBMS完成该事务的commit/abort的过程之后,将会删除这个事务的entry
对于每个transaction的entry,包含以下信息:
- $transactionID$: Unique tx identifier
- $status$: 当前tx的状态(mode)(Running, Committting Undo candidate)
- $lastLSN$: 事务写入的最新的LSN
Dirty Page Table (DPT)
DPT里面有关于在buffer pool中被uncommitted txs修改的pages的信息 每个dirty page都有$recLSN$->即首先导致page变脏的log record的LSN
然后这里是另一种更好的方法,允许tx在checkpoint期间继续执行,但是需要DBMS记录附加的信息,以此确定它可能错过了哪些updates
Fuzzy Checkpoints
DBMS允许其他txs继续运行
主要是用了额外的log records来track checkpoint boundaries:
<CHECKPOINT-BEGIN>
: Start of the checkpoint<CHECKPOINT-END>
: When the checkpoint has completed. ContainsATT+DPT
.
ARIES Recovery
ARIES Protocol由三阶段组成,当crash后重启,DBMS将执行以下阶段
- Analysis: 读取WAL以识别buffer pool中的dirty page和crash时的active transaction
- Redo: 从log中的适当点开始重复所有操作
- Undo: Reverse crash前的未提交事务的操作
Analysis Phase
从通过databse的MasterRecord LSN找到最后一个checkpoint开始:
- 从checkpoint向前扫描log
- 如果DBMS找到一条
TXN-END
记录,则从ATT中删除其tx - 所有其他记录,将tx添加到状态为
UNDO
的ATT中,并在提交时将tx状态修改成COMMIT
- 对于
UPDATE
的log record,如果page $P$不在DPT中,则将P
添加到DPT并将P
的recLSN
设置为log record的LSN
这里的57:53开始有例子
Redo Phase
目标是重复history来重建crash时刻的状态,重新应用所有updates(甚至可能aborted txs)并redo CLRs
DBMS从DPT中包含最小$recLSN$的log record开始向前扫描,对于具有给定LSB的每个update log record或者是CLR来说,DBMS会re-apply the update,除非:
- Affected page is not in the DPT or
- Affected page is in DPT but the record’s LSN is greater than smallest $recLSN$ or
- Affected $pageLSN(on disk) >= LSN$
redo的话,DBMS会重新过一遍log record中的change,然后将affected page的pageLSN设置成该log record的LSN
当redo阶段结束之后,DBMS会为所有状态为COMMIT
的tx写入TXN-END
log record,并将他们从ATT中删除
Undo Phase
在最后一个阶段,DBMS会reverse crash时处于active的所有txs,这些都是在analysis phase之后在ATT中具有UNDO
状态的事务
DBMS使用lastLSN
在reverse LSN顺序处理事务,从而加快遍历的速度,当它reverse tx的update时,DBMS会为每次修改将CLR entry写入log中。
一旦最后一个tx成功abort,DBMS就会flush log,然后准备开始处理新tx