恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复
一、数据库恢复-事务故障
系统通过对事物进行UNDO操作和REDO操作可实现故障后的数据库状态恢复
1、对于发生事务故障后的数据库恢复
- 恢复机制在不影响其他事务运行的情况下,强行回滚夭折事务,对该事务进行UNDO操作,来撤销该事务已对数据库进行的更新,使得该事务好像根本没有执行过一样,从而保持事务的原子性
- 恢复是由DBMS自动完成的 ,对用户是透明的
2、基于这里给出的一段多事务并发执行的日志示意图,记录的表示应采用约定好的表示方法。

假设事务T1在生成更新好的日志记录后发生故障,则系统进行恢复的步骤如下:
(1)首先从日志尾部开始反向向前扫描日志,即从最近写的日志记录到最早写的日志记录,查找该事物的更新操作W1

(2)然后依次对该事务的所有更新操作执行逆操作,将更新记录中对某数据项更新前的值,如Xold Yold写入数据库。若该更新操作是插入操作,更新前的值应为空,恢复时相当于做删除操作。若该更新操作是删除操作,恢复时相当于做插入操作

(3)继续反向扫描日志,直至遇到标记此事务开始的日志记录B1,恢复过程终止,并在该事务中添加该事物的异常终止记录A1

对于日志从后向前反向扫描处理可保证最后恢复的数据是事务开始时的数据。在某些DBMS中,恢复操作对数据库的更新操作也可能会产生另一种形式的日志信息记载在日志中,但这些日志信息不会再用于恢复操作
二、数据库恢复-系统故障
1、对于发生系统故障后的数据库恢复
- 恢复机制在系统重新启动时利用日志撤销(UNDO)所有非正常终止的事务已对数据库进行的更新 。保持夭折事务的原子性
- 重做(REDO)已提交事务对数据库的更新,保持提交事务的持久性,从而将数据库恢复到发生故障前的一致性状态
- 系统故障的恢复是由DBMS在系统重新启动时自动完成的,不需要用户干预
基于这里给出的一段并发事务日志示意图,假设系统在事务T1生成更新记录后崩溃

则系统进行恢复的步骤如下(系统故障后的恢复算法)
(1)首先从日志头部开始向后正向扫描日志,即从最早写的日志记录到最近写的日志记录,找到故障发生前已提交的事务和未执行完的事务即夭折事务。
对于在日志中有Commit日志记录的已提交事务T2 T4,将其事务标识记入待重做事务队列REDO-LIST中,由于系统提交生成Commit日志记录时,并不能确定其对数据库的更新已经在磁盘上,重做就是让已提交事务对数据库所做的任何更新都反应到磁盘上。对于日志中只有Begin Transaction日志记录而无相应Commit日志记录的尚未完成的事务T1、T3和T6,即事务的最后一条日志记录是更新日志时,将其事务标识记入UNDO-LIST中,对于有Abort日志记录的T5,因该事务已在系统崩溃前被回滚,则不再对其进行恢复

(2)从日志尾部向前反向扫描日志,对撤销事务队列中的所有需撤销的事务的更新操作依次执行其逆操作,将更新记录中“更新前的值 ”写入数据库,最终完成对每个需撤销事务的回滚并生成其异常终止记录。
由于系统崩溃前可能有多个未提交的事务,其中某些事务可能均对某个数据对象比如X进行了更新,所以恢复操作的顺序必须是从日志尾部向前反向进行,以保证最终恢复的数据库中的X值是所有夭折事务开始执行前的值

(3)第三步是从日志头部向后正向扫描日志,对重做队列中每个需重做的事务重新执行日志中的更新操作,将更新记录中“更新后的值”写入数据库,恢复操作的顺序是必须从日志头部向后正向执行,保证对一个特定数据对象的多个更新的执行顺序,与系统崩溃前的执行顺序一致

