ARIES,数据恢复算法,万变不离其宗...

news2024/10/6 7:20:55

今天来聊两个问题:

1. 如果缓冲池(buffer pool)满了,哪些数据页(page)要刷盘,哪些数据页不刷盘?

2. 数据库崩了,怎么利用检查点(checkpoint)与预写日志恢复数据?

问题一:缓冲池满时的刷盘策略

首先来回顾一下《预写日志WAL的核心思路...》中相关的一些知识点:

1. 检查点记录了某一个时刻,缓冲池中所有数据页的状态信息;

2. 预写日志(write-ahead logging,WAL)中记录了,事务在执行过程中,对数据库进行的所有写操作;

3. 日志序列号(log sequence number,LSN),可以标识所有操作序列时序的依据;

来介绍两个新的知识点:

其一,在数据库中,需要存储一个信息:

flushed-LSN:预写日志已刷盘的最大LSN。

画外音:这是日志刷盘。

其二,每个数据页X,还要包含两个信息:

page-LSN:最近修改数据页的LSN。

画外音:每一页数据,都会存储这个LSN。

rec-LSN:上次刷盘以来,最早修改数据页的LSN。

画外音:每一页数据,也会存储这个LSN。

这是两个边界LSN。

也就是说,在[rec-LSN, page-LSN]之间的所有操作,都将这一页数据变成了脏数据。

画外音:这是数据页刷盘。

如果flushed-LSN >= page-LSN(X)

说明:我们可以将页面X刷到磁盘上,因为在那之前的所有日志,都已经刷到了磁盘上。

画外音:这是WAL原则,先刷日志,才能刷数据。

反之,如果flushed-LSN =< page-LSN(X)

说明:有些对数据页X的操作,还没有被刷到预写日志磁盘上,此时我们不能将数据页X刷到磁盘。

400a707499177d8ca131a73a60565dd2.png

如上图例子所示,共有四个事务:

T1,将A由1改为2;

T2,将A由2改为3;

T3,将A由3改为4;

T4,将A由4改为9;

对于预写日志来说

LSN 001-010都已经刷到磁盘上

LSN 011-013都还在WAL buffer里

对于数据库来说:

flushed-LSN=10

这是预写日志已刷盘的最大LSN。

对于数据页X来说:

page-LSN(X)=12

数据buffer里,T4已经将A由4改为了9。

此时,flushed-LSN =< page-LSN(X)

于是,我们不能将数据页X刷到磁盘,因为预写日志还没有完成。我们只能刷盘其他数据页,来腾出缓冲池的内存空间哈。

问题二:数据库崩溃时的数据恢复算法

数据库崩溃后,所有内存buffer(WAL buffer以及buffer pool)中的数据都会丢失,我们如何利用检查点与预写日志,对数据进行恢复呢?

最常见故障恢复(crash recovery)算法是ARIES,Algorithms for Recovery and Isolation Exploiting Semantics,语义恢复与隔离算法。

这个算法的核心包含三个阶段:

阶段一,分析阶段:分析预写日志,对事务进行分类。

分析哪些预写日志?

假设刷新检查点日志的时刻是LSN,需要分析所有检查点LSN之后的预写日志。

如何对事务进行分类?

从检查点LSN开始,从前往后扫描预写日志:

1. 每条日志记录对应事务Tx,将Tx加入undo-Tx集合;

2. 遇到<Ti, Commit>记录,将Ti移出undo-Tx集合;

阶段二,Redo阶段:重做检查点LSN之后,预写日志中的所有操作。

从检查点LSN开始,从前往后扫描预写日志:

遇到<Ti, update>记录,修改检查点中对应的数据页X,将对应的数据进行修改,如此一来,就恢复到了数据库崩溃前的缓冲池数据页镜像。

这些数据页能全部刷盘吗?

不能,没有提交的事务的操作,必须进行回滚。

阶段三,Undo阶段:对于没有提交的事务,恢复这些事务对数据页的修改。

从flushed-LSN开始,从后往前逆向扫描预写日志,直到检查点LSN:

