Recovery
恢复算法是确保数据库一致性、事务原子性和在故障情况下持久性的技术。
恢复算法有两部分:
- 正常txn处理期间的操作,以确保DBMS可以从故障中恢复。
- 将数据库恢复到确保原子性、一致性和持久性的状态失败后的操作。
ARIES
Main Ideas
- Write-Ahead Logging
- 在数据库更改写入磁盘之前,任何更改都会记录在稳定存储上的日志中。
- 必须使用STEAL + NO-FORCE缓冲池策略
- Repeating History During Redo
- 在DBMS重新启动时,追溯操作并将数据库恢复到崩溃前的确切状态。
- Logging Changes During Undo
- 将撤消操作记录到日志中,以确保在重复失败时不会重复操作。
Log Swquence Numbers
Logging的拓展记录格式
每个日志记录都包括一个全局唯一的日志序列号(LSN)。
- LSN表示txns对数据库进行更改的物理顺序。
日志序列号 | 存储位置 | 定义 |
---|---|---|
flushedLSN | 缓冲区控制块 Memory | 最近一个已经将脏数据写入磁盘的日志序列号。 |
pageLSN | 数据页Page | 数据页中最近一条记录的日志序列号,表示该页的修改状态。 |
recLSN | 数据页Page | 数据页自上次刷新以来的最旧更新。 |
lastLSN | Ti | 表示事务的最后一次操作所使用的日志序列号,用于恢复和回滚事务。 |
MasterRecord | Disk | 最后一次checkpoint的LSN。 |
Writing Log Records
每个数据页都包含一个pageLSN。
- 该页的最新更新的LSN
系统跟踪已刷新的LSN
- 到目前为止,最大LSN刷新了
在DBMS可以将页面x写入磁盘之前,它必须至少将日志刷新到pageLSNx ≤ flushedLSN
所有日志记录都有一个LSN
每次txn修改页面中的记录时,更新页面LSN。
每次DBMS将WAL缓冲区写入磁盘时,更新内存中的刷新LSN。
Normal Executiion
每个txn调用一系列读取和写入,然后是提交或中止
Assumptions:
- 所有日志记录都适合在一个页面中
- 磁盘写入是原子的。
- 具有强严格2PL的单版本元组。
- Steal + No-Force缓冲区管理
Transaction Commit
当txn提交时,DBMS将一个提交记录写入日志,并保证直到txn的提交记录的所有日志记录都刷新到磁盘。
- 日志刷新是顺序的,同步写入磁盘
- 每个日志页有多条日志记录
提交成功后,写入一条特殊的TXN-END记录到日志中。
- 指示txn的新日志记录将不再出现在日志中
- 这不需要立即flash
Transaction Abort
中止txn是仅应用于一个txn的ARIES undo操作的特殊情况。
我们需要在日志记录中添加另一个字段:
- prevLSN:txn的上一个LSN
- 这为每个txn维护了一个链表,可以轻松地浏览其记录。
Compensation Log Records
CLR描述了为撤消先前更新记录的操作而采取的操作。
它具有更新日志记录的所有字段加上undoNext指针(下一个要撤消的LSN)。
CLR将添加到日志记录中,但DBMS不会等待它们被刷新,然后通知应用程序txn已中止。
Abort Algorithm
首先写入一个ABORT记录以记录txn。
然后按相反的顺序分析txn的更新。对于每个更新记录
- 将CLR条目写入日志
- 恢复旧值
最后,写入TXN-END记录并释放锁
Notice: CLRs never need to be undone.
Non-Fuzzy Checkpoints
DBMS在使用检查点时停止所有操作,以确保快照的一致性
- 停止任何新的txns的开始。
- 等待所有活动的txns执行完毕
- 刷新磁盘上的脏页。
这对运行时性能有害,但使恢复变得容易。
Slightly Better Checkpoints
在DBMS采取检查点时暂停修改txns。
- 防止查询获取表/索引页上的写锁。
- 不必等到所有的txns完成后再CheckPoint。
必须记录检查点开始时的内部状态。
- A :Activate表示一个活跃状态的事务。活跃状态的事务是正在执行或正在等待的事务。在事务执行期间,相关的操作会被记录在日志中,以便在需要时进行回滚或恢复操作。
- DPT:Dirty Page Table脏页表是数据库内部的一个数据结构,用于跟踪在内存中已被修改但尚未写入磁盘的数据页。每当数据库中的数据页被修改时,相应的数据页会被标记为 “脏”,即已被更改但尚未同步到磁盘。脏页表记录了这些脏页的信息,以便在适当的时候将其写回到磁盘,确保数据的持久性和一致性。
- ATT:Activate Transaction Table活跃事务表是数据库内部用于跟踪当前活跃事务的数据结构。每当一个事务开始执行时,相关信息(如事务 ID、状态等)会被记录在活跃事务表中。在数据库管理系统中,活跃事务表的维护对于并发控制和恢复操作至关重要。这些信息可用于监控事务状态,处理并发操作以及在需要时执行恢复操作
Activate Transaction Table
每个当前活动的txn一个entry。
- txnId:唯一的txn标识符。
- status:Txn的当前“模式”。
- lastLSN:txn创建的最新LSN。
删除TXN-END记录后面的条目。
- R:Runing
- C:Committing
- U:Candidate for Undo
Dirty Page Table
跟踪缓冲池中哪些页面包含尚未刷新到磁盘的更改。
缓冲池中每个脏页一个Entry:
- recLSN : 首先导致页脏的日志记录的LSN
Fuzzy CheckPoints
模糊检查点是DBMS允许活动的txns继续运行,同时系统为检查点写入日志记录。
- 不尝试将脏页强制到磁盘。
用于跟踪检查点边界的新日志记录:
- Checkpints-Begin:指示检查点的开始
- Checkpoints-end:包含ATT和DPT
ARIES-Recovery Phases
Phase 1 Analysis : 从MasterRecord开始,在正向方向检查WAL,以识别崩溃时缓冲池和活动txns中的脏页。
Phase 2 Redo : 从日志中的适当点开始重复所有操作(即使是将中止的txns)。
Phase 3 Undo : 撤销在崩溃前未提交的txns的操作。
详细步骤:
ARIES恢复阶段
第一阶段:分析(Analysis)
在分析阶段,数据库系统会识别故障发生的点以及可能需要恢复的事务。具体的步骤包括:
- 扫描日志:数据库会扫描日志文件,确定最近一次正常的检查点,以及从该检查点开始到故障点之间的日志记录。
- 标识活跃事务:分析阶段会确定哪些事务在故障发生时处于活跃状态,即哪些事务尚未提交或已提交但尚未完成。
- 识别脏页:脏页是在故障之前被修改但尚未写入磁盘的数据页。分析阶段会标识所有脏页,这些页需要在恢复过程中重新应用(重做)或回滚(撤销)。
第二阶段:重做(Redo)
在重做阶段,数据库会根据分析阶段的结果,重新应用之前未写入磁盘的事务更改,以保证数据的一致性。具体的步骤包括:
- 从检查点开始:从上一个检查点开始,对所有脏页进行重做,将未写入磁盘的更改重新应用到数据库中。
- 按照日志顺序重做:根据日志中的顺序,逐条重做日志记录中的事务更改操作。
- 更新日志缓冲区:在重做期间,会将重做的操作写入一个临时的日志缓冲区,以保证在下一个阶段(撤销阶段)的回滚操作能够正确进行。
第三阶段:撤销(Undo)
在撤销阶段,数据库会对在故障时尚未提交的事务(活跃的事务)进行回滚,以确保数据库的一致性。具体的步骤包括:
- 从故障点开始:从故障点开始,根据分析阶段的结果,识别需要回滚的事务。
- 执行撤销操作:对于每个需要回滚的事务,按照相反的操作进行撤销,即对于插入操作执行删除,对于更新操作执行相应的反向操作。
- 更新日志:在回滚操作期间,会生成日志记录,记录已经完成的回滚过程。