虽然前面的恢复策略为了提高效率,在撤销事务或重做事务的过程中,并没有把不同事务的撤销或重做分开进行,而是对日志进行一次扫描,在扫描的过程中每遇到一个更新记录,就执行一次UNDO或REDO操作
2、系统故障后的恢复算法存在的问题
- 但不管日志有多长,恢复过程都要扫描整个日志,检查所有日志记录,来确定哪些事务需要撤销,哪些事务需要重做
- 此外,重做事务队列中的许多事务,实际上已经早把它们的更新操作结果写到磁盘的数据库中了,然而恢复机制又重新执行了对数据库的更新
为了解决这两个问题,许多DBMS,如SQL Server采用一种检查点技术实现系统故障的恢复
3、采用检查点技术实现系统故障后的恢复
(1)可以限制恢复过程必须回溯的日志长度,有效减少搜索日志的时间
(2)同时有效减少系统重新启动后需要重做的事务,从而减少数据库恢复所需的时间和资源
(3)检查点的设置
- 采用检查点技术的DBMS,其事务处理的恢复机制在系统运行过程中,要定期或不定期地在生成的日志上设置检查点,如每隔一个小时建立一个检查点
- 或按照某种规则建立检查点,如活动日志已写满一半时设置一个检查点
假设系统运行时在tc时刻设置了一个检查点,而在下一个检查点到来之前的tf时刻系统发生崩溃

则此时系统中的事务可分为五类状态的事务,T1类为在检查点之前已提交的事务,T2类为在检查点之前开始执行,在检查点之后故障点之前已提交的事务,T3类为在检查点之前开始执行,在故障点时还未完成的事务,T4类为在检查点之后开始执行,在故障点之前已提交的事务,T5类为在检查点之后开始执行,在故障点时还未完成的事务

系统出现故障后,恢复机制将根据事务的状态,采取不同的恢复操作,这里我们介绍一种基于静态检查点技术实现系统故障恢复的策略
4、采用静态检查点技术实现系统故障后的恢复
(1)恢复机制采用该技术在设置检查点时具体要完成的工作有
- 首先暂时终止运行事务的执行。系统不再执行对数据库的更新,也不产生新的日志记录
- 将当前日志缓冲区中的所有日志记录写入磁盘的日志中
- 在日志中写入一个检查点记录。检查点记录的内容至少要包括设置检查点时刻所有正在执行的事务
- 将当前数据缓冲区中的所有数据写入磁盘的数据库中
- 把检查点记录在日志中的地址写入一个重新开始文件
- 最后,完成上述操作后,重新开始执行运行的事务
根据系统在检查点所做的工作,可以确定T1类已提交事务不必重做,因为其对数据库的所有更新,如W1操作的结果,已在检查点tc时刻写到数据库中了。T2、T4类事务需要重做,因为它们对数据库的更新结果可能仍在内存缓冲区中,还未写到磁盘的数据库中,但是重做T2类事务时并不需要重做早于检查点记录的更新操作,如W2,因为这类操作对数据库的更新结果,已在设置检查点时被刷新到磁盘上,T3、T5类事务必须撤销,因为它们还未提交,在系统崩溃前它们对数据库的更新,如W5操作的结果可能已写到磁盘的数据库中,其中T3事务,其在检查点前对数据库进行的更新,如W3操作的结果,在设置检查点时就已写入数据库中了,这些更新操作的结果都必须撤销,

5、采用静态检查点技术实现系统故障后的恢复步骤
系统确定恢复的事务及其恢复操作可如下进行
(1)从重新开始文件中找到系统崩溃前最后一个检查点记录在日志中的地址,由该地址在日志中找到最后一个检查点记录

(2)从检查点记录得到设置检查点时刻所有正在执行的事务,将其放入撤销事务队列UNDO-LIST中,包括T2、T3类事务

(3)从检查点记录开始向后正向扫描日志,确定需要重做或撤销的事务

如有新开始的事务,即发现事务的BEGIN TRRANSACTION日志记录,如B4,把T4暂时放入撤销事务队列UNDO-LIST里,如有新提交的事务,即发现事务的COMMIT日志记录,如C2,把T2从撤销事务队列UNDO-LIST中移到重做事务队列REDO-LIST中,扫描日志直到日志结束,即系统崩溃处,当日志扫描结束时,撤销事务队列UNDO-LIST和重做事务队列REDO-LIST就分别是需要撤销的事务,如事务T3、T5,以及需要重做的事务,如事务T2、T4
(4)从日志尾部向前反向扫描日志,对撤销事务队列中的每个事务执行撤销(UNDO)操作

