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

news2024/10/3 0:27:45

数据库的备份机制

专栏内容

  • 手写数据库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.coloradmin.cn/o/1241169.html

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

相关文章

postman定义公共函数这样写,测试组长直呼牛逼!!!

postman定义公共函数 在postman中,如下面的代码: 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}:实际结果: ${actual} , 期望结果:${expected}]actualexpected…

YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:卫星遥感目标检测数据集说明:卫星遥感多类别检测数据集,真实场景的高质量图片数据,数据场景丰富,含网球场、棒球场、篮球场、田径场、储罐、车辆、桥、飞机、船等类别标签说明:使用lableimg标…

Mysql中自增主键是如何工作的

自增主键的特点是当表中每新增一条记录时,主键值会根据自增步长自动叠加,通常会将自增步长设置1,也就是说自增主键值是连续的。那么MySQL自增主键值一定会连续吗?今天这篇文章就来说说这个问题,看看什么情况下自增主键…

灵活运用Vue 3中的setup函数—深入解析Composition API

新建项目,项目主入口为App.vue(主组件),新建child.vue(子组件)。 1.1 setup 执行 时机问题 1.在主组件里引入子组件和ref: import {ref} from vue import child from ./components/child.vue2…

数据科学导论——数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

【20年扬大真题】试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)

【20年扬大真题】 试写一算法在带头结点的单链表结构上实现线性表操作LENGTH&#xff08;L&#xff09;。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #include<malloc.h> //单链表定义 //链表结点 int A[10] { 1,2,3,4,5,6,…

Java生成一个区域内的经纬度随机点的方式

准备&#xff1a; 1、四个角点&#xff08;四个点确定一个框&#xff09; 2、想要细分程度 &#xff08;这里说的是经纬度&#xff0c;这里没有对经纬度做更细的区分&#xff09; 如&#xff1a;0.000001约等于0.1m&#xff0c;0.00001约等于1m&#xff0c;0.0001约等于10m 。。…

小黑子—Maven高级

Maven高级篇 二 小黑子的Maven高级篇学习1. 分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 抽取domain层1.2.2 抽取dao层 2. 依赖管理2.1 依赖传递2.2 可选依赖2.3 排除依赖 3. 继承与聚合3.1 聚合3.2 继承3.3 总结 4. 属性4.1 配置文件加载属性4.2 版本管理 5. 多环境…

浅谈JDK动态代理(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 到目前为止&#xff0c…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

梦开始的地方——Adobe Premiere Pro

今天&#xff0c;我们来说说一款老生常谈的相信也是很多人都经常迫切需要的软件。Adobe Premiere Pro&#xff0c;简称Pr&#xff0c;是由Adobe公司开发的一款视频编辑软件。 Premiere Pro是视频编辑爱好者和专业人士必不可少的视频编辑工具。它可以提升您的创作能力和创作自由…

Element中el-table组件右侧空白隐藏-滚动条

开发情况&#xff1a; 固定table高度时&#xff0c;出现滚动条&#xff0c;我们希望隐藏滚动条&#xff0c;或修改滚动条样式&#xff0c;出现table右边出现15px 的固定留白。 代码示例 <el-table class"controlTable" header-row-class-name"controlHead…

httpd(Web服务器)

名词解释 1、URL&#xff1a;Uniform Resource Locator&#xff0c;统⼀资源定位符 2、⽹址格式&#xff1a;<协议>://<主机或主机名>[:port]/<⽬录资源,路径> 3、主机地址/主机名&#xff1a;主机地址是服务器在因特⽹所在的IP地址。主机名就需要域名解析…

arduino入门一:点亮第一个led

void setup() { pinMode(12, OUTPUT);//12引脚设置为输出模式 } void loop() { digitalWrite(12, HIGH);//设置12引脚为高电平 delay(1000);//延迟1000毫秒&#xff08;1秒&#xff09; digitalWrite(12, LOW);//设置12引脚为低电平 delay(1000); }

【正则插件】前端正则插件以及预览插件推荐

1&#xff09; 2&#xff09; any-rule Pegex Previewer 下载好插件之后 在代码层右键选择 选择你需要的正则表达式&#xff0c;随后可以使用第二个插件 正则表达式插入之后顶部会有 Test Regex.. 点击会出现以下内容 将他 ctrl a 删除&#xff0c;输入你对应的正则表达…

HarmonyOS ArkTS HTTP数据请求(九)

1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种能实时从服务…

Qt全球峰会2023中国站 参会概要

Qt全球峰会2023中国站 参会概要 前言峰会议程签到 & Demo 演示开场致辞Qt Group 产品总监演讲&#xff08;产品开发的趋势-开放的软件、工具和框架&#xff09;产品战略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定义AI个人看法 Qt 在券商数字化转型和信…

fseek 写操作定位无效问题

1、 fseek 代码中明明使用了fseek定位到行首。 fseek(p, 0, SEEK_SET); 但是写的内容&#xff0c;仍然添加到文件尾。 最后发现是fopen时&#xff0c;出现问题。 r 打开只读文件&#xff0c;该文件必须存在。 r 打开可读写的文件&#xff0c;该文件必须存在。 w 打开只写文…

配电房智能综合监控系统

配电房智能综合监控系统是一种针对配电房环境和设备进行实时监控和管理的系统。依托电易云-智慧电力物联网&#xff0c;它集成了多种先进技术&#xff0c;如物联网、大数据、AI视频智能分析等&#xff0c;实现对配电房全方位、智能化的监控和管理。 这个系统的主要功能可能包括…

12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势

随着科技的飞速发展&#xff0c;半导体行业对精密划切设备的需求日益增长。在这篇文章中&#xff0c;我们将深入探讨12英寸双轴半自动划片机的优势&#xff0c;这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…