数据库恢复技术

事务

含义:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位

地位:恢复和控制并发的基本单位

区分事务和程序,一个程序中包含多个事务

定义事务

事务的开始与结束可以由用户显式控制

若用户没有显式地定义事务,则由数据库管理系统按默认规定自动划分事务

语句

begin transaction;

commit;提交,提交事务的所有操作,将事务中所有对数据库的更新写回到磁盘上的物理数据库中,正常结束

rollback;回滚,将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态,异常结束

ACID 特性

原子性 A

事务是数据库的逻辑工作单位,事务中包括的诸操作,要么都做,要么都不做

一致性 C

正确性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态

当数据库只包含成功事务提交的结果时,数据库处于一致性状态

隔离性 I

一个事务的执行不能被其他事务干扰

持续性 D

也称永久性

一个事务一旦提交,其对数据库中数据的改变就应该是永久性的

故障

各类故障对数据库的影响由两种可能性,一是数据库本身被破坏,二是数据库没有被破坏,但数据可能不正确,由于事务的运行被非正常终止造成的

恢复的基本原理:冗余,即数据库中任何一部分被损坏或不正确的数据可根据存储在系统别处的冗余数据重建

数据库恢复

定义:把数据库从错误状态恢复到某一已知的正确状态

恢复子系统是数据库管理系统的一个重要组成部分

数据库系统所采用的恢复技术是否行之有效,是衡量系统性能优劣的重要指标

恢复的实现技术

恢复机制涉及的两个关键问题:如何建立冗余数据,如何利用这些冗余数据实施数据库恢复

建立冗余数据最常用的技术:数据转储和登记日志文件

数据转储

地位:数据库恢复采用的基本技术

定义:数据库管理员定期地将整个数据库复制到磁带、磁盘或其他存储介质上保存起来的过程

后备副本 / 后援副本

当数据库遭到破坏后可以将后备副本重新装入,但重装后备副本只能将数据库恢复到转储时的状态,想要恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务

系统在 Ta 时刻停止运行事务,进行数据转储,在 Tb 时刻转储完毕,得到 Tb 时刻的数据库一致的副本

转储状态
  • 静态转储:在系统中无运行事务时进行转储操作,静态转储得到的一定是一个数据一致性的副本 静态转储简单,但转储必须等待正运行的用户事务结束才能进行,新的事务必须等待转储结束才能执行,这会降低数据库的可用性
  • 动态转储:转储期间允许对数据库进行存取或修改 必须把转储期间各事务对数据库的修改活动登记下来,建立日志文件,后援副本加上日志文件就能把数据库恢复到某一时刻的正确状态【后援副本不记录转储期间对数据库进行的存取或修改】
转储方式
  • 海量转储:每次转储全部数据库
  • 增量转储:每次只转储上一次转储后更新过的数据

从恢复角度看,使用海量转储得到的后备副本进行恢复会方便些

若数据库很大,事务处理十分频繁,使用增量转储方式更有效

日志文件

定义:记录事务对数据库的更新操作的文件

格式

不同数据库系统采用的日志文件格式不完全一样,主要有两种格式

以记录为单位的日志文件

日志文件中需要登记的内容:

  • 各个事务的开始标记
  • 各个事务的结束标记
  • 各个事务的所有更新操作

以上均作为日志文件中的一个日志记录

每个日志记录的内容:

  • 事务标识(标明是哪个事务)
  • 操作的类型(插入、删除或修改)
  • 操作对象(记录内部标识)
  • 更新前数据的旧值(对插入操作而言,此项为空值)
  • 更新后数据的新值(对删除操作而言,此项为空值)
以数据块为单位的日志文件

日志记录的内容:

  • 事务标识
  • 被更新的数据库

由于将更新前的整个块和更新后的整个块都放入日志文件中,故操作类型和操作对象等信息不必放入日志记录中

作用
  1. 事务故障恢复和系统恢复必须用日志文件
  2. 在动态转储方式中必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库
  3. 在静态转储方式中也可以建立日志文件,当数据库毁坏后可重新装入后援副本把数据库恢复到转储结束时刻的正确状态,然后利用日志文件把已完成的事务进行重处理,把故障发生时尚未完成的事务进行撤销处理

登记日志文件

为保证数据库是可恢复的,登记日志文件时必须遵循的两条规则:

  • 登记的次序严格按并发事务执行的时间次序
  • 必须先写日志文件,后写数据库

恢复策略

事务故障的恢复

事务故障是指事务在运行至正常终止点前被终止,此时恢复子系统应利用日志文件撤销此事务已对数据库进行的修改

事务故障的恢复由系统自动完成,对用户透明

系统的恢复步骤
  1. 反向扫描日志文件,查找该事务的更新操作
  2. 对事物的更新操作执行逆操作,即将日志记录中”更新前的值“写入数据库 【记录中是插入操作,相当于做删除操作;记录中是删除操作,则做插入操作;记录中是修改操作,则相当于用修改前值代替修改后值】
  3. 继续反向扫描日志文件,查找事务的其他更新操作,并做同样处理
  4. 如此处理下去,直至读到此事务的开始标志,事务故障恢复完成