(5)从检查点开始正向扫描日志,对重做事务队列的每个事务执行重做(REDO)操作


这里介绍的检查点技术在设置检查点时不允许事务对缓冲区或日志进行任何更新,事务执行必须停下,这一要求对许多应用系统是不能接受的。因此,有的DBMS采用更复杂或效率更高的检查点技术,策略中也可能先执行重做操作等,在此不作进一步讨论
三、数据库恢复-介质故障
1、对于发生介质故障的数据库恢复
- 不仅要使用日志,还要利用数据转储得到的数据库备份。数据库备份保存数据库在转储时的状态,当数据库所在磁盘被损坏后,可首先利用最新的数据库备份,将数据库恢复到进行转储前的数据库状态
- 然后再利用日志备份将数据库恢复到离故障发生时最近的一致性状态
- 介质故障的恢复,需要数据库管理员DBA的介入,需要DBA装入最新转储的数据库备份和有关的日志文件备份,然后执行系统提供的恢复命令,具体的恢复操作仍由DBMS来完成
2、例如SQL Server支持的T-SQL语言提供可实现对数据库进行恢复的RESTORE DATABASE语句
(1)该语句可指定备份中要恢复的数据文件名或包括多个数据文件的文件组名

(2)需指定备份文件所在的存储路径

(3)可指定本次是否撤销备份中任何未提交的事务,使数据库处于某个一致性状态,一般只在系列恢复操作的最后一个操作选用RECOVERY选项,其他恢复操作选择NORECOVERY

(4)还可指定是否对数据库中同名数据库进行覆盖

四、小结

