【数据库】数据库恢复技术

article/2025/8/7 7:48:00

数据库恢复技术

实现恢复的核心是使用冗余,也就是根据冗余数据重建不正确数据。

事务

事务是一个数据库操作序列,是一个不可分割的工作单位,是恢复和并发的基本单位。

在关系数据库中,一个事务是一条或多条SQL语句,也可以包含一个或多个程序。一个程序通常包含多个事务。

可以显式的定义一个事务:

BEGIN TRANSACTION SQL 语句1SQL 语句2……
COMMIT|ROLLBACK

COMMIT是提交事务,ROLLBACK是回滚。

事务具有四个非常重要的特性,即ACID特性:

  • 原子性(Atomicity) 原子性是指,事务要不全部完成,要不全部取消。如果事务失败,会回滚到事务之前。
  • 一致性(Consistency) 一致性是指,只有合法的数据才能写入数据库。
  • 隔离性(Isolation) 隔离性是指,如果两个事务同时执行,那么执行顺序不影响执行结果。
  • 持续性(Durability) 持久性是指,一旦事务提交,数据必须保存在数据库之中。

事务一般有五种状态,其状态图如下:

image-20210429165424587

故障和恢复

常见的故障有四种:事务内部的故障、系统故障、介质故障、计算机病毒。

事务内部的故障有些是通过事务程序本身发现的,有些是非预期的。比如,有一个事务,从A转账给B。有下面的事务程序:

BEGIN TRANSACTIONBALANCE = BALANCE - 100IF (BALANCE < 0) THEN {ROLLBACK} ELSE {读取用户乙的余额BALANCE1BALANCE1 = BALANCE + AMOUNT写回BALANCE1COMMIT}

如果出现了余额不足,就可以回滚,保证数据库状态正常,而不是只减了甲的钱却不影响乙的钱。

有的时候事务故障是非预期的,比如运算溢出、死锁、违反完整性限制。这类故障一般使用撤销事务(UNDO)。

系统故障是造成系统停止运转的任何事件,使得系统要重新启动。这个时候,系统运行被破坏,事务非正常终止,不破坏数据库,缓存区信息丢失。

这种系统故障可能是硬件错误或操作系统故障引起的。如果发生故障的时候事务未提交,那么直接UNDO未完成事务;如果已提交但缓冲区未写入磁盘,那么进行REDO。

介质故障是外存故障,比如磁盘损坏、磁头碰撞、操作系统潜在错误、瞬时强磁场干扰。一般需要装入介质故障前某个时刻的数据副本,重做所有成功事务。

计算机病毒是人为故障或破坏。

数据转储

一、静态转储和动态转储

在没有运行事务的时候,进行的就是静态转储。转储开始前数据库一致,并且期间不能对数据库进行存取和修改。这种方法实现简单,但是降低了数据库的可用性,因为新的事务必须等转储结束。

如果将转出操作和用户事务并发执行,进行的就是动态转储。转储期间可以进行存取修改,这种方法无需等待正在运行的用户事务,也不会影响新事务运行。但是动态转储不能保证副本中数据的正确性。

因此,做动态转储需要把各事务的修改活动记下来,建立日志,用后备副本加上日志使得数据库恢复。

二、海量转储与增量转储

海量转储是每次转储所有数据库,增量转储是只转储上次转储后的数据。

从恢复角度来看,海量转储更方便,但是数据库很大的时候增量转储更有效。

日志

日志是记录事务对数据库更新操作的文件。

一、日志文件的格式和内容

一般来说,日志有记录为单位,也有以数据块为单位。

以记录为单位的日志内容包含:

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

这样的称为一个日志记录。每条日志记录又分成

  • 事务标识(表明事务种类)
  • 操作类型(插入、删除、修改)
  • 操作对象(记录内部标识)
  • 更新前数据的旧值(对插入操作来说是空)
  • 更新后数据的新值(对删除操作来说是空)

以数据块为单位的日志文件,每条日志记录内容是

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

二、日志文件的作用

日志文件可以进行事务故障恢复、系统故障恢复、协助后备副本进行介质故障恢复。

下面是一个用静态转储副本和日志文件进行恢复的例子。

image-20210429172520094

在静态转储的基础上,得到一个一致性副本,然后发生故障。那么重新运行所有事务,就可以把数据库恢复到一致状态。

三、登记日志文件

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

这是因为,如果在二者之间故障发生了,先写数据库,这个记录就无法恢复;如果先写日志,只需要做一次UNDO。

四、故障的恢复

(1)事务故障

恢复事务故障,首先反向扫描文件日志,然后查找事务的更新操作。接下来,对事务更新操作进行逆操作,把更新前的值重新写入。

继续扫描文件日志,查找事务其它操作,直到读到事务开始标记。

(2)系统故障

首先正向扫描日志,然后建立两个队列。第一个叫做REDO队列,第二个叫做UNDO队列。REDO队列存放故障发生前的已经COMMIT的事务,UNDO队列存放尚未发生的队列。

