数据库的备份机制
专栏内容:
- 手写数据库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
如有错误或者疏漏欢迎指出,互相学习。