【数据库】数据库可恢复性目标的实现模型,针对灾难级故障的数据完整性保护对策

系统故障的对策

专栏内容

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

开源贡献

  • toadb开源库

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

文章目录

  • 系统故障的对策
  • 前言
  • 概述
  • 故障的类型
  • 可恢复操作的模型
    • 日志
    • 恢复
    • 备份
  • 总结
  • 结尾
irect/407dc6c10d524f2f80cdeddc71f76a18.jpeg#pic_center)

前言

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

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

概述

在数据库管理系统中,我们对于故障的考虑,主要有两大问题 :

  • 当系统故障发生时,数据必须得到保护; 主要由数据的支持可恢复特性,来达到系统发生某些故障时保证数据的完整性。
  • 数据不能仅仅因为几个本身无错的查询和数据库更新操作的同时进行就受到破坏。也就是在数据库并发操作时,数据也要得到保护。

本文主要分享第一个问题的对策,以及可恢复目标下的实现模型。

故障的类型

在介绍故障应对模型之前,我们也来了解一下,我们通常会面对那些故障:

  • 错误数据输入;这类属于错误,数据库系统在这种情况下,已经存在的数据不能被破坏;这一般都过事务并发控制来达到隔离和原子性;
  • 介质故障;像磁盘故障,导致数据的丢失,此类属于暂时的系统故障;
  • 灾难性故障;业界也经常有此类消息,如某个区域停电,或者某个机房整体不能工作;这种灾难性的故障,不能通过简单的恢复解决;
  • 系统故障;数据库系统本身的故障,也可能通过日志恢复,也可能引发灾难性故障;

可恢复操作的模型

如何达到可恢复的目标,是现代数据库管理系统必须要面对和解决的事情。

可恢复操作的模型一般采用几个数据冗余技术,最基本的是磁盘采用带有RAID冗余配置,达到介质级故障时,通过磁盘本身冗余备份达到恢复;
另外数据库本身,会使用日志和备份达到数据冗余,同时又能兼顾性能。

日志

支持可恢复性的基础技术就是日志,分别称为undo, redo和undo/redo日志,这在各类型数据库中普遍存在。

恢复

在故障发生后,使用日志重建对数据库所做更新的过程,我们称为恢复;

日志和恢复技术的一个重要方面是,避免需要追溯到很久以前的日志,为了解决这一问题,在数据库系统中会有一个叫做checkpoint检查点的技术,这一技术也被广泛应用,它限制了恢复时必须检查的日志长度。

备份

要使数据库不仅能够经受得住暂时的系统故障,而且当整个数据库的数据磁盘故障时,也能保护数据的完整性。

那这就需要备份这一技术,通过定期的或实时的备份,将数据转储到远程的备份服务器上,这样在数据库整个故障的情况,我们只要拷贝最近的一个副本,就可以恢复到最近某一时刻的数据。

总结

现在数据库除了存储数据和快速检索外,保护数据的安全已经是它的第二大重要目标,如何在灾难级故障中保持最新的数据,甚至做到业务的不间断服务,成为现在数据库的一大亮点。

下面是一个使用C语言编写,使用中介模式输出"Hello World"的示例代码:

#include <stdio.h>
#include <stdlib.h>// 抽象中介者接口
typedef struct MediatorInterface {void (*notify)(char *message); // 通知方法
} MediatorInterface;// 中介者实现
typedef struct Mediator {MediatorInterface *interface; // 中介者接口
} Mediator;// 具体中介者实现:输出"Hello World"
void notify(char *message) {printf("Hello World\n");
}// 具体中介者实现:注册到中介者
void registerMediator(Mediator *mediator, char *message) {mediator->interface->notify(message);
}// 具体参与者实现:发送消息给中介者
void sendMessage(char *message) {Mediator mediator;mediator.interface = (MediatorInterface *)&mediator; // 中介者接口赋值registerMediator(&mediator, message); // 注册到中介者,并发送消息
}int main() {char message[] = "Hello World"; // 消息内容为"Hello World"sendMessage(message); // 发送消息给中介者,并输出"Hello World"return 0;
}

在上述代码中,我们定义了一个抽象中介者接口MediatorInterface,包含一个notify方法用于通知。然后,我们定义了一个具体中介者实现Mediator,它实现了notify方法并输出"Hello World"。同时,我们定义了一个registerMediator方法用于注册参与者到中介者,并调用notify方法通知消息。最后,我们定义了一个具体参与者实现sendMessage方法,它发送一条消息给中介者,并调用registerMediator方法注册到中介者,从而输出"Hello World"。在main函数中,我们创建了一个消息内容为"Hello World"的字符串,并调用sendMessage方法发送消息给中介者,从而输出"Hello World"。

结尾

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

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

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

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

相关文章

竞赛选题 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

tcpdump使用心得

参考原文 https://danielmiessler.com/p/tcpdump/ 几个用例 tcpdump -i eth0 显示eth0网卡当前所有的抓包情况eth0是网卡名&#xff0c;可以通过ifconfig获得&#xff0c;也可以通过 tcpdump -D 显示当前可以监听的网卡 -i 参数表示接口&#xff0c;后跟要监听的网卡 tcpdu…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现&#xff1a; 前提须知&#xff1a; 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 链式二叉树的构建&#xff1a; 定义结构体&#xff1a; 初始化&#xff1a; 构建左右子树的指针指向&#xff1a; 前序遍历的实现&#xff1a; 中序…

LiveData源码分析,粘性事件,数据倒灌