遇到<Ti, update>记录,如果Ti在undo-Tx集合中,就将对应的数据页进行回滚修改,如此一来,所有未提交事务的修改,就进行了回滚。

ARIES算法是数据恢复的典型算法,很多消息系统,存储系统,事务系统对算法进行过效率改良,但其内核,万变不离其宗。思路,比结论更重要。

好啦,《预写日志WAL的核心思路...》文末的坑也填了,这几篇技术思路的文章阅读实在惨淡,技术内容真的没啥人看了吗?还要不要继续写呢?

大伙帮忙三连支持下,感谢。

大家想看什么内容呢?评论区告诉我。

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

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

相关文章

MATLAB环境下4种噪声生成

生成噪声包括: 1)粉红色(闪烁)噪声-功率谱密度斜率-3 dB/oct。&#xff0c; - 10db /dec 2)红色(布朗)噪声-功率谱密度斜率-6 dB/oct。&#xff0c; - 20db /dec 3)蓝色噪声-功率谱密度斜率3 dB/oct。&#xff0c; 10db /dec 4)紫色(紫色)噪声-功率谱密度斜率 6db /oct。&…

鸿蒙如何打包应用程序

总结鸿蒙应用程序包 之前文章详细讲解了关于三种程序包的内容&#xff0c;现在简单总结一下&#xff1a; 1. 总结 首先需要搞清楚鸿蒙项目的模块Module的分类: Module分为“Ability”和“Library”两种类型 HAP HAP: Harmony Ability Package , 叫做鸿蒙Ability包。 “Abil…

【虚幻引擎】UE4初学者系列教程开发进阶实战篇——生存游戏案例

一、课程体系 1 学前必读 2 Character类相关基础 -人物移动控制 -动画蓝图 3 常见游戏机制基础 -碰撞器、触发器 -物体使用接口 -视角切换 4其他相关设计 -背包系统 -锻造系统 -物体破碎效果 -简易种植系统 -互动物体动画 5课程结语 二、UI部分 思维导图部分 实操部分 …

若依多数据源原理分析

首先&#xff0c;想明白不同的接口想要使用不同的数据源。 那么自然想到了AOP&#xff0c;自定义注解。 通过自定义注解标注当前方法到底使用的是哪个数据源。 上面是前置条件。 看下若依是怎么处理的&#xff1a; 1.定义自定义注解&#xff0c;以及对应的多数据源的枚举类…

p标签文本段落中因编辑器换行引起的空格问题完美解决方案

目录 1.修改前的代码&#xff1a;2.修改后的代码3.总结 在HTML文档中&#xff0c;如何要在&#xff08;p标签&#xff09;内写一段很长的文本段落&#xff0c;并且没有 换行。由于IDE或者编辑器界面大小有限或需要在vue中逻辑处理动态显示文本&#xff0c;一行写完太长&#x…

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木&#xff0c;我们可以构建出城堡、飞机、甚至整个城市。现在&#xff0c;想象一下如果有一个数字世界的乐高&#xff0c;我们可以用这样的“积木”来构建智能程序&#xff0c;这些程序能够阅读、理解和撰写文本&#xf…

在RT-Thread-Studio中添加arm_math库

1.在CMSIS\Lib\GCC中找到对应的库&#xff0c;如本文使用的libarm_cortexM4lf_math.a。将库拷贝到工程&#xff0c;并做如下图设置。搜索路径为库文件在项目中的实际位置。 2.将CMSIS\DSP\Include下的文件复制到工程目录中&#xff0c;并添加包含路径 3.添加宏定义&#xff0c…

【MySQL】MySQL 9.0悄悄的来了

MySQL 9.0.0 中的变化 MySQL 9.0 中的新功能 JavaScript 存储程序 MySQL 企业版现在支持用 JavaScript 编写的存储程序&#xff0c;例如使用 CREATE FUNCTION下面显示的语句和 JavaScript 代码创建的这个简单示例&#xff1a; CREATE FUNCTION gcd(a INT, b INT) RETURNS …

【PTGui、Pano2VR6、UE4】VR全景拍摄及漫游交互制作操作实例(更新中)

