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

数据库的备份机制

专栏内容

  • 手写数据库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
如有错误或者疏漏欢迎指出,互相学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【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;}//除数是-…

2023年亚太杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法?2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法? 粒子群算法(Pa…

阿里云跨账号建立局域网

最近有活动,和好友一并薅了下阿里云的羊毛。琢磨着两台机器组一个局域网,于是有了这个需求,把步骤记录一下: 假设两台机器叫A和B,我们开始进行建立和组网 1. 建立ECS 把A机器公共环境装好,然后使用《实例与…

ROSNS3(一)

https://github.com/malintha/rosns3 第一步:clone和构建rosns3客户端 第二步:运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法: 将副将将碰到的bug,解决方法_#include &…

【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

csdn最新最全pytest系列——pluggy插件源码解读(一)HookspecMarker类和HookimplMarker类分析

简介 pluggy是一个非常优秀的插件系统,它是理解pytest的核心,只有理解了pluggy的原理,才能更好的理解和使用pytest,否则见到了pytest的很多应用都会感觉很难理解 pluggy插件总共的代码量不足一千行,而实现的功能却是…

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法,求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径(即列出从根节点到该叶子节点的节点序列),若这样…

解决 VSCode 配置远程连接,过程试图写入的管道不存在

解决 VSCode 配置远程连接,过程试图写入的管道不存在

【数据结构】链表中二级指针的应用

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 📌形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 🎏传值…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了,是一款现在非常主流的自动化测试工具,包括了web、api、APP,甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件,swagger是一个规范和完整的框架&a…

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint) ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定…

PostMan接口测试教程

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

LangChain库简介

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

那仰望的人

心底的孤独和叹息

PC访问华为昇腾开发板的摸索过程

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近要折腾华为昇腾开发板(官方名称叫:Atlas 200I DK)。先是按照官方教程折腾:Atlas200DK环境部署。我发现…

数组扩展方法(一)

Array.prototype.forEach MDN解释forEach()方法是对数组的每个元素执行一个给定的函数,换句话来说就是在调用forEach()方法的时候,需要传入一个回调函数callback,循环每个数组内部元素时都会执行一次传入的回调函数callback forEach()方法的…

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具,selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象: 解决方法 打开浏览器进入 internet 选项 切换到安全页签 ,去除“应用保护模式” 再次调用验证…

苍穹外卖项目笔记(4)——菜品管理

菜品管理 主要功能模块:新建菜品、修改菜品、启用禁用菜品、菜品的分页查询、删除菜品 代码:GitHub - Echo0701/take-out 1 公共字段自动填充 公共字段指的是业务表中有一些相同的字段,比如创建人、创建时间、修改人、修改时间等&#xff…

QT搭建的Ros/librviz的GUI软件

1.前言 开发初期学习了下面博主的文章,也报了他在古月局的课,相当于感谢吧。 ROS Qt5 librviz人机交互界面开发一(配置QT环境)-CSDN博客​​​​​​​r 软件前期也是参考他的开源项目 GitHub - chengyangkj/Ros_Qt5_Gui_App …

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 🎉如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…