【数据库】数据库中的备份与恢复,保障容灾时的数据一致性与完整性

数据库的备份机制

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 数据库的备份机制
  • 前言
  • 概述
  • 备份的机制
    • 备份的类型
    • 备份流程
      • 静止转储
      • 非静止转储
  • 恢复的机制
    • 全量数据恢复
    • 增量数据恢复
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

现代数据库都管理者非常多的数据,数据库作为一个核心节点,需要考虑到各种故障的发生,数据库日志可以防止系统级的故障,但是对于介质级的故障却无能为力,这就需要在一个相对安全的距离上对数据进行备份。

本文就来分享一下数据库中关于备份的相关机制和面临的问题。

备份的机制

针对介质故障,一个或多个磁盘损坏时的故障应对。日志可以应对,系统故障的发生,当系统缓存中的脏数据丢失,而持久化到磁盘上的数据并不会丢失,此时使用日志进行回退撤销和重做,达到数据完整和一致性。

当磁盘损坏或者整个机房停电时,日志也是无法访问到的,此时就需要在一个安全距离的另一个地方对数据库进行备份,那么如何备份,备份所有数据,还是只备份日志就可以呢?

备份的类型

关于上面的几个问题,就涉及到我们的备份类型,一般会有以下几种备份类型:

  • 全量备份,也就是将数据库所有文件打包,然后备份到另外一个地方,包括数据,数据库运行产生的数据,以及日志数据等。
  • 增量备份,只备份与前一次备份的变化的数据,所有它需要基于一个全量备份才可以;如何找到与前一次的差异部分呢?通过数据文件是很难区分的,一般是备份增加的日志,这样日志中记录的就是增量部分。
  • 差异备份,这是延伸出来的一种备份类型,它指与第一次备份之后,产生的差异都进行备份;每次差异备份,都会与第一次备份进行比较,对变化的数据进行备份;

下面我们重点介绍前两种备份类型,对于差异备份,可以通过前两种来实现,也可以通过对数据标记的或者比较的方法来实现,理论上只是前两种的延伸,并没有改变备份的目的。

备份流程

在备份时,为了能够备份得到正确的数据,又可以分为在静止状态下备份和在运行时备份两种备份方式。

静止转储

静止状态,也就是数据库服务要停止,没有数据的访问产生。假设如果有数据的访问产生,会发生什么情况呢?

当我们在备份时,也就是拷贝数据文件时,该文件正在被写入,就会出现几种情况:

  • 我们拷的文件中,一个数据块被写了一部分,没有写全;
  • 我们拷的文件中,含有事务没有结束的数据;该事务可能提交,也可能中止,或者回退;

当然,在全量备份时为了避免上述问题,可以采用静止状态下的转储;

而对于增量备份,只是对于日志的备份,为了及时性,可以在日志落盘时同步进行复制,此时并不需要数据库业务停止,但是只有备份完此条日志了,才可以进行一下步。

非静止转储

对于静止状态的全量备份,在某此时候是非常不容易实现的,当业务运行时需要一个全量备份,又不能停止业务时,又如何办呢?
这就需要增加一些机制来解决上面提到的两个问题:

  • 对于数据块写不全的问题,在检查点之后,脏页写redo日志时会记录一次全量数据,这样即使数据文件中不正确时,可以通过redo日志来恢复;
  • 对于数据文件中的数据可能包括未结束事务的数据;在全量备份开始时,就要记录一个检查点,也可以称为数据库的快照,在拷贝过程中数据虽然可以发生变化,但在还可以通过日志恢复到数据库快照的时刻,达到数据的一致性;所以在数据备份完后,需要再备份全量的日志;

全量备份完成后,就要定期对增量产生的日志进行转储,或者实时流式的对产生的日志进行转储,这里需要注意,全量备份和增量备份之间的日志不能有丢失,要保持连续性,不然会有数据丢失。

恢复的机制

当故障发生时,就需要启用远程备份数据了,对于不同类型的备份数据,恢复的方法并不一样。

全量数据恢复

在启用备份数据时,肯定先要启用最近的一次全量备份的数据。

  • 全量数据启用时,先启动备份数据库服务,此时数据的一致性并不确定;
  • 需要通过备份时记录的快照和日志,对于检查点之后的日志进行redo操作,这样就可以数据的一致性;

当然这里单纯undo日志并不适合,需要redo日志或者redo/undo混合日志。

增量数据恢复

全量数据并不一定是最新数据,还需要在此基础上恢复后续的增量备份;

增量备份需要进行连续的进行redo日志恢复,从最早到最近一次,依次进行,最后数据达到最近一次备份时的数据状态。

当然增量备份与运行库之间的时间差越小,故障时数据丢失的越少。

总结

数据库管理的数据越来越多,而且越来越重要,对于数据库的故障和容灾保护机制也越来越复杂,甚至超越了数据库本身。

有菜也有肉的分享,下面插一段hello world的代码;

section .data  message db 'Hello, World!',0xa ; 定义字符串常量,0xa表示换行符  section .text  global _start  _start:  ; 输出Hello World字符串  mov eax, 4 ; 系统调用号,4表示输出字符串  mov ebx, 1 ; 文件描述符,1表示标准输出  mov ecx, message ; 字符串地址  mov edx, 13 ; 字符串长度  int 0x80 ; 发起系统调用  ; 退出程序  mov eax, 1 ; 系统调用号,1表示退出程序  xor ebx, ebx ; 返回值,0表示程序正常退出  int 0x80 ; 发起系统调用

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

