【从零开始学习计算机科学】数据库系统(八)数据库的备份和恢复

server/2025/3/18 3:16:34/

【从零开始学习计算机科学】数据库系统(八)数据库备份和恢复

  • 备份和恢复
    • 事务故障
    • 系统故障
    • 磁盘故障
    • 其他故障
    • 故障的恢复
    • 日志
    • 事务故障的恢复
    • 系统故障的恢复
      • 系统故障的恢复步骤
    • 检查点
      • 检查点的执行过程
    • 备份
    • 日志文件备份
    • 远程备份
    • 恢复策略
      • 事务故障恢复策略
      • 系统崩溃恢复策略
      • 磁盘故障恢复策略
    • 数据库恢复小结

备份和恢复

系统可能发生的故障有很多种,每种故障需要不同的处理方法。数据库系统主要会发生以下几种故障。

事务故障

有两种错误可能造成事务执行失败:

  1. 逻辑错误:事务由于某些内部条件而无法继续正常执行,这样的内部条件如非法输入、找不到数据、溢出或超出资源限制。
  2. 系统错误:系统进入一种不良状态(如死锁),结果事务无法继续正常执行,但该事务可以在以后的某个时间重新执行。

系统故障

硬件故障,或者是数据库系统或操作系统的漏洞,导致易失性存储器内容的丢失,并使得事务处理停止,而非易失性存储器仍完好无损。
硬件错误和软件漏洞导致系统终止,而不破坏非易失性存储器内容的假设称为故障-停止假设。设计良好的系统在硬件和软件层有大量的内部检查,一旦错误发生就会将系统停止。因此,故障-停止假设是合理的。

磁盘故障

在数据传送操作过程中由于磁头损坏或故障造成磁盘块上的内容丢失。其他磁盘上的数据拷贝,或三级介质(如DVD或磁带)上的归档备份可用于从这种故障中恢复。

其他故障

天灾(地震或火灾等自然灾害),人祸(人为破坏机房或数据),间谍或黑客攻击,等。

故障的恢复

稳定存储器或者近似稳定存储器在恢复算法中起着至关重要的作用。
稳定存储器通常是用非易失性存储介质来近似实现,在多个非易失性存储介质上以独立的故障模式复制所需信息,并且以受控的方式更新信息,以保证数据传送过程中发生的故障不会破坏所需信息。

系统如何从故障中恢复?首先需要确定用于存储数据的设备的故障方式;其次,考虑这些故障方式对数据库内容的影响;最后提出在故障发生后仍保证数据库一致性以及事务原子性的恢复算法。
如果想要恢复到故障发生前的状态,就必须知道当时的状态。那么如何实现呢?答案是引入日志记录数据库中所有修改。因为存储器是计算和保存的基础,计算过程中数据仅临时使用,而最终结果数据将永远保存。

日志

常用日志记录格式:

  • 更新日志记录:<Ti,Xj,V1,V2>,描述一次数据库写操作。包含事务标识、数据项标识、旧值和新值等字段。
  • 事务开始日志记录:<Ti start>,表明事务Ti开始执行。
  • 事务提交日志记录:<Ti commit>,表明事务Ti提交。事务提交日志记录是一个事务最后的一个日志记录,当一个事务的提交日志记录输出到稳定存储器后,意味着该事务提交,也就是所有更早的日志记录都已经输出到稳定存储器中。因此,在日志中就有足够的信息来保证,即使系统崩溃,事务所做的更新也可以重做。
  • 事务中止日志记录:<Ti abort>,表明事务Ti中止。

登记日志的原则

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

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

其中,写日志文件操作是把表示这个修改的日志记录写到日志文件;写数据库操作是把对数据的修改写到数据库中。

在故障恢复机制中,采用日志记录数据库更新,日志记录在创建时都输出到稳定存储器。 通常向稳定存储器的输出是以块为单位进行的,而大多数情况下,一个日志记录比一个块要小得多,每个日志记录的输出就转化成在物理上大得多的输出&#


http://www.ppmy.cn/server/175844.html

相关文章

06kafka及异步通知文章上下架

1)自媒体文章上下架 需求分析 之前只是自媒体文章上下架&#xff0c;但是我要通知给文章 用feign会产生系统的耦合&#xff0c;用mq最好 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性m…

Qt 初识1.1

目录 QLineEdit QPushButton connet&#xff1a; Qt命名规范 Qt窗口坐标系 QLineEdit ​ ​ QPushButton ​ 给按钮的点击操作上关联一个处理函数。 connet&#xff1a; connet的作用是连接信号和槽&#xff0c;是QObject类中的一个静态函数&#xff0c; ​ Qt命…

Google Cloud Run 如何实现无服务器(Serverless)部署?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是黑客常用的一种手段&#xff0c;通过大量恶意流量冲击服务器&#xff0c;导致网站无法访问。针对这种威胁&#xff0c;Cloudflare提供了一整套防护措施&#xff0c;包括流量过滤、速率限制、防火墙规则等&#xff0c;使网站能…

go中实现子模块调用main包中函数的方法

你提到的“import cycle not allowed”错误是 Go 语言中一个常见的问题&#xff0c;表示在包的导入中存在循环依赖。在 Go 中&#xff0c;一个包不能直接或间接导入自己&#xff0c;否则就会报这个错误。 在你提到的第二个例子中&#xff0c;main 包和 submodule 包相互导入&a…

Django中migrations是什么,是否可以删除?

【1】是什么 在 Django 中&#xff0c;migrations 是 Django ORM&#xff08;对象关系映射&#xff09;用来同步数据库模式与 Django 模型定义之间差异的机制。简单来说&#xff0c;当你对 Django 应用中的模型&#xff08;models&#xff09;进行修改时&#xff0c;比如添加字…

【设计模式】】工厂模式

三、工厂模式 3.1 工厂模式 创建一个类对象的传统方式是使用关键字new, 因为用new 创建的类对象是一个堆对象&#xff0c;可以实现多态。工厂模式通过把创建对象的代码包装起来&#xff0c;实现创建对象的代码与具体 的业务逻辑代码相隔离的目的(将对象的创建和使用进行解耦)…

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目&#xff0c;搞点日志5.进入kibana控…

JAVA图形绘制

坐标系 关于坐标类的问题&#xff0c;由于上上个问题未明确指出具体是关于哪种编程语言或应用领域的坐标类&#xff0c;这里我将以Java语言中的图形绘制坐标系统为例进行详细解答。 一、Java图形绘制坐标系统概述 在Java的图形绘制中&#xff0c;坐标系统是一个核心概念。它确…