系统故障的恢复

系统故障造成数据库不一致状态的原因有两个,一是未完成事务对数据库的更新可能已写入数据库,二是已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库,因此恢复操作是要撤销故障发生时未完成的事务,重做已完成的事务

系统故障的恢复是由系统在重新启动时自动完成的,不需要用户干预

系统的恢复步骤
  1. 正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列;同时找出故障发生时尚未完成的事务,将其事务标识记入撤销队列
  2. 对撤销队列中的各个事务进行撤销处理

进行撤销处理的方法是:反向扫描日志文件,对每个撤销事务的更新操作执行逆操作,即将日志记录中”更新前的值“写入数据库

  1. 对重做队列中的各个事务进行重做处理

进行重做处理的方法是:正向扫描日志文件,对每个重做事务重新执行日志文件登记的操作,即将日志记录中”更新后的值“写入数据库

介质故障的恢复

发生介质故障后,磁盘上的物理数据和日志文件被破坏,这是最严重的一种故障,恢复方法是重装数据库,然后重做已完成的事务

介质故障的恢复需要数据库管理员介入,但数据库管理员只需要重装最近转储的数据库副本和有关的各日志文件副本,然后执行系统提供的恢复命令即可,具体的恢复操作仍由数据库管理系统完成

系统的恢复步骤
  1. 装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致性状态
  2. 装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务

具有检查点的恢复技术

检查点记录的内容

  • 建立检查点时刻所有正在执行的事务清单
  • 这些事务最近一个日志记录的地址

动态维护日志文件

动态维护日志文件的方法是,周期性地执行建立检查点、保存数据库状态的操作

具体步骤
  1. 将当前日志缓冲区中的所有日志记录写入磁盘的日志文件上
  2. 在日志文件中写入一个检查点记录
  3. 将当前数据缓冲区的所有数据记录写入磁盘的数据库中
  4. 把检查点记录在日志文件中的地址写入一个重新开始文件

恢复子系统可以定期或不定期地建立检查点,保存数据库状态。检查点可以按照预定的一个时间间隔建立,也可以按照某种规则建立检查点

使用检查点方法可以改善恢复效率

系统使用检查点方法进行恢复

具体步骤
  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
  2. 由该检查点记录得到检查点建立时刻所有正在执行的事务清单 active-list

这里建立两个事务队列:

    1. undo-list:需要执行 undo 操作的事务集合
    2. redo-list:需要执行 redo 操作的事务集合

把 active-list 暂时放入 undo-list 队列,redo 队列暂为空

  1. 从检查点开始正向扫描日志文件
    1. 如有新开始的事务 Ti ,把 Ti 暂时放入 undo-list 队列
    2. 如有提交的事务 Tj,把 Tj 从 undo-list 队列移到 redo-list 队列,直到日志文件结束
  1. 对 undo-list 中的每个事务执行 undo 操作,对 redo-list 中的每个事务执行 redo 操作

数据库镜像

许多数据库管理系统提供数据库镜像功能用于数据库恢复

数据库镜像通过复制数据实现,频繁地复制数据会降低系统运行效率

在实际应用中用户只选择对关键数据和日志文件进行镜像,而不是对整个数据库进行镜像

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

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

相关文章

[pytorch]设备选择以及卷积神经网络的应用

0.写在前面: 首先这篇文章还没写完,因为今天要尝试对我之前的一个框架做一个简单的更新迭代,所以目前先更新这么多. 1.关于设备的选择 首先,目前的大多数电脑都是自带一些GPU(图形计算单元,在这里被称之为cuda), 需要安装相关的驱动才能正常使用这些设备和调用他们的具体情况…

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用

Docker是一种基于容器的虚拟化技术,它允许开发者将应用程序及其依赖项打包到一个轻量级容器中,然后在任何可用的开发、测试和生产环境中进行部署和运行。 下面是Docker的基本概念和优势: 容器:Docker容器是一种独立运行的软件包&a…

C#中.NET 6.0控制台应用通过EF访问已建数据库

目录 一、新建.NET 6.0控制台应用并建立数据库连接 二、下载并安装EF程序包 三、自动生成EF模型和上下文 1.Blog类模型 2.Post类模型 3.数据库上下文 四、设计自己的应用 VS2022的.NET6.0、.NET7.0框架下默认支持EF7(版本号7.0.13),除…

基于XML的声明式事务

场景模拟 参考基于注解的声明式事务 修改Spring的配置文件 将Spring配置文件中去掉tx:annotation-driven标签&#xff0c;并添加配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org…

Labview实现wav音乐播放

准备音频文件&#xff1a;将要播放的声音文件准备好&#xff0c;是.wav格式。 图形化如下&#xff1a; 内部逻辑如下&#xff1a;

