数据库Recovery

Recovery

恢复算法是确保数据库一致性、事务原子性和在故障情况下持久性的技术。

恢复算法有两部分:

  • 正常txn处理期间的操作,以确保DBMS可以从故障中恢复。
  • 将数据库恢复到确保原子性、一致性和持久性的状态失败后的操作。

ARIES

Main Ideas

  1. Write-Ahead Logging
    • 在数据库更改写入磁盘之前,任何更改都会记录在稳定存储上的日志中。
    • 必须使用STEAL + NO-FORCE缓冲池策略
  2. Repeating History During Redo
    • 在DBMS重新启动时,追溯操作并将数据库恢复到崩溃前的确切状态。
  3. Logging Changes During Undo
    • 将撤消操作记录到日志中,以确保在重复失败时不会重复操作。

Log Swquence Numbers

Logging的拓展记录格式
每个日志记录都包括一个全局唯一的日志序列号(LSN)。

  • LSN表示txns对数据库进行更改的物理顺序。
Log Sequence Numbers
日志序列号 存储位置 定义
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恢复阶段

ARIES恢复阶段

第一阶段:分析(Analysis)

在分析阶段,数据库系统会识别故障发生的点以及可能需要恢复的事务。具体的步骤包括:

  1. 扫描日志:数据库会扫描日志文件,确定最近一次正常的检查点,以及从该检查点开始到故障点之间的日志记录。
  2. 标识活跃事务:分析阶段会确定哪些事务在故障发生时处于活跃状态,即哪些事务尚未提交或已提交但尚未完成。
  3. 识别脏页:脏页是在故障之前被修改但尚未写入磁盘的数据页。分析阶段会标识所有脏页,这些页需要在恢复过程中重新应用(重做)或回滚(撤销)。

第二阶段:重做(Redo)

在重做阶段,数据库会根据分析阶段的结果,重新应用之前未写入磁盘的事务更改,以保证数据的一致性。具体的步骤包括:

  1. 从检查点开始:从上一个检查点开始,对所有脏页进行重做,将未写入磁盘的更改重新应用到数据库中。
  2. 按照日志顺序重做:根据日志中的顺序,逐条重做日志记录中的事务更改操作。
  3. 更新日志缓冲区:在重做期间,会将重做的操作写入一个临时的日志缓冲区,以保证在下一个阶段(撤销阶段)的回滚操作能够正确进行。

第三阶段:撤销(Undo)

在撤销阶段,数据库会对在故障时尚未提交的事务(活跃的事务)进行回滚,以确保数据库的一致性。具体的步骤包括:

  1. 从故障点开始:从故障点开始,根据分析阶段的结果,识别需要回滚的事务。
  2. 执行撤销操作:对于每个需要回滚的事务,按照相反的操作进行撤销,即对于插入操作执行删除,对于更新操作执行相应的反向操作。
  3. 更新日志:在回滚操作期间,会生成日志记录,记录已经完成的回滚过程。

猜你喜欢

转载自blog.csdn.net/weixin_47895938/article/details/132298291