CMU 15-445 -- Database Recovery - 18

news2024/11/16 21:26:32

CMU 15-445 -- Database Recovery - 18

  • 引言
  • ARIES
  • Log Sequence Numbers
  • Normal Execution
    • Transaction Commit
    • Transaction Abort
      • Compensation Log Records
  • Non-fuzzy & fuzzy Checkpoints
    • Slightly Better Checkpoints
    • Fuzzy Checkpoints
  • ARIES - Recovery Phases
    • Analysis Phase
    • Redo Phase
    • Undo Phase
    • 案例
  • Additional Crash Issues
  • Conclusion


引言

本系列为 CMU 15-445 Fall 2022 Database Systems 数据库系统 [卡内基梅隆] 课程重点知识点摘录,附加个人拙见,同样借助CMU 15-445课程内容来完成MIT 6.830 lab内容。


上节课介绍到,故障恢复算法由两个部分构成:

  • 在事务执行过程中采取的行动来确保出现故障时能够恢复 (上节课)
  • 在故障发生后的恢复机制,确保原子性、一致性和持久性 (本节课)

ARIES

本节课介绍的是 Algorithms for Recovery and Isolation Exploiting Semantics (ARIES),由 IBM Research 在 90 年代初为 DB2 DBMS 研发的基于 WAL 的故障恢复机制,尽管并非所有 DBMS 都严格按照 ARIES paper 实现故障恢复机制,但它们的思路基本一致。

ARIES 的核心思想可以总结为 3 点:

  • Write-Ahead Logging (WAL)
    • 在数据落盘之前,所有写操作都必须记录在日志中并落盘
    • 必须使用 Steal + No-Force 缓存管理策略 (buffer pool policies)
  • Repeating History During Redo
    • 当 DBMS 重启时,按照日志记录的内容重做数据,恢复到故障发生前的状态
  • Logging Changes During Undo
    • 在 undo 过程中记录 undo 操作到日志中,确保在恢复期间再次出现故障时不会执行多次相同的 undo 操作

Log Sequence Numbers

WAL 中的每条日志记录都需要包含一个全局唯一的 log sequence number (LSN),一般 LSN 单调递增。DBMS 中的不同部分都需要记录相关的 LSN 信息,举例如下:

NameWhereDefinition
flushedLSNmemory最后落盘的那个 LSN
pageLSNbuffer pool page与某 page data 相关的最新 LSN
recLSNbuffer pool page在上次落盘之后,与某 page data 相关的最老 LSN
lastLSNtransaction某事务最后一条日志的 LSN
MasterRecorddisk最近一次 checkpoint 的 LSN

在这里插入图片描述
在这里插入图片描述

在 buffer pool manager 中,每个 data page 都维护着 pageLSN,而 DBMS 本身需要追踪 flushedLSN,那么在 page x 落盘前,DBMS 必须保证以下条件成立:

在这里插入图片描述

在这里插入图片描述
当一个事务修改某 page 中的数据时,也需要更新该 page 的 pageLSN,在将操作日志写进 WAL 后,DBMS 会更新 flushedLSN 为最新写入的 LSN。


Normal Execution

每个事务都会包含一些列的读和写操作,然后提交 (commit) 或中止 (abort),本节我们来看下不存在故障时,事务的正常执行过程。在讨论之前,我们需要约定 4 个假设,简化问题:

  • 所有日志记录都能放进一个 page 中
  • 写一个 page 到磁盘能保持原子性
  • 没有 MVCC,使用严格的 2PL
  • 使用 WAL 记录操作日志,buffer pool policy 为 Steal + No-Force

Transaction Commit

当事务提交时,DBMS 先写入一条 COMMIT 记录到 WAL ,然后将 COMMIT 及之前的日志落盘,当落盘完成后,flushedLSN 被修改为 COMMIT 记录的 LSN,同时 DBMS 将内存中 COMMIT 及其之前的日志清除。最后再写入一条 TXN-END 记录到 WAL 中,作为内部记录,对于执行提交的事务来说,COMMIT 与 TXN-END 之间没有别的操作。整个过程如下图所示:

在这里插入图片描述


Transaction Abort

要处理事务回滚,就必须从 WAL 中找出所有与该事务相关的日志及其执行顺序。由于在 DBMS 中执行的所有事务的操作记录都会写到 WAL 中,因此为了提高效率,同一个事务的每条日志中需要记录上一条记录的 LSN,即 prevLSN,一个特殊情况是:

  • 第一条 BEGIN 记录的 prevLSN 为空。

实际上中止事务是 ARIES undo 操作的一种特殊情况:回滚单个事务。过程如下图所示:

