CMU 15-445 -- Database Recovery - 18
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 信息,举例如下:
Name | Where | Definition |
---|---|---|
flushedLSN | memory | 最后落盘的那个 LSN |
pageLSN | buffer pool page | 与某 page data 相关的最新 LSN |
recLSN | buffer pool page | 在上次落盘之后,与某 page data 相关的最老 LSN |
lastLSN | transaction | 某事务最后一条日志的 LSN |
MasterRecord | disk | 最近一次 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
重做时,需要:
- 重新执行日志中的操作
- 将 pageLSN 修改成日志记录的 LSN
- 不再新增操作日志,也不强制刷盘
在 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 如何能够提高性能?
-
Lazy Rollback:在新的事务访问数据页时才回滚数据
-
在数据库的用户侧,避免运行长时间的事务
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
相关文章:

CMU 15-445 -- Database Recovery - 18
CMU 15-445 -- Database Recovery - 18 引言ARIESLog Sequence NumbersNormal ExecutionTransaction CommitTransaction AbortCompensation Log Records Non-fuzzy & fuzzy CheckpointsSlightly Better CheckpointsFuzzy Checkpoints ARIES - Recovery PhasesAnalysis Phas…...

HTTP Header定制,客户端使用Request,服务器端使用Response
在服务器端通过request.getHeaders()是无效的,只能使用response.getHeaders()。 Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType mediaType,Class selectedConverterType, ServerHttpRequest request, ServerHttpRespo…...
Vue 3编写的父子组件示例,包括传递数据和调用父组件方法
下面是一个使用Vue 3编写的父子组件示例,包括传递数据和调用父组件方法: ChildComponent.vue: <template><div><p>Child Component</p><p>Message: {{ message }}</p><button click"updateMes…...

[ 容器 ] Docker 的数据管理
目录 一、Docker 的数据管理1.1 数据卷2. 数据卷容器 二、 端口映射三、容器互联(使用centos镜像)四、Docker 镜像的创建1.基于现有镜像创建2.基于本地模板创建3.基于Dockerfile 创建3.1 联合文件系统(Unio…...

【环境配置】使用Docker搭建LAMP环境
这篇文章不是介绍DOCKER是什么,也不是阐述DOCKER的核心:镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者,在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境,这是其一&#…...
MLIR (Multi-Level Intermediate Representation)
MLIR(Multi-Level Intermediate Representation)是一种多级中间表示的编译器基础架构,旨在提供通用的、可扩展的编译器基础设施。它最初由谷歌开发,并且现在已经成为一个开源项目,受到广泛关注和采用。 MLIR 的设计理…...

VR全景在酒店的发展状况如何?酒店该如何做营销?
现阶段,VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用,每天都有不少人通过VR全景展示来了解酒店的设施环境,而酒店也可以借此机会,详细展示自身优势,更大范围吸引顾客。 VR酒店拥有真实、立体的全…...

Winform使用PictureBox控件显示图片并且自适应
一.首先我们只需要在项目文件中的/bin/Debug 下面创建一个文件夹保存你的照片。我这里文件夹名字叫Resources.。如图: 二. 然后我们把我们的照片放入Resources文件夹中即可。如图: 三.在构造器中添加picturebox控件。如图: 四.我们到初始化代…...

HTML中的焦点管理
前言 焦点作为页面交互中的重要一环,涉及到的知识点也比较多,有必要做一个统一的总结。 HTML 中的可获取焦点的元素 具有 href 属性的 HTMLAnchorElement/HTMLAreaElement非禁用态的 HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLBut…...

如何区分接口测试和功能测试
接口测试和功能测试的区别: 2023最新Jmeter接口测试从入门到精通(全套项目实战教程) 本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者…...
limit分页查询
controller层 ApiOperation("员工分页查询")GetMapping("/page")public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){log.info("员工分页查询,参数为{}",employeePageQueryDTO);PageResult pageResul…...

mysql null 值查询不出来问题
最新遇到mysql null 值查询的问题,当查询这个字段有的为null 有的不为null 该字段查询条件查询为null值得将不显示。 举例 新建表 test_user name和phone得值默认值为null 我们添加一些数据 查询下name 不是张三得数据 select * from test_user where name !张…...

面试之CurrentHashMap的底层原理
首先回答HashMap的底层原理? HashMap是数组链表组成。数字组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。要将key 存储到(put)HashMap中,key类型实现必须计算hashcode方法,默认这个方法是对象的地址。接…...

Error in onLoad hook: “ReferenceError: plus is not defined“ found in
项目场景: 项目背景如下所示: 使用 HBuilder X 开发 项目, 调整页面时,直接运行到 浏览器查看页面设置效果,导致控制台出现下述报错信息 例如: 问题描述 遇到的问题如下所示: APP 中接收数据…...

ansible自动化运维(二)剧本、角色编写实战
😘作者简介:一名运维工作人员。 👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。 🙏创作不易,动动小…...

【Spring框架】@Resource注入以及与@Autowired的区别
目录 使用Resource设置name的方式来重命名注入的对象区别 使用Resource设置name的方式来重命名注入的对象 package com;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.spr…...

FTP服务器的搭建和配置上传脚本
文章目录 前言一、配置本地用户可上传权限ftp服务器1、用户登录ftp 二、配置FTP上传脚本文件1.脚本代码如下 补充知识 前言 vsftpd(Very Secure FTP Daemon)是一个在 Linux/Unix 系统上运行的一款开源免费的 FTP 服务器软件。vsftpd 支持支持 匿名用户、…...

Ubuntu22.04上部署Lua开发环境
需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境,其实步骤比较简单的,此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器,然后在容器内搭建Lua的环境,可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…...
React的hooks---自定义hooks
通过自定义 Hook,可以将组件逻辑提取到可重用的函数中,在 Hook 特性之前,React 中有两种流行的方式来共享组件之间的状态逻辑:render props和高阶组件,但此类解决方案会导致组件树的层级冗余等问题。而自定义 Hook 的使…...
Asp.Net 使用Log4Net (基础版)
Asp.Net 使用Log4Net (基础版) 1. 创建项目 创建ASP.NET Web Forms项目 在Visual Studio中创建一个新的ASP.NET Web Forms项目。命名为"Log4NetDemo"。 2.安装Log4Net包 打开NuGet包管理器控制台,并运行以下命令来安装Log4Net: mathemati…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...