oracle数据库常见巡检脚本-系列一

简介 作为数据库管理员(DBA),定期进行数据库的日常巡检是非常重要的。以下是一些原因: 保证系统的稳定性:通过定期巡检,DBA可以发现并及时解决可能导致系统不稳定的问题,如性能瓶颈、资源利用率…

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

机器学习第12天:聚类

文章目录 机器学习专栏 无监督学习介绍 聚类 K-Means 使用方法 实例演示 代码解析 绘制决策边界 本章总结 机器学习专栏 机器学习_Nowl的博客-CSDN博客 无监督学习介绍 某位著名计算机科学家有句话:“如果智能是蛋糕,无监督学习将是蛋糕本体&a…

vue3-组合式API

​🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-组合式API 目录 组合式API 1.1 什么是组合式API 1.2 为什么使用它 1.2.1 更好的逻辑复用#…

“云浮云福保”暖心回归! 保障升级价格不变,医保个账可为全家缴费!

11月22日,2024年“云浮云福保”项目启动会在广东省云浮市迎宾馆成功举办。记者在会上获悉,“云浮云福保”是在云浮市医疗保障局、云浮市金融工作局、国家金融监督管理总局云浮监管分局指导下,的指导下,由中国人民财产保险股份有限…

高斯Filter 和 Bilateral Filter

参考链接: Python | Bilateral Filtering - GeeksforGeeks 高斯Filter: 高斯模糊后的图像中的每个像素的强度是由它周围的像素的加权平均得到的,这个权重就是高斯函数的值,它取决于像素之间的距离。具体来说: 通常会导…

PostMan接口测试教程

1、下载和安装 Postman: 前往 Postman 官网 (https://www.postman.com),下载适用于你的操作系统的 Postman 客户端。 执行下载后的安装程序,并按照安装向导的指引完成安装过程。 2、创建一个新的集合: 打开 Postma…

引爆关注,聚焦上海新闻媒体邀请

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 上海拥有众多的新闻媒体机构,包括报纸、电视、广播和网络媒体等。这些媒体在报道国内外新闻、传播信息等方面发挥着重要作用。 其中,上海电视台是上海最大的电视…

邦永PM2项目管理系统 SQL注入漏洞复现

0x01 产品简介 邦永PM2项目管理系统科学地将项目管理思想和方法和谐、统一,使得长期以来困扰项目管理工作者的工期、进度、投资和成本情况无法整体动态管理的问题得到了全面而彻底的解决。 0x02 漏洞概述 邦永科技PM2项目管理平台Global_UserLogin.aspx接口处未对用…

解决ESP32内部RAM内存不足的问题

一,为什么需要外部RAM ESP32有520kB的内部RAM空间可以使用,这对于一般的情况是够用的,但是如果设备需要涉及音频或者显示图像等处理时,需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM,其实乐鑫已经在其ESP32…

接口自动化中cookies的处理技术

一,理论知识 为什么有cookie和session? 因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性 …

G1垃圾收集器

G1收集器(-XX:UseG1GC) 前置文章:JVM垃圾收集器 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。 G1将Java堆划分为多个大小相等…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路: class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值,除数是1,返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

口碑好的猫罐头有哪些?宠物店受欢迎的5款猫罐头推荐!

快到双十二啦!铲屎官们是时候给家里猫主子囤猫罐头了。许多铲屎官看大促的各种品牌宣传,看到眼花缭乱,不知道选哪些猫罐头好,胡乱选又怕踩坑。 口碑好的猫罐头有哪些?作为一个经营宠物店7年的老板,活动期间…

二分查找——经典题目合集

文章目录 🦜69. x 的平方根🌼题目🌻算法原理🌷代码实现 🐳35. 搜索插入位置🌼题目🌻算法原理🌷代码实现 🦭852. 山脉数组的峰顶索引🌼题目🌻算法原…

python-opencv划痕检测-续

python-opencv划痕检测-续 这次划痕检测,是上一次划痕检测的续集。 处理的图像如下: 这次划痕检测,我们经过如下几步: 第一步:读取灰度图像 第二步:进行均值滤波 第三步:进行图像差分 第四步&#xff1…

java创建指定分辨率的图片或修改图片的分辨率(DPI)

因为java默认的图片像素分辨率DPI72,分辨率有点低。所以研究了一下如何创建指定DPI的方案。 DPI: 指的是每英尺的像素点(dots per inch) JPEG图片 JPEG图片的元数据定义参看oracle官网。 https://docs.oracle.com/javase/8/docs/api/javax/imageio/me…

VulnHub DC-9

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

2011-2022年地级市互联网普及率数据

2011-2022年地级市互联网普及率数据 1、时间:2011-2022年 2、指标:行政区划代码、年份、地区、互联网宽带接入用户_千户、常住人口数_千人、户籍人口数_千人、每百人互联网宽带用户_常住人口口径、每百人互联网宽带用户_户籍人口口径 3、来源&#xf…

c语言编程(模考2)

简答题1 从键盘输入10个数&#xff0c;统计非正数的个数&#xff0c;并且计算非正数的和 #include<stdio.h> int main() {int i,n0,sum0;int a[10];printf("请输入10个数&#xff1a;");for(i0;i<10;i){scanf("%d",&a[i]);}for(i0;i<10…