在这里插入图片描述
可以看到,T4 的每条日志都记录着 prevLSN,当 T4 要中止时,DBMS 先向 WAL 中写入一条 ABORT 记录,然后寻着 LSN 与 prevLSN 连接串成的链表,找到之前的操作,倒序回滚,为了防止在回滚过程中再次故障导致部分操作被执行多次,回滚操作也需要写入日志中,等待所有操作回滚完毕后,DBMS 再往 WAL 中写入 TXN-END 记录,意味着所有与这个事务有关的日志都已经写完,不会再出现相关信息。那么,如何记录回滚操作呢?这就是我们马上要介绍的 CLR:

Compensation Log Records

CLR 记录的是 undo 操作,它除了记录原操作相关的记录,还记录了 undoNext 指针,指向下一个将要被 undo 的 LSN,CLR 本身也是操作记录,因此它也需要像其它操作一样写进 WAL 中,举例如下:

在这里插入图片描述
在这里插入图片描述

首先,对于事务(txn),在日志中写入一个ABORT记录。接着,按照相反的顺序回放该事务的更新操作。对于每个更新记录:

  • 写入一个CLR(Compensation Log Record)条目到日志中。
  • 还原旧的值(即执行撤销操作)。

最后,在日志中写入一个TXN-END日志记录,表示事务的结束。

值得注意的是:CLR(Compensation Log Records)永远不需要被撤销(undone)。

由于CLR是用来执行撤销操作的,它本身并不需要被撤销。CLR的目的是在恢复过程中执行撤销操作,而不是撤销自己。


Non-fuzzy & fuzzy Checkpoints

使用 Non-fuzzy 的方式做 checkpoints 时,DBMS 会暂停所有工作,保证落盘的是一个 consistent snapshot,整个过程包括:

  • 停止任何新的事务
  • 等待所有活跃事务执行完毕
  • 将所有脏页落盘

显然这种方案很糟糕。


Slightly Better Checkpoints

Non-fuzzy 需要停止所有事务,并且等待所有活跃事务执行完毕,我们是否有可能改善这一点?一种做法是:checkpoint 开始后,暂停写事务,阻止写事务获取数据或索引的写锁 (write latch),如下图所示:

在这里插入图片描述
checkpoint 开始时,txn 已经获取了 page#3 的写锁,后者可以继续往 page#3 中写数据,但不能再获取其它 page 的写锁,此时 DBMS 只管扫描一遍 buffer pool 中的 pages,将所有脏页落盘。这时,部分 txn 写入的数据可能会被 checkpoint 进程一起捎带落盘,这时磁盘中的数据 snapshot 处于 inconsistent 的状态。

即便如此,只要我们在 checkpoint 的时候记录哪些活跃事务正在进行,哪些数据页是脏的,故障恢复时读取 WAL 就能知道存在哪些活跃事务的数据可能被部分写出,从而恢复 inconsistent 的数据。因此整个 checkpoint 过程需要两类信息:

  • 活跃事务表:Active Transaction Table (ATT)
  • 脏页表:Dirty Page Table (DPT)

活跃事务表中记录着活跃事务的事务 id、事务状态 (Running/Committing/Candidate for Undo) 以及 lastLSN (最新的日志记录 LSN),当事务提交或中止后,相应的记录才会被删除;脏页表记录着 buffer pool 中所有包含未提交事务写入数据的页信息,其中还记录着每个脏页最近一次落盘的日志记录的 LSN,即 recLSN。

一个完整的 WAL 举例如下:

在这里插入图片描述
在第一个 checkpoint 处:活跃事务有 T2,脏页有 P11 和 P22;在第二个 checkpoint 处,活跃事务有 T3,脏页有 P11 和 P33。

这种方案尽管比 Non-fuzzy 好一些,不需要等待所有活跃事务执行完毕,但仍然需要在 checkpoint 期间暂停执行所有写事务。


Fuzzy Checkpoints

fuzzy checkpoint 允许任何活跃事务在它落盘的过程中执行。既然允许活跃事务执行,checkpoint 在 WAL 中的记录就不是孤零零的一条,而是一个区间,因此我们需要两类记录来标记这个区间:

  • CHECKPOINT-BEGIN:checkpoint 的起点
  • CHECKPOINT-END:checkpoint 的终点,同时包含 ATT 和 DPT 记录

当 checkpoint 成功完成时,CHECKPOINT-BEGIN 记录的 LSN 才被写入到数据库的 MasterRecord 中,任何在 checkpoint 之后才启动的事务不会被记录在 CHECKPOINT-END 的 ATT 中,举例如下:
在这里插入图片描述
显然实践中使用的是 fuzzy checkpoint,这也是接下来要介绍的 ARIES 的故障恢复算法的基础。


ARIES - Recovery Phases

ARIES 故障恢复一共分三步:

  • 分析 (analysis):从 WAL 中读取最近一次 checkpoint,找到 buffer pool 中相应的脏页以及故障时的活跃事务
  • 重做 (redo):从正确的日志点开始重做所有操作,包括将要中止的事务
  • 撤销 (undo):将故障前未提交的事务的操作撤销