1、恢复就是把数据库从事务故障、系统故障和介质故障等造成的不一致错误状态恢复到某个已知的正确状态。主要是利用存储在日志和数据备份中的冗余数据撤销(UNDO)夭折事务已对数据库进行的更新,重做(REDO)已提交的事务。采用尽可能高效的恢复策略,对发生故障后的数据库进行恢复。
2、事务处理的恢复机制使得发生故障后事务的执行仍保持原子性和持久性,从而也保持了数据库的一致性状态
相关文章:
恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复
一、数据库恢复-事务故障 系统通过对事物进行UNDO操作和REDO操作可实现故障后的数据库状态恢复 1、对于发生事务故障后的数据库恢复 恢复机制在不影响其他事务运行的情况下,强行回滚夭折事务,对该事务进行UNDO操作,来撤销该事务已对数据库…...
如何知道docker谁占用的显卡的显存?
文章目录 python环境安装nvidia-htop查看pid加一个追踪总结一下【找到容器创建时间】使用说明示例 再总结一下【用PID找到容器创建时间,从而找到谁创建的】使用说明示例 python环境安装nvidia-htop nvidia-htop是一个看详细的工具。 pip3 install nvidia-htop查看…...
wps linux node.js 加载项开发,和离线部署方案
环境准备 windwos 安装node.js 安装VSCode 安装wps linux 安装node.js 安装VSCode 安装wps 通过npm 安装wpsjs SDK 使用npm安装wpsjs npm install -g wpsjs 创建一个项目 wpsjs create WPS-Addin-PPT 创建项目会让你选择2个东西: 1:选择你的文…...
红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全非约束系约束系RBCD资源系Spooler利用
红队内网攻防渗透 1. 内网横向移动1.1 委派安全知识点1.1.1 域委派分类1.1.2 非约束委派1.1.2.1 利用场景1.1.2.2 复现配置:1.1.2.3 利用思路1:诱使域管理员访问机器1.1.2.3.1 利用过程:主动通讯1.1.2.3.2 利用过程:钓鱼1.1.2.4 利用思路2:强制结合打印机漏洞1.1.2.5 利用…...
nginx上传文件限制
默认限制 Nginx 限制文件大小可以通过 client_max_body_size 指令来设置,该指令通常在 http、server 或 location 块中设置,如果不设置,默认上传大小为1M。 修改上传文件限制 要修改Nginx的文件上传大小限制,你需要编辑Nginx的配…...
76. 最小覆盖子串(困难)
76. 最小覆盖子串 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:76. 最小覆盖子串 2.详细题解 在s中寻找一个最短的子串,使之包含t中的所有字符,t中可能存在多个相同字符,寻找的子串也应至少含有…...
K8S 集群节点扩容
环境说明: 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233(需上线)192.168.99.2332C4Gwoker1.23.1720.10.24 当现有集群中的节点资源不够用&…...
AI大模型技术在音乐创造的应用前景
大模型技术在音乐创作领域具有广阔的应用前景,可以为音乐家、作曲家和音乐爱好者提供以下方面的帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 音乐创作辅助:大模型可以帮助音乐家和作曲家生成旋律、和声…...
Linux多进程和多线程(一)-进程的概念和创建
进程 进程的概念进程的特点如下进程和程序的区别LINUX进程管理 getpid()getppid() 进程的地址空间虚拟地址和物理地址进程状态管理进程相关命令 ps toppstreekill 进程的创建 并发和并行fork() 父子进程执行不同的任务创建多个进程 进程的退出 exit()和_exit() exit()函数让当…...
熊猫烧香是什么?
熊猫烧香(Worm.WhBoy.cw)是一种由李俊制作的电脑病毒,于2006年底至2007年初在互联网上大规模爆发。这个病毒因其感染后的系统可执行文件图标会变成熊猫举着三根香的模样而得名。熊猫烧香病毒具有自动传播、自动感染硬盘的能力,以及…...
使用Vue3和Tailwind CSS快速搭建响应式布局
### 第一部分:初始化Vue3项目并安装Tailwind CSS 首先,在你的开发环境中打开终端,然后通过Vue CLI来创建一个新的Vue3项目。输入如下命令: vue create my-vue-app 按照提示选择Vue3的相关选项,创建完毕后࿰…...
J019_选择排序
一、排序算法 排序过程和排序原理如下图所示: 二、代码实现 package com.itheima.sort;import java.util.Arrays;public class SelectSort {public static void main(String[] args) {int[] arr {5, 4, 3, 1, 2};//选择排序for (int i 0; i < arr.length - 1…...
【linux】vim的使用
目录 一、Vim的基本模式 二、Vim的常见命令 三、Vim的高级用法 四、Vim的进阶使用技巧 在Linux系统中,Vim是一款功能强大的文本编辑器,特别适用于程序员的代码编辑和修改。以下是Vim的详细使用教程,包括其基本模式、常见命令和高级用法。…...
【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!
随着远程工作的普及和数字化办公的发展,越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下,ONLYOFFICE 8.1应运而生,成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件,提供文档处理、电子表格和幻灯片制作…...
核方法总结(四)——高斯过程回归学习笔记
一、定义 基于核方法的线性回归模型和传统线性回归一样,可以用未知数据进行预测,但不能确定 预测的可信度。在参考书第二章中可知,基于贝叶斯方法可以实现对未知数据依概率预测,进而可得到预测的可信度。这一方法中,通…...
【Python3的内置函数和使用方法】
目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型,类似于 List(列表) Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…...
递推算法计算信号特征
在线算法(在线计算或递推计算)能够在不存储全部数据的情况下逐步更新信号的特征信息,非常适合资源受限的单片机应用场景。 用途:单片机边采集ADC边计算,最终将采集的信号特征计算结果…...
spring-boot-configuration-processor注释处理器
开源项目SDK:https://github.com/mingyang66/spring-parent 个人文档:https://mingyang66.github.io/raccoon-docs/#/ spring-boot-configuration-processor是springboot提供的一个注释处理器(annotation processor),它用于在编译…...
Python和MATLAB粘性力接触力动态模型半隐式欧拉算法
🎯要点 🎯运动力模型计算制作过程:🖊相机捕捉网球运动图,制定运动数学模型,数值微分运动方程 | 🖊计算运动,欧拉算法离散积分运动,欧拉-克罗默算法微分运动方程 &#…...
webstorm无法识别tsconfig.json引用项目配置文件中的路径别名
问题 vite项目模板中,应用的ts配置内容写在tsconfig.app.json文件中,并在tsconfig.json通过项目引用的方式导入 {"files": [],"references": [{"path": "./tsconfig.app.json"},{"path": "./t…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