如何在thingsboard的规则链中对一个遥测属性进行求平均值

背景 有这样一个需求,一个温度传感器每5秒,上传一次数据。要求算出该设备2分钟内的平均温度,如果超过某个值,则发送告警邮件。 具体操作实现 下面在规则链中实现求平均值。 使用的节点是 配置如下 必填 Timeseries keys,是要求的平均值的属性名。 我这里求的是四个…

VB.NET三层之用户查询窗体

目录 前言: 过程: UI层代码展示: BLL层代码展示: DAL层代码展示: 查询用户效果图:​ 总结: 前言: 想要对用户进行查询&#xff0c;需要用到控件DataGrideView&#xff0c;通过代码的形式将数据库表中的数据显示在DataGrideview控件中&#xff0c;不用对DatGridView控件…

jenkins分步式构建环境(agent)

rootjenkins:~# netstat -antp|grep 50000 tcp6 0 0 :::50000 ::&#x1f617; LISTEN 5139/java 1.52 安装Jenkins rootubuntu20:~# dpkg -i jenkins_2.414.3_all.deb 配置各种类型的Agent的关键之处在于启动Agent的方式 ◼ JNLP Agent对应着“通过Java Web启动代理”这种方…

Pass基础-DevOps

&#xff0c;DevOps是Dev&#xff08;开发&#xff09;和Ops&#xff08;运维/运营&#xff09;的结合&#xff0c;它将人、流程、工具、工程实践等等结合起来应用到IT价值流的实现过程中&#xff0c;是一系列原则、方法、流程、实践、工具的综合体。DevOps面向应用的全生命周期…

js编辑只取修改后的对象的属性和值

需求&#xff1a;在el-table的列表编辑操作后&#xff0c; 第一步&#xff1a;获取当前行数据&#xff0c;为对象&#xff1a;{}&#xff0c; 第二步&#xff1a;数据回填 第三步&#xff1a;编辑 第四步&#xff1a;请求后端接口 本文章操作就是在编辑完成后&#xff0c;只取编…

深度学习 YOLO 实现车牌识别算法 计算机竞赛

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

springboot整合SSE技术开发经验总结及心得

springboot整合SSE技术开发经验总结及心得 一、开发背景二、快速了解SSE1、概念2、特性 三、开发思路四、代码演示1、引入依赖2、服务端代码3、后端定时任务代码 4、解决乱码的实体类4、前端代码 五、核心代码分析 一、开发背景 公司需要开发一个大屏界面&#xff0c;大屏页面…

027 - STM32学习笔记 - ADC初识(一)

026- STM32学习笔记 - ADC初识&#xff08;一&#xff09; 前几天不小心把板子掉地上了&#xff0c;液晶屏摔坏了&#xff0c;暂时先停一下液晶屏的学习&#xff0c;等新的板子来了再继续学习。 一、ADC介绍 ADC指的是Analog to Digital Converter&#xff08;模数转换器&…

【机器学习基础】机器学习入门(2)

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a;机器学习 欢迎订阅&#xff01;后面的内容会越来越有意思~ &#x1f4a1;往期推荐&#xff1a;【机器学习基础】机器学习入门&#xff08;1&#xff09; &#x1f4a1;…

VB.net TCP服务端监听端口接收客户端RFID网络读卡器上传的读卡数据

本 示例使用设备介绍&#xff1a;WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) Imports System.Threading Imports System.Net Imports System.Net.Sockets Public Class Form1Dim ListenSocket As SocketDim Dict As New Dictionary(Of…

【汇编】汇编语言的介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、汇编是什么&#xff1f;二、为什么要学习汇编语言&#xff1f;三、学习汇编语言的好处四、安装汇编环境4.1 下载虚拟环境4.2 配置虚拟环境 总结 前言 计算…

使用百度语音识别技术实现文字转语音的Java应用

探讨如何使用百度语音识别技术将文字转换为语音的Java应用。百度语音识别技术是一种强大的语音识别服务&#xff0c;可以将输入的文字转换为自然流畅的语音输出。我们将使用Java编程语言来实现这个应用&#xff0c;并提供相应的源代码。 首先&#xff0c;我们需要准备一些前提…

Cesium深入浅出之自定义材质

引子 做为一名技术宅却没有能拿得出手的技术无疑是最可悲的事情。三年前&#xff0c;当我第一次接触Cesium的时候就被它强大和炫丽所折服&#xff0c;最关键的是它还是开源的。以前我一直是机械地敲着业务代码&#xff0c;好像计算机程序就只能干这点事情一样&#xff0c;而 C…

Qt文档阅读笔记-Fetch More Example解析

Fetch More Example这个例子说明了如何在视图模型上添加记录。 这个例子由一个对话框组成&#xff0c;在Directory的输入框中&#xff0c;可输入路径信息。应用程序会载入路径信息的文件信息等。不需要按回车键就能搜索。 当有大量数据时&#xff0c;需要对视图模型进行批量增…