技术开发 频道

达梦备份恢复原理

  【IT168 文档】本文对达梦数据库系统的备份恢复的各个方面进行了详细的阐述,包括达梦文件结构、UNDO日志、REDO日志、备份技术和检查点技术。特别的,对基于时间点恢复和并行恢复进行了介绍。

  1.恢复概述

  1.1恢复的必要性

  数据库系统在运行的过程会发生这样或那样的故障。按照故障的严重程度,可以将故障划分为如下三种类型:

  (1)事务故障

  逻辑错误:事务由于某些内部条件而无法继续正常工作,如非法输入、找不到数据、溢出或超出资源限制。

  系统错误:系统进入一种不良状态(如死锁)结果事务无法继续正常执行。

  (2)系统崩溃

  有硬件故障,或者是数据库软件或操作系统的漏洞,导致内存数据丢失。

  (3)磁盘故障

  在数据传送操作过程中由于磁头损坏或故障造成磁盘块上的内容丢失。

  正因为有故障发生,所以要解决恢复的问题。

  1.2 恢复的目标

  (1)数据一致性:将数据库恢复到故障发生前的某个一致性状态。

  一致性状态如何定义?将数据库恢复到某个时刻,这个时刻的事务如果处于提交状态就提交,如果是未提交状态或回滚状态就回滚,通过保证事务的ACID特性来保证数据库的一致性。

  (2)数据可用性:必须将崩溃后数据库不能使用的时间减少到最小。也就是缩短将数据库恢复到某个一致性状态的时间。

  1.3 恢复的技术

  (1)基于日志的恢复技术

  日志是记录数据库修改的结构。提前写日志规则(write-ahead logging, WAL):对数据文件的修改刷入磁盘之前,必须保证相应修改的日志记录已经保存到稳定存储器上。提前写日志的优点:事务提交的时候,只需要提交相应的日志记录到磁盘即可,不需要刷数据页。

  (2)达梦的事务日志

  在达梦数据系统中,有两种日志文件,一个是回滚日志文件(就是rol文件),一个是重做日志文件(就是log文件)。事务进行更新操作,首先写回滚文件,然后写数据文件,这两个操作都对应要写重做日志文件。也就是说对回滚文件和数据文件的修改都必须反映到重做日志文件中。

  回滚文件中记录的是UNDO日志,UNDO日志记录的是数据的前映像,即修改前的值,具有逻辑意义。重做日志文件中记录的是REDO日志,REDO日志记录的是数据的后映像,即修改后的值,因为记录的是物理修改,不具有逻辑意义。

  2.达梦文件结构

  2.1库文件整体结构

  达梦库文件整体结构如图2.1所示

图2.1 达梦文件结构图

  主控制文件:指dm01.ctl和dm02.ctl。主要记录系统初始化信息(页大小,簇大小,是否大小写敏感,是否使用Unicode等)和系统中库的控制文件路径。

  库控制文件:指system01.ctl和system02.ctl。主要记录库的基本信息(库名,归档目录,备份目录等)和文件组信息。

  DBF和ROL文件:采取统一的存储格式,按建库时的页大小,分页存储,页号连续,每个页头上都有一个标识页被修改的LSN。

  LOG文件:采用独立的页大小,一般为512字节,16兆作为一个逻辑上的文件。在写日志的过程中,逻辑文件号不断增大。LSN则根据文件号,页号,页偏移计算得来的,单调递增。

  2.2回滚文件结构

  回滚文件是按回滚段组织的。一个事务在一个库上进行更新操作,则在该库上建立其对应的回滚段。回滚段是用来记录事务逻辑操作的页集合。回滚段中记录回滚记录以及回滚段的状态。结合回滚段的状态和回滚记录就能实现事务回滚,将数据库恢复到事务开始时的状态。

  (1)回滚记录

  回滚记录也就是UNDO日志,记录的是对一行(row)操作的前映像值。回滚记录是明确的逻辑意义的。

  记录的格式如下:

  a)类型:插入、修改或删除

  b)数据库ID

  c)表ID

  d)表的列数

  e)被更新的列ID数组

  f)元组数据:对插入是插入的新值,对修改和删除是旧值

  g)时间戳:供事务用

  事务对数据库的插入、修改和删除,首先生成回滚记录,反映到回滚文件上,然后事务的操作才会反映到数据文件上。

  (2)回滚段的状态

  常见的回滚段状态有:

  a)TRX_NOT_START:事务还未开始

  b)TRX_ACTIVE:活动事务

  c)TRX_COMMITING:正在提交

  d)TRX_ROLLING:正在回滚

  e)TRX_COMMITTED:已提交

  f)TRX_ROLLBACKED:已回滚

  2.3重做日志文件结构

  重做日志文件就是通常所说的日志文件。它主要是记录对数据和回滚文件的物理操作的后映像值,即记录修改后的值。因此重做日志又叫物理日志,日志记录本身无逻辑意义。

  (1)重做日志

  在对数据文件或回滚文件进行修改时,都要产生对应的重做日志记录。重做日志记录格式如表2.1所示。