对UNDO队列的事务统一进行UNDO处理,也就是在数据库中储存更新前的值;对REDO队列的事务统一做REDO处理,把更新后的值写入数据库。

(3)介质故障

介质故障一般先重装数据库,然后重做已完成的事务。

一般来说,可以装入最新的后备数据库副本。静态副本可以直接装入,动态副本还需要装入转储时的日志文件副本。

介质故障恢复往往需要DBA的介入,重装最近转储的副本和各日志文件副本,执行系统提供的恢复命令。

检查点

之前的日志恢复技术,搜索日志需要大量时间,同时REDO也大量耗费了时间。因此,具有检查点的恢复技术是常见的技术。

建立检查点一般有两种,可以是按固定时间间隔定期建立,也可以按照某种规则,比如日志文件写满一半建立一个检查点。检查点实际上就是一个标记,事务 T T T在检查点之前提交,那么 T T T已经写入了数据库,无需进行REDO。

image-20210506151433296

T3、T5在故障发生时未完成,所以撤销;T2、T4在检查点之后提交,需要REDO;T1则无需REDO。

用检查点的恢复步骤如下:

  • 找到最后一个检查点记录的地址
  • 由检查点记录得到正在执行的事务ACTIVE-LIST,建立UNDO和REDO LIST,并把ACTIVE LIST放入UNDO LIST
  • 正向扫描日志文件,新开始的事务放入UNDO LIST,提交事务放到REDO LIST
  • UNDO LIST进行UNDO,REDO LIST进行REDO

数据库镜像

DBMS自动把整个数据库或其中关键数据复制到另一个磁盘上,由DBMS保证镜像数据和主数据库的一致性。在出现介质故障的时候,可以由镜像磁盘继续使用,同时DBMS利用磁盘数据进行恢复,而无需重装数据库副本。

image-20210506152148987

同时,在没有出现故障的时候,数据库镜像也可以用于并发操作,如果一个用户对数据加排他锁,其他用户可以读镜像数据库的数据。

频繁的复制数据会降低效率,所以一般只对关键数据和日志进行镜像。


http://www.hkcw.cn/article/JLErHRMPMr.shtml

相关文章

【学习笔记】深度学习-梯度概念

一、定义 梯度向量不仅表示函数变化的速度&#xff0c;还表示函数增长最快的方向 二、【问】为什么说它表示方向&#xff1f; 三、【问】那在深度学习梯度下降的时候&#xff0c;还要判断梯度是正是负来更新参数吗&#xff1f; 假设某个参数是 w&#xff0c;损失函数对它的…

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用 文章目录 前言正文配置环境下载源码配置环境变量测试运行修改点说明实际运行情况 参考 前言 本文用来记录 xCoreSDK-Python的调用使用1。 正文 配置环境 配置开发环境&#xff0c;这里使用conda做python环境管理&…

深入浅出网络分析与故障检测工具

目录 网络故障检测工具&#xff1a;别只靠“Ping 不通” 实战组合拳&#xff1a;分析 检测 问题闭环 四、选择工具的几个建议 五、总结&#xff1a;工具是手段&#xff0c;思维才是核心 在如今这个“数据就是生命线”的时代&#xff0c;网络的稳定性和性能直接决定着企业…

使用Haproxy搭建Web群集

目录 1&#xff0c;Haproxy简介 1&#xff0c;核心功能与特点 二&#xff0c;搭建haproxy群集 1&#xff0c;准备工作 2&#xff0c;修改haproxy的配置文件 3&#xff0c;准备网站 4&#xff0c;配置日志 5&#xff0c;验证 1&#xff0c;Haproxy简介 HAProxy 是一款高…

Elasticsearch的写入流程介绍

Elasticsearch 的写入流程是一个涉及 分布式协调、分片路由、数据同步和副本更新 的复杂过程,其设计目标是确保数据一致性、可靠性和高性能。以下是写入流程的详细解析: 一、写入流程总览 二、详细步骤解析 1. 客户端请求路由 请求入口:客户端(如 Java 客户端、REST API)…

记录一次apisix上cros配置跨域失败的问题

安全要求不允许跨域请求&#xff0c;但是业务侧由于涉及多个域名&#xff0c;并且需要共享cookie&#xff0c;所以需要配置跨域。 在apisix上配置了cors如下。 结果安全漏扫还是识别到了跨域请求的漏洞。 调试了cors.lua的插件脚本&#xff0c;发现apisix上是如果不在allowOri…

VSCode无法转到定义python源码(ctrl加单击不跳转)

已经尝试的方案&#xff1a; 1.确保对应python环境正确激活 在 VSCode 中&#xff0c;打开命令面板&#xff08;CtrlShiftP&#xff09;&#xff0c;输入并选择 Python: Select Interpreter&#xff0c;然后从列表中选择正确的 Python 解释器。 2.重新卸载Python插件再重新安装…

