相关推荐recommended
【数据库】数据库可恢复性目标的实现模型,针对灾难级故障的数据完整性保护对策
作者:mmseoamin日期:2023-12-14

系统故障的对策

​专栏内容:

  • 手写数据库toadb

    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。

    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

​开源贡献:

  • toadb开源库

    个人主页:我的主页

    管理社区:开源数据库

    座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

    文章目录

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

前言

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

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

概述

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

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

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

    故障的类型

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

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

      可恢复操作的模型

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

      可恢复操作的模型一般采用几个数据冗余技术,最基本的是磁盘采用带有RAID冗余配置,达到介质级故障时,通过磁盘本身冗余备份达到恢复;

      另外数据库本身,会使用日志和备份达到数据冗余,同时又能兼顾性能。

      日志

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

      恢复

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

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

      备份

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

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

      总结

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

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

      #include 
      #include 
      // 抽象中介者接口
      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

      如有错误或者疏漏欢迎指出,互相学习。