最近面试天天被虐&#xff0c;有个问题问的很频繁&#xff0c;就是 LiveData 的数据倒灌问题怎么解决。 我不知道有多少人连数据倒灌是什么都没听过的&#xff0c;更不要说什么解决方案啦。 我按照我的理解描述一下数据倒灌&#xff1a;就是设置了 LiveData 的数据之后&#…

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章&#xff0c;本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…

Vue学习笔记-Vuex四个map方法的使用

在组件中导入方法 import {mapState,mapGetters,mapActions,mapMutations} from vuexmapState方法的使用 注意&#xff1a;这里的…是ES6语法&#xff0c;表示将该的对象所有属性展开&#xff0c;放入其所在上级对象中 ...... computed:{//借助mapState生成计算属性&#xf…

处理跨域问题

这里只讨论后端对跨域支持,前端的跨域支持一般都是在测试阶段用用的,跨域还是要后端解决 跨域问题的产生:浏览器的一种安全机制-->同源策略限制 同源策略:URL中包括协议&#xff0c;域名&#xff0c;IP&#xff0c;端口都要完全相同&#xff0c;如果有一项不同&#xff0c;浏…

《荒野大镖客》游戏提示emp.dll丢失怎么搞,总结五个修复教程分享

在玩荒野大镖客这款游戏时&#xff0c;有些玩家可能会遇到找不到emp.dll文件的问题。这个问题通常会导致游戏无法正常运行或出现错误提示。本文将介绍荒野大镖客找不到emp.dll丢失的6种解决方法&#xff0c;并解释emp.dll是什么以及导致其丢失的原因。 什么是emp.dll&#xff…

2021-07-31

单日3亿日志数据准实时存储和分析 –ClickHouse 在自如大前端研发中心的应用 第一章 架构设计 和 用户体系建设 文章目录 单日3亿日志数据准实时存储和分析前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.读入数据 总结 前言 用户行为数据的收集和分析&#xff0c;…

JavaScript 的初步学习下篇

函数 语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) {函数体return 返回值; }函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 注: 函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次. js 中…

怎么样的软件测试工程师才算“大神”?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

acwing算法基础之数学知识--Nim游戏和集合Nim游戏

目录 1 基础知识2 模板3 工程化 1 基础知识 &#xff08;一&#xff09; Nim游戏&#xff1a; n n n堆物品&#xff0c;每堆有 a i a_i ai​个&#xff0c;两个玩家轮流取走任意一堆的任意个物品&#xff0c;但不能不取。取走最后一个物品的人获胜。 结论&#xff1a;如果这n…

Java 多线程之 ReentrantReadWriteLock(读写锁/共享锁/排他锁)

文章目录 一、概述二、使用方法三、测试示例四、完整示例 一、概述 ReentrantReadWriteLock 是Java中提供的一种读写锁实现&#xff0c;它允许多个线程同时读取共享资源&#xff0c;但在写操作时需要独占访问。它是对传统互斥锁的一种改进&#xff0c;可以提高并发性能。 读写…

C#开发的OpenRA游戏之属性SelectionDecorations(13)

C#开发的OpenRA游戏之属性SelectionDecorations(13) 在前面分析SelectionDecorations属性类时,会发现它有下面这个属性: public class SelectionDecorations : SelectionDecorationsBase, IRender { readonly Interactable interactable; 它是定义了一个Interactabl…

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码…

怎么安装php扩展

在Windows环境下安装PHP扩展&#xff1a; 下载扩展&#xff1a; 对于一些常见的扩展&#xff0c;可以在官方的PHP网站上找到预编译的DLL文件。前往PECL或者PHP官网来下载相应版本的DLL文件。 更新php.ini配置文件&#xff1a; 找到PHP的安装目录&#xff0c;并且打开php.ini文…

大杀四方,华为组建智能车大联盟 | 百能云芯

最近&#xff0c;华为和一系列汽车公司合资的新公司迎来新的进展。除了与长安汽车的合作外&#xff0c;据传华为已经邀请奇瑞、赛力斯、北汽以及江淮汽车入股新公司&#xff0c;这将使华为成为中国智能汽车平台的重要主导者。 根据澎湃新闻的报道&#xff0c;知情人透露&#x…

Java EE 多线程

文章目录 1. 认识线程1.1 什么是进程1.2 什么是线程1.2.1. 线程是怎么做到的呢&#xff1f;1.2.2. 进程和线程的关系 1.3 多线程编程1.3.1. 第一个多线程程序1.3.2. 使用 jconsole 命令查看线程1.3.3. 实现 Runnable 接口&#xff0c;重写 run1.3.4. 继承 Thread 重写 run&…

2023-11-29 Linux环境创建命名管道小实验

点击 <C 语言编程核心突破> 快速C语言入门 Linux环境创建命名管道小实验 前言一、mkfifo()函数AI助手提供协作二、代码总结 前言 要解决问题: Linux环境用mkfifo()创建个管道, 但是被阻塞, 发现是管道虽然建立了, 但是没有进程打开它, 以至于阻塞. 想到的思路: 开始时…

悲观锁乐观锁在django中使用

1 悲观锁乐观锁 1.1 并发控制 1.1 悲观锁 1.2 乐观锁 1.3 悲观锁乐观锁使用场景 2 django中开启事务 2.1 全局开启事务 2.2 视图开启事务 2.3 局部使用事务 2.4 savepoint回滚 2.5 事务提交后回调函数 3 django中使用悲观锁 3.1 前置条件&#xff0c;表模型 3.1 模拟秒杀生成…