表2.1 重做日志记录格式

  (2)物理事务

  数据库内部的操作往往会产生多条日志记录,如在一个页中插入一条记录最简单的情形下,要产生一条插入新记录的日志记录,一条在页尾修改记录槽的日志记录和一条修改页头记录总数的日志记录。三条日志记录作为一个整体不可分割。因此在恢复过程,需要确定一条日志记录是否应该重做。

  物理事务的产生就是为了解决物理日志重做的问题。所有的日志记录都在物理事务提交时写入日志缓冲区,并打上PTX_END(物理事务结束)的标识,这些有物理事务一次提交的日志记录作为一个整体不可分割。在恢复时,首先识别PTX_END,只有一个完整物理事务的日志记录序列才能被重做。

  当然物理事务还有其他的功用,这里不作赘述。

  (3)日志归档

  日志归档实际就是对日志文件进行备份。

  数据库要支持7×24小时的运行,日志文件会不断增长。当日志文件回头重新开始写时,新的日志会覆盖老的日志。此时需要进行日志归档,以便系统能还原到系统崩溃的最近时刻。当然如果不进行日志归档也行,但这样降低系统故障的恢复能力。

  2.4备份文件结构

  (1)备份原理

  数据库备份的基本原理是对数据文件或回滚文件中的数据页拷贝到备份文件中。完全备份是将所有使用了的页都拷贝到完全备份文件中来。增量备份则是将上一次备份后修改过的页拷贝到增量备份文件中。

  增量备份时,如何确定哪些页是上次修改过的?这涉及到两个问题。其一、每个数据页上有一个LSN,标识该数据页最后一次修改时的LSN。这个LSN由物理事务提交时设置。其二、备份时,系统做同步检查点,停止所有工作线程,此时产生一个检查点LSN(接下来会做介绍),该LSN会记录在备份文件头上。这样,在增量备份时,取出基备份的LSN,然后只备份那些页LSN大于基备份LSN的数据页即可。

  (2)备份文件结构

  文件头中记录了库控制信息(页大小、簇大小等等)和备份文件的信息。备份文件信息则是记录了备份的数据文件的基本信息,包括数据文件的大小,名称,文件组和在备份文件中的偏移等。控制文件信息就是对用户库的库控制文件的拷贝。数据文件信息就是对数据页的拷贝。

  2.5检查点技术

  检查点是系统恢复时重做的起点,主要目的是缩短恢复的时间。

  (1) 检查点原理

  系统做检查点时,进行如下操作:

  a)将位于主存的所有日志记录输出到稳定存储器上

  b)将所有修改了的缓冲块(数据页)输出到磁盘上

  c)将一个日志记录输出到稳定存储器上。

  达梦中第三步没有专门的日志记录,而是将检查点的LSN写到日志文件头上。检查点LSN在第一步中获得,是当前写到磁盘上日志的最大LSN。

  (2) 检查点类型

  同步检查点:停止系统所有工作线程,然后进行检查点操作。工作线程必须检查点结束后才能继续运行。检查点可能花费比较长的时间,因为其主要操作时刷日志和刷脏页。这样同步检查点对系统吞吐量会有一定的影响。

  异步检查点:检查点时,工作线程可以继续运行。和同步检查点不同的是,检查点线程刷脏页(更新的页)时,需要对脏页上读锁。异步检查点持续时间可能比同步检查点长,但降低了对系统性能的影响。

  备份时使用的是同步检查点,简化了备份恢复逻辑。如果使用异步检查点则使备份恢复逻辑变复杂。

  3.达梦恢复原理

  3.1 恢复技术

  (1)事务故障恢复

  直接利用事务本身的回滚段信息,将数据恢复到原值即可。

  (2)系统崩溃恢复

  数据库系统在重新启动过程中,首先从检查点LSN的日志开始从前往后重做日志,然后扫描回滚段,根据回滚段的状态和回滚日志,从后往前进行回滚,最后数据库达到一致性状态。

  (3)磁盘故障恢复

  首先重新初始化库,然后利用最近的备份文件进行还原,并设置好归档日志文件路径,然后系统启动,从最后还原的备份的LSN的日志开始重做,一直到联机日志(如果联机日志存在的话),剩下过程同系统崩溃恢复,最后数据库达到一致性状态。

  3.2 基于时间点恢复

  用户在数据库操作的过程,可能会出现误操作。如果系统默认为自动提交的话,丢失的数据就无法挽回了。在这种情况下,可以利用备份来恢复,并设置恢复时间点为误操作之前,使得数据库恢复到误操作之前的一致性状态。

  基于时间点恢复原理是在日志记录中添加一中时间类型的日志格式。在事务提交时,修改回滚段的状态时,写时间类型日志。在重做日志时,如果碰到时间类型日志的时间大于恢复时间点,就不再重做,这样使得数据库能恢复到时间点时刻的一致性状态。

  3.3 并行恢复

  并行恢复是指用多个线程来进行重做操作,以缩短重做的时间。

  图3.1是达梦并行恢复的结构图。一个线程来进行日志的读取分发,多个REDO线程来进行日志的重做。这样就充分利用了系统的IO性能,达到了缩短恢复时间的目的。

  并行恢复的关键是日志记录分配算法。首先,日志分配算法要保证属于一个数据页上的日志记录按写日志的先后顺序重做。其次,分配算法要尽可能的利用系统的IO性能。我们采用的是按页号(见表2.1)取余的日志记录分配算法,显然,该算法能保证一个数据页上的日志记录被按序重做,并且在一定程度上利用了系统的IO性能。但在数据文件都分布在不同的磁盘驱动器上时,也许利用文件号取余,更能充分利用系统IO性能。

  还有一个问题就是采用多少个REDO线程,能达到最优效果。这个要根据实际情况来配置,如磁盘驱动器的数目和CPU的数目来综合考虑决定。

  4.总结

  本文介绍了达梦数据备份恢复原理,并就其中的具体问题进行了详细描述。针对文章开始提出的三种故障类型讲述了对应的恢复方法。时间点恢复则是因用户误操作而产生,误操作属于人为故障。现在又有人提出可信恢复,系统对所有事务按某种规则进行分析,然后找出可疑事务,并将其取消。这又涉及到如何确定可疑事务和恢复的一致性该如何定义等复杂问题,有待进一步研究。

1
相关文章