整体流程如下图所示:

在这里插入图片描述
通过 MasterRecord 找到最后一个 BEGIN-CHECKPOINT 记录,然后分别进行 3 个阶段:

  • 分析:找到最后一个 checkpoint 之后哪些事务提交或中止了
  • 重做:找到 DPT 中最小的 recLSN,从那里开始重做所有操作
  • 撤销:WAL 最近的位置开始往回撤销所有未提交的事务操作

Analysis Phase

从最近的 BEGIN-CHECKPOINT 开始往近处扫描日志:

  • 如果发现 TXN-END 记录,则从 ATT 中移除该事务
  • 遇到其它日志记录时
    • 将事务放入 ATT 中,将 status 设置为 UNDO
    • 如果事务提交了,将其状态修改为 COMMIT
      • 如果事务提交了,但是对应脏页还没有落盘,并且是数据更新记录,按需更新 DPT 以及 recLSN

个人理解: recLSN代表着当前磁盘上对应页的LSN,而pageLSN是内存中页最新LSN

当 Analysis Phase 结束时:

  • ATT 告诉 DBMS 在发生故障时,哪些事务是活跃的
  • DPT 告诉 DBMS 在发生故障时,哪些脏数据页可能尚未写入磁盘

在这里插入图片描述


Redo Phase

Redo Phase 的目的在于回放历史,重建崩溃那一瞬间的数据库状态,即重做所有更新操作 (包括后来发生中止事务的操作),同时重做 CLRs。尽管 DBMS 可以通过一些手段避免不必要的读写,但本节课不讨论这些优化技术。

从 DPT 中找到最小的 recLSN,从那里开始重做更新记录和 CLR,除非遇到以下两种情况:

  • 受影响的 page 不在 DPT 中
  • 受影响的 page 在 DPT 中,但那条记录的 LSN 小于那个 page 的 recLSN

重做时,需要:

  1. 重新执行日志中的操作
  2. 将 pageLSN 修改成日志记录的 LSN
  3. 不再新增操作日志,也不强制刷盘

在 Redo Phase 结束时,会为所有状态为 COMMIT 的事务写入 TXN-END 日志,同时将它们从 ATT 中移除。


Undo Phase

将所有 Analysis Phase 判定为 U (candidate for undo) 状态的事务的所有操作按执行顺序倒序撤销,并且为每个 undo 操作写一条 CLR。


案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Additional Crash Issues

如果 DBMS 在故障恢复的 Analysis Phase 崩溃怎么办?

无所谓,再执行一次故障恢复算法就好

如果 DBMS 在故障恢复的 Redo Phase 崩溃怎么办?

无所谓,再重做所有操作即可,操作是幂等的

在 Redo Phase DBMS 如何能够提高性能?

如果数据库不会再次故障,可以异步地将数据落盘

在 Undo Phase DBMS 如何能够提高性能?

  1. Lazy Rollback:在新的事务访问数据页时才回滚数据

  2. 在数据库的用户侧,避免运行长时间的事务


Conclusion

ARIES 的核心观点回顾:

  • WAL with Steal/No-Force
  • Fuzzy Checkpoints
  • Redo everything since the earliest dirty page
  • Undo txns that never commit
  • Write CLRs when undoing, to survive failures during restarts

Log Sequence Numbers:

  • LSNs identify log records; linked into backwards chains per transaction via prevLSN.
  • pageLSN allows comparison of data page and log records.

本节对应教材PDF

论文: ARIES: a transaction recovery method supporting fine-granularity locking and partial rollbacks using write-ahead logging

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四范式x百胜软件 以生成式AI改造零售软件

7月20日,在百胜软件联合探路者举办的行业数字化转型研学活动上,百胜软件联合第四范式宣布将以「式说」大模型为核心,在软件智能化升级、行业赋能等方面开展深入合作,共同推动大模型在零售行业的创新与应用。 活动上,双…

RK3588 使用OpenCL 遇到坑

资源1:本文章的源代码为:加速中... 资源2:RK3588 Android上应用使用OpenCL,所需的所有so 一:RK3588是否支持OpenCL 通过GPT一通搜索,说不支持。 感觉GPT东西不全可信啊!!! 导致自己一直怀疑RK3588不支持OpenCL使用,为什么呢? 1.通过adb shell 发现里面没有clinfo…

游戏图标有哪些素材模板推荐

游戏图标设计在游戏UI中占有非常重要的地位。例如,当我们看到一个游戏的启动图标时,很容易区分它是哪个游戏。设计游戏图标不仅是一个图形,也是一个标志。 本文将通过各种游戏图标设计素材分享游戏图标的类别和设计游戏图标的思考。 1. 游戏…

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换(一般用于小转大)3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符:&& || !3.8 单目运算符3.9 三目运算符…