一、基本思路 首先进行VR全景拍摄&#xff0c;获取高质量的全景图像&#xff1b;然后使用PTGui进行图像拼接&#xff0c;确保图像的连续性与准确性&#xff1b;接着利用Pano2VR6进行VR漫游的制作&#xff0c;添加交互元素与多媒体内容&#xff1b;最后进行作品的调试与优化&am…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符&#xff0c;2…

时序模型综述论文

时序模型综述论文&#xff1a; A Survey of Time Series Foundation Models: Generalizing Time Series Representation with Large Language Model

抖音矩阵智能剪辑系统源码,saas多平台多账号一站式管理,系统搭建流程

‘1. 将MySQL升级至5.6版本&#xff0c;PHP更新至7.2版本&#xff0c;并使用Apache作为服务器。数据库应命名为“juzhen”。 2. 在Nginx环境下&#xff0c;实现伪静态的切换。 3. 将安装包解压至项目的根目录&#xff0c;并定位至application/database.php文件以更换数据库密…

Linux shell编程学习笔记62: top命令 linux下的任务管理器

0 前言 top命令是Unix 和 Linux下常用的性能分析工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息&#xff0c;以及正在运行的进程的相关信息&#xff0c;包括各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。 1 top命令…

JVM原理(十五):JVM虚拟机静态分配与动态分配

1. 分派 本节讲解的分派调用过程将会揭示多态性特征的一-些最基本的体现&#xff0c;如“重载”和“重写”在Java虚拟机之中是如何实现的。 1.1. 静态分派 案例&#xff1a; 我们先来看一段代码: Human mannew Man(); 我们把上面代码中的“Human"称为变量的“静态类型…

前端面试8

基础知识 解释一下什么是跨域问题&#xff0c;以及如何解决&#xff1f; 跨域问题是由于浏览器的同源策略限制了从一个源加载的网页脚本访问另一个源的数据。解决方法包括使用JSONP、CORS&#xff08;跨源资源共享&#xff09;、设置代理服务器等。 描述一下事件冒泡和事件捕获…

企业搭建知识库:解锁无限潜力的钥匙

在当今这个信息爆炸的时代&#xff0c;企业如何高效地管理、传播与利用知识&#xff0c;已成为衡量其竞争力的重要标尺。知识库&#xff0c;作为这一背景下的产物&#xff0c;正逐步成为企业不可或缺的数字资产。它不仅是一个自助式的数字门户&#xff0c;更是连接员工、客户与…

编程建模文件

你可以在MATLAB命令提示符下以编程方式执行大多数Simulink建模基础。与基本建模操作&#xff08;如创建模型、向模型添加块和设置参数&#xff09;相对应的命令列在“模型编辑基础知识”的“功能”部分中。这些示例显示了其中一些命令以及如何使用它们。 加载模型 加载模型会…

【Sping Boot2】笔记

Spring Boot 2入门 如何创建一个Spring Boot的Web例子&#xff1f;1.如何创建一个Spring Boot项目1.1 使用Maven构建一个Spring Boot 2项目1.1.1创建Maven工程注&#xff1a;Maven项目结构&#xff1a; 1.1.2引入SpingBoot相关依赖依赖注意事项&#xff1a; 1.1.3创建主类1.1.4…

Mybatis框架的集成使用

1_框架概述 框架是一个半成品&#xff0c;已经对基础的代码进行了封装并提供相应的API&#xff0c;开发者在使用框架时直接调用封装好的api可以省去很多代码编写&#xff0c;从而提高工作效率和开发速度,框架是一种经过校验、具有一定功能的半成品软件. 经过校验&#xff1a;指…

Python酷库之旅-第三方库Pandas(002)

目录 一、用法精讲 1、pandas.read_pickle函数 1-1、语法 1-2、参数 1-3、功能 1-4、返回值 1-5、说明 1-6、用法 1-6-1、代码示例 1-6-2、结果输出 2、pandas.DataFrame.to_pickle方法 2-1、语法 2-2、参数 2-3、功能 2-4、返回值 2-5、说明 2-5-1、文件路径…