当前位置: 首页 > news >正文

恢复策略(下)-事务故障后的数据库恢复、系统故障后的数据库恢复(检查点技术)、介质故障后的数据库恢复

一、数据库恢复-事务故障

系统通过对事物进行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的相关选项,创建完毕后&#xff0…...

J019_选择排序

一、排序算法 排序过程和排序原理如下图所示&#xff1a; 二、代码实现 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系统中&#xff0c;Vim是一款功能强大的文本编辑器&#xff0c;特别适用于程序员的代码编辑和修改。以下是Vim的详细使用教程&#xff0c;包括其基本模式、常见命令和高级用法。…...

【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!

随着远程工作的普及和数字化办公的发展&#xff0c;越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下&#xff0c;ONLYOFFICE 8.1应运而生&#xff0c;成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件&#xff0c;提供文档处理、电子表格和幻灯片制作…...

核方法总结(四)——高斯过程回归学习笔记

一、定义 基于核方法的线性回归模型和传统线性回归一样&#xff0c;可以用未知数据进行预测&#xff0c;但不能确定 预测的可信度。在参考书第二章中可知&#xff0c;基于贝叶斯方法可以实现对未知数据依概率预测&#xff0c;进而可得到预测的可信度。这一方法中&#xff0c;通…...

【Python3的内置函数和使用方法】

目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型&#xff0c;类似于 List&#xff08;列表&#xff09; Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…...

递推算法计算信号特征

在线算法&#xff08;在线计算或递推计算&#xff09;能够在不存储全部数据的情况下逐步更新信号的特征信息&#xff0c;非常适合资源受限的单片机应用场景。 用途&#xff1a;单片机边采集&#xff21;&#xff24;&#xff23;边计算&#xff0c;最终将采集的信号特征计算结果…...

spring-boot-configuration-processor注释处理器

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ spring-boot-configuration-processor是springboot提供的一个注释处理器&#xff08;annotation processor&#xff09;,它用于在编译…...

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…...

webstorm无法识别tsconfig.json引用项目配置文件中的路径别名

问题 vite项目模板中&#xff0c;应用的ts配置内容写在tsconfig.app.json文件中&#xff0c;并在tsconfig.json通过项目引用的方式导入 {"files": [],"references": [{"path": "./tsconfig.app.json"},{"path": "./t…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...