人工智能TensorFlow MNIST手写数字识别——实战篇

上期文章TensorFlow手写数字-训练篇,我们训练了我们的神经网络,本期使用上次训练的模型,来识别手写数字(本期构建TensorFlow神经网络代码为上期文章分享代码) http://scs.ryerson.ca/~aharley/vis/conv/ 0、插入第三方库 from PIL import Image# 处理图片 import tensorf…

Python补充笔记5-模块化、文件

目录 一、模块 二、模块的导入 三、python中的包​编辑 四、常用的内容模块 五、第三方模块的安装与使用 六、编码格式的介绍 七、文件读写的原理 八、常用的文件打开模式 ​九、文件对象的常用方法 十、with语句​编辑 十一、os模块的常用函数 十二、os.path模块的常用方法​编…

防御第四次作业

一、结合以下问题对当天内容进行总结 1. 什么是IDS? IDS是:入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全…

跨平台力量:探索C++Qt框架的未来前景

卓越的跨平台支持:CQt可以在多个平台上运行,包括Windows、Mac、Linux、Android和iOS等。这使得开发者能够使用同一份代码构建跨平台的应用程序,从而显著降低了开发成本和时间投入。 丰富的类库和工具:CQt提供了广泛的类库和工具&…

上位机编程 VS 嵌入式编程:哪个更有前途?揭秘行业发展秘密

上位机和嵌入式是计算机的两个具体应用领域,它们在语言、工具和应用方面存在一定的差异。上位机更加注重高层逻辑和抽象,提供了多种语言和工具供开发者选择。而嵌入式开发通常局限于使用C语言,并且在过去甚至需要使用汇编语言,开发…

QT Http协议

文章目录 前言一、HTTP概述二、HTTP的两种模型1.B/S模型2.C/S模型 三、请求报文和响应报文三、调试软件Postman四、QT中的HTTP类总结 前言 本篇文章来给大家讲解QT中的Http协议,Http协议主要用于网络中数据的请求和响应,那么这篇文章将给大家讲解一下这…

设计灵感充电!挂在悬崖边的建筑效果图,你会怎么设计?

我相信大部分人都看到过类似下面这张的民宿图片: 挂在悬崖边,四四方方的“盒子”,没有任何实用性和审美性可言。很多网友戏称:“这不是《消失的她》空中版吗?”那如果让你设计一个悬崖边的建筑,你会从何入手…

Python编程——while循环语句讲解

作者:Insist-- 个人主页:insist--个人主页 本文专栏:python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 目录 一、怎么理解循环? 二、while语句基础格式…

跨境电商多语言带直播功能功能列表

一、直播导购 1.直播入驻管理:直播入驻实际上就是商家入驻,开通商家后会获得直播权限 2.直播观看/拉流页面(分三屏,可以左右滑动): 左屏: 直播间信息:直播间名称、直播封面、房间号、在线人数、…

Android性能优化 — ANR问题定位分析

ANR(Application Not Response)应用程序未响应,当主线程被阻塞时,就会弹出如下弹窗 一、traces.txt文件 Android的traces.txt文件记录了进程的堆栈情况,对于分析应用响应慢,以及ANR的原因很有帮助。trac…

Spring Boot 2.7.8以后mysql-connector-java与mysql-connector-j

错误信息 如果升级到Spring Boot 2.7.8&#xff0c;可以看到因为找不到mysql-connector-java依赖而出现错误。 配置&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

仿VScode MDK背景配色方案

效果如果所示 操作方法&#xff1a;备份后修改~/UV4文件夹下的global.prop&#xff0c;用以下的代码代替。 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page936 caretline.visible1 highlight.matchingbraces1…

网络传输层协议:UDP和TCP

背景知识 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序&#xff1b; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -…

【论文笔记】RCM-Fusion: Radar-Camera Multi-Level Fusion for 3D Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2307.10249 1. 引言 目前的一些雷达-相机融合3D目标检测方法进行实例级的融合&#xff0c;从相机图像生成3D提案&#xff0c;并与雷达点云相关联以修正提案。但这种方法没有在最初阶段使用雷达&#xff0c;依赖于相机3D检测器&…

Cursor 基于GPT的代码生成工具

Cursor 基于GPT的代码生成工具 前言 Humans should focus on bigger problems. --- 来自Cursor介绍 Cursor.so是一款基于GPT的代码生成工具&#xff0c;它可以帮助开发者快速生成代码&#xff0c;甚至可以在生成的代码标记询问代码的作用&#xff0c;不需要科学上网可以试用&…

智能视频监控平台EasyCVR电子地图视频播放全屏情况下的异常排查与解决

安防视频监控平台TSINGSEE青犀视频EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 在视频监控管理平台TSINGSEE青…