会议室钥匙总丢失?换预约功能的智能门锁更安全

在企业日常运营中&#xff0c;会议室作为重要的沟通与协作场所&#xff0c;其管理效率与安全性直接影响着企业的运作顺畅度。然而&#xff0c;传统会议室管理方式中钥匙丢失、管理不便等问题频发&#xff0c;给企业带来了不少困扰。近期&#xff0c;某企业引入了启辰智慧预约系…

漫画Android:事件分发的过程是怎样的?

当用户触摸屏幕时&#xff0c;硬件层会捕获触摸信号&#xff0c;并将其转化为内核事件。 Android系统会通过InputManagerService和WindowManagerService等服务将这些事件包装成MotionEvent对象&#xff0c;并将其传递给Activity的dispatchTouchEvent()方法中&#xff0c;Activi…

【算法提升】分组 day_tow

1.分组 1.1 解析 个人认为这题最难的点在于如何想到使用二分的算法来解题。 正向求解&#xff1a;就是去看每一组中需要分多少个人&#xff0c;但是这样求解代码我根本写不出来。 所以根据正难则反的思想&#xff0c;我们可以从最终结果去倒推。 枚举最终的分配结果中&#xff…

【笔记】Suna 部署之 Supabase 数据库 schema 暴露操作

#工作记录 一、前置信息 在 Suna 部署过程中&#xff0c;Supabase 数据库设置已完成&#xff08;✅ Supabase database setup completed &#xff09;&#xff0c;但需要手动在 Supabase 平台暴露basejump模式&#xff08;schema&#xff09;。 Suna 部署过程中&#xff0c;S…

【Linux 学习计划】-- 进程状态 | 进程运行、阻塞和挂起的本质 | 并行、并发与进程切换 | 进程优先级

目录 进程状态 五状态进程模型 运行、就绪状态的本质 阻塞状态的本质 挂起状态 并行与并发 进程切换 进程优先级 结语 进程状态 进程状态的本质是什么&#xff1f; 首先我们知道&#xff0c;在操作系统中&#xff0c;进程是需要被管理起来的&#xff0c;具体则是用一…

自证式推理训练:大模型告别第三方打分的新纪元

1. 传统验证体系的困境与技术跃迁的必然性 1.1 传统验证器的局限性 现有强化学习框架依赖显式验证器对答案进行二值化判定&#xff0c;这种模式在数学、代码等可验证领域表现优异。某厂内部数据显示&#xff0c;传统R1-Zero方法在代码生成任务中准确率达92%&#xff0c;但切换…

《操作系统真相还原》——加载器

显存 将上一章的中断输出&#xff0c;变为显存输出 加载器 使用mbr引导程序从磁盘中加载loader程序。 MBR %include "boot.inc" SECTION MBR vstart0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;cl…

Spring Boot 应用中实现配置文件敏感信息加密解密方案

Spring Boot 应用中实现配置文件敏感信息加密解密方案 背景与挑战 &#x1f6a9;一、设计目标 &#x1f3af;二、整体启动流程 &#x1f504;三、方案实现详解 ⚙️3.1 配置解密入口&#xff1a;EnvironmentPostProcessor3.2 通用解密工具类&#xff1a;EncryptionTool 四、快速…

前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。 一、核心功能架构 我们将实现以…

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包&#xff0c;链接在这里&#xff1a;捋捋wireshark 今天打算抓个TCP通讯的包试试&#xff0c;整体来说比较有收获&#xff0c;给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端&#xff0c;问了下deepseek&#xff0c;…

AWS WAF设置IP白名单

目标 设置一个组白名单IP地址&#xff0c;当发现是这些IP地址发过来的请求后&#xff0c;WAF自动放行。 创建IP集 打开WAF页面&#xff0c;开始IP集创建如下图&#xff1a; 设置ip集&#xff0c;如下图&#xff1a; aws waf acl配置白名单 找到Web ACL&#xff0c;开始在…

随笔20250530 C# 整合 IC卡读写技术解析与实现

以下是一个完整、最简化的 FeliCa 读取整合示例&#xff08;无需 SDK&#xff0c;基于 PCSC NuGet 包&#xff09;&#xff0c;你可以直接运行这个控制台程序&#xff0c;验证能否识别 RC-S300 并读取卡片 UID&#xff1a; &#x1f9ea; 示例说明 &#x1f4e6; 使用 NuGet 包…

day024-网络基础-TCP与UDP、DNS

文章目录 1. 李导推荐书籍2. OSI七层模型2.1 传输层2.2 网络层2.2.1 问&#xff1a;两端处于不同局域网的设备怎么网络通信&#xff1f; 2.3 数据链路层2.4 物理层2.5 图解OSI七层模型 3. 数据传输模式3.1 全双工3.2 半双工3.3 单工 4. TCP 3次握手4.1 抓包 5. TCP 4次挥手5.1 …