一 前言
DM7 数据库中的数据存储在数据库的物理数据文件中,数据文件按照页、簇和段的方式进行管理,数据页是最小的数据存储单元。任何一个对 DM7 数据库的操作,归根结底都是对某个数据文件页的读写操作。
因此,DM7 备份的本质就是从数据库文件中拷贝有效的数据页保存到备份集中,这里的有效数据页包括数据文件的描述页和被分配使用的数据页。而在备份的过程中,如果数据库系统还在继续运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此,为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。
还原与恢复是备份的反过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程。恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM7 数据库服务器自动进行回滚。
备份、还原与恢复的关系如图所示。
二 备份与恢复基本概念
2.1 表空间与数据文件
DM7 数据库的表空间是一个逻辑概念,其目的主要是为了方便数据库的管理,数据库的所有对象在逻辑上都存放在某个表空间中,而物理上都存储在所属表空间的数据文件中。一个表空间由一个或多个数据文件组成。
数据文件是数据库中最重要的文件类型,是真实数据存储的地方。DM7 中数据文件的扩展名为.dbf,分为系统默认生成的数据文件和用户自己创建的数据文件两类。
在创建 DM7 数据库时,系统会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间、TEMP 表空间和 HMAIN 表空间。DM7 自动为这几个自动创建的表空间分别生成默认的数据文件:SYSTEM.DBF、ROLL.DBF、MAIN.DBF 和 TEMP.DBF,HMAIN 表空间没有默认的数据文件。
用户也可以创建自己的表空间,由用户创建的表空间统称为用户自定义表空间,在创建自定义表空间时需要为表空间指定数据文件。用户可通过为已存在的表空间增加数据文件或创建一个新的表空间来创建数据文件。
因此,DM7 中的表空间有以下几类:
SYSTEM 表空间
存放了 DM7 数据库全局字典信息和全局系统数据,是 DM7 数据库能够正常运行的必要前提,默认对应数据文件 SYSTEM.DBF。CREATE TABLE 等 DDL 操作会修改 SYSTEM 表空间数据。
ROLL 表空间
存放 DM7 数据库运行过程中产生的所有回滚记录。DM7 中几乎所有的数据库修改操作都会生成回滚记录,并保存在 ROLL 表空间的数据文件中。ROLL 表空间是数据库全局对象,不论修改哪一个表空间,生成的回滚记录都是写入 ROLL 表空间,该表空间由系统自动维护,默认数据文件为 ROLL.DBF。
TEMP 表空间
存放临时表数据以及数据库运行过程中产生的临时数据。在数据库运行过程中,SORT、HASH JOIN 等操作都可能会生成临时结果集,它们作为临时数据存放在 TEMP 表空间中。TEMP 表空间是数据库全局对象,由系统自动维护。若数据库重启,保存在 TEMP 表空间中的所有数据都会丢失。TEMP 表空间的默认数据文件为 TEMP.DBF。
MAIN 表空间
在创建用户时,如果没有指定默认表空间,系统自动指定 MAIN 表空间为用户默认的表空间。
HMAIN 表空间
DM7 的 HUGE 表空间,用来存放 HUGE 表数据文件。HMAIN 表空间和 HUGE 表相关知识可参考《DM7 系统管理员手册》。
用户自定义表空间
即用户通过创建表空间相关操作生成的表空间。
下图显示了一个完整的 DM7 数据库的表空间和数据文件分布情况,其中 TSDA 为用户自定义表空间。
注意:
DM7包括的物理备份还原不包括HUGE表空间 , 即 数据库备份和还原不包括HMAIN和用户创建的 HUGE表空间;也对 不支持对 HMAIN 和用户创建的 HUGE表空间进行 表空间 备份和还原。DM7提供了HUGE表备份还原系统函数支持HUGE表的联机备份还原,可参考《DM7_SQL语言使用手册》。
2.2 重做日志
重做日志,又叫 REDO 日志,忠实记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。数据库中 INSERT、DELETE、UPDATE等 DML 操作以及 CREATE TABLE 等 DDL 操作最终都会转化为对某些数据文件、某些数据页的修改。因此,在系统故障重启时,通过重做 REDO 日志,可以将数据库恢复到故障时的状态。
DM7 数据库默认包含两个扩展名为 log 的日志文件,用来保存 REDO 日志,称为联机重做日志文件。这两个文件循环使用。任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的 REDO 日志已经写入到联机日志文件。
2.3 归档日志
DM7数据库可以在归档和非归档两种模式下运行,归档模式的具体配置后面单独介绍。DM7 支持多种归档方式,本文中若无特殊说明,均指本地归档。当数据库处于归档模式下且配置了本地归档时,REDO 日志先写入联机日志文件,然后再异步写入归档日志文件。归档日志文件以配置的归档名称和文件创建时间命名,扩展名也是 log。
系统在归档模式下运行会更安全,当出现介质故障,如磁盘损坏导致数据文件丢失、异常时,利用归档日志,系统可以恢复至故障发生的前一刻。因此,建议将归档目录与数据文件配置、保存到不同的物理磁盘上。
除了表备份还原,其他的联机备份与还原必须运行在归档模式下。
2.4 检查点
DM7 数据库运行过程中,用户的所有操作都在内存中进行。每修改一条记录都必须先把记录所在的数据页加载到 BUFFER 缓冲区中,然后进行修改。事务运行时,会把生成的REDO 日志保留在日志缓冲区 RLOG_BUF 中,每条日志记录对应一个 LSN,当事务提交或日志缓冲区满或执行检查点时会进行日志刷盘。
检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整 CKPT_LSN 值,释放日志空间。
DM7 的检查点分为两种:完全检查点和部分检查点:
完全检查点:会将内存缓冲区中的所有脏页写入磁盘,并调整 CKPT_LSN,在数据库正常关闭时会产生一个完全检查点。
部 分 检 查 点 : 根 据 dm.ini 配 置 文 件 中 的 参 数 CKPT_FLUSH_RATE 和CKPT_FLUSH_PAGES,确定每次检查点刷脏页的数量。执行部分检查点的过程中,DDL/DML操作都可以正常执行,DM7 系统中绝大多数情况下触发的都是部分检查点。
下面介绍 DM7 中几个 LSN 值的意义,这些 LSN 值的定义与备份还原范围的确定有很大关系,能让读者更好地理解 DM7 备份还原。
LSN
LSN(Log Sequence Number)是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性,每一个 LSN 值代表着 DM 系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性。
CUR_LSN
系统当前 LSN,代表已经分配的最大 LSN 值。物理事务提交时,系统会为其分配一个唯一的 LSN 值(CUR_LSN + 1),同时修改 CUR_LSN 值为 CUR_LSN + 1。
FILE_LSN
文件 LSN,已经写入联机重做日志文件的最大 LSN 值。每次将 RLOG_BUF 写入联机重做日志文件后,都会修改 FILE_LSN 值。
FLUSH_LSN
FLUSH_LSN 是已经发起日志刷盘请求,但还没有真正写入联机,Redo 日志文件的最大 LSN 值。
CKPT_LSN
检查点 LSN,所有 LSN <= CKPT_LSN 的物理事务修改的数据页,都已经从 BUFFER缓冲区写入磁盘。因此,数据库故障重启时,CKPT_LSN 之前的 REDO 日志不需要重做,只需要从 CKPT_LSN+1 开始重做 REDO 日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN 值<=CKPT_LSN 的 REDO 日志都可以被覆盖。
根据以上介绍的几个 LSN 值,我们为确定备份范围特别定义了两个 LSN:
START_LSN
为了保证备份的完整性和有效性,必须包含的归档日志起始 LSN 值。START_LSN = 备份开始时 CKPT_LSN + 1。
END_LSN
为了保证备份的完整性和有效性,必须包含归档日志结束 LSN 值。END_LSN = 备份结束时 FILE_LSN。
如果 START_LSN 等于 END_LSN + 1,则表明备份过程中,没有任何数据被修改。在做增量备份时,要求其 START_LSN 必须大于等于基准备份的 END_LSN 值,这个要求可以简化还原过程,避免还原基准备份后必须先进行恢复再还原增量备份。
下图说明了联机日志文件、日志缓冲区 RLOG_BUF 以及相关各 LSN 之间的关系。
在联机日志文件中,可以覆盖写入 REDO 日志的文件长度为可用日志空间;不能被覆盖的 REDO 日志,系统故障重启需要重做的 REDO 日志为有效日志,有效日志的 LSN 取值范围是(CKPT_LSN,FILE_LSN]。
数据库运行过程中产生的待写入日志首先写入日志缓冲区 RLOG_BUF,当日志刷盘时一起写入联机日志文件中。
2.5 备份集
备份集用来存放备份过程中产生的备份数据及备份信息。一个备份集对应了一次完整的备份。一般情况下,一个备份集就是一个目录,备份集包含一个或多个备份片文件,以及一个备份元数据文件。
2.5.1 备份片
备份片用来存储备份数据的文件。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到各自的备份片文件中。备份片文件后缀为.bak,用来存放备份数据,备份集中存放数据页的文件称为数据备份片,存放 REDO 日志的备份片称为日志备份片。
备份片的大小可以在备份时通过 MAXPIECESIZE 指定,一个备份集中可能生成多个备份片。
2.5.2 元数据
元数据文件用来存放备份信息,元数据文件的后缀为.meta。通过元数据文件,可以了解整个备份集信息。元数据文件中包含的备份信息包括:
备份集本身相关的信息,如是否联机备份,备份的范围,备份的加密信息,以及备份的压缩信息等;
备份源库的建库参数信息,如 RAC 的节点数,是否大小写敏感,PAGE_CHECK 属性等;
数据文件信息,如备份了哪些数据文件,文件大小,以及文件相关的表空间信息等;
备份片的信息,如包含哪些备份片文件、备份片大小等信息;
备 份 库 的 dm.ini 参 数 信 息 和 密 钥 文 件 ( dm_service.private 或 者dm_external.config,若指定 usbkey 加密,则不备份)。
2.5.3 备份集搜索目录
备份集搜索目录,用于搜集目标备份集的文件路径。备份集搜索目录包括 4 类:
数据库的默认备份目录;
WITH BACKUPDIR 子句指定的目录;
还原时备份集所在的上级目录;
增量备份时基备份集所在的上级目录。
注:如果使用第三方备份(介质为 TAPE 类型),则只搜索 WITH BACKUPDIR 子句指定的备份集目录,具体搜集方式由第三方备份程序决定。
2.6 备份
备份的目的是当数据库遇到损坏的情况下,可以执行还原恢复操作,把数据库复原到损坏前的某个时间点。用于还原恢复数据库的载体是备份集,生成备份集的过程便是备份了。
备份就是从源库(备份库)中读取有效数据页、归档日志等相关信息,经过加密、压缩等处理后写入备份片,并将相关备份信息写入备份元数据文件的过程。
下面将根据数据组织形式、数据库状态、备份粒度、备份内容、以及备份的一致性和完整性等差异,对备份进行介绍。
2.6.1 逻辑备份和物理备份
逻辑备份是指利用 dexp 导出工具,将指定对象(库级、模式级、表级)的数据导出到文件的备份方式。逻辑备份针对的是数据内容,并不关心这些数据物理存储在什么位置。
物理备份则直接扫描数据库文件,找出那些已经分配、使用的数据页,拷贝并保存到备份集中。物理备份过程中,不关心数据页的具体内容是什么,也不关心数据页属于哪一张表,只是简单的根据数据库文件系统的描述,来挑选有效的数据页。
这两种备份方式,分别适应不同的应用场景,本书重点介绍物理备份,关于逻辑备份更详细的说明,可参考《DM7_dexp 和 dimp 使用手册》。
2.6.2 联机备份和脱机备份
数据库处于运行状态、并正常提供数据库服务情况下进行的备份操作,我们称为联机备份。数据库处于关闭状态时进行的备份操作,被称为脱机备份。
从 V2.0 版本开始,使用 DMRMAN 工具进行脱机备份,并且支持对异常关闭的数据库进
行脱机库备份。备份异常关闭的数据库,要求配置了本地归档,如果本地归档不完整,则需要先修复本地归档,再进行备份。
联机备份则使用客户端工具连接到服务器实例后,通过执行 SQL 语句进行;也可以通过配置作业,定时完成自动备份。联机备份不影响数据库正常提供服务,是最常用的备份手段之一。
联机备份时,可能存在一些处于活动状态的事务正在执行,为确保备份数据的一致性,需要将备份期间产生的 REDO 日志一起备份。因此,只能在配置本地归档、并开启本地归档的数据库上执行联机备份。
注意:
只有 已经 关闭的数据库才允许执行脱机备份。正在运行的数据库,无法执行脱机备份,系统会报错。
2.6.3 数据备份和归档日志备份
按照备份内容不同,可以分为数据备份和归档日志备份。数据备份主要针对数据文件内容,包括库备份、表空间备份和表备份。
库备份,顾名思义就是对整个数据库执行的备份,又称为库级备份。库备份会拷贝数据库中所有数据文件的有效数据页,如果是联机备份,则还会拷贝备份过程中产生的归档日志,写入到备份集中。
表空间备份是针对特定表空间执行的备份,又称为表空间级备份。表空间备份只能在联机状态下执行。
表备份则拷贝指定表的所有数据页到备份集中,并会记录各个数据页之间的逻辑关系用以恢复。表备份只能在联机状态下执行,一次表备份操作只能备份一张用户表,并且不支持增量表备份。
归档日志备份,是专门针对归档日志文件进行操作,不涉及任何数据文件内容。归档日志备份扫描归档目录收集档文件,并将归档日志写入到备份集中。既可以在数据库运行状态下,执行联机归档日志备份;也可以在数据库关闭状态下执行脱机归档日志备份。
2.6.4 一致性备份和非一致性备份
按照备份集中的数据是否满足一致性,可以将备份划分为一致性备份和非一致性备份。
一致性备份的备份集包含了完整的数据文件内容和归档日志信息;利用一个单独的备份集可以将数据库恢复到备份时状态。不指定 WITHOUT LOG 选项的联机备份生成的备份集就是一致性备份。脱机数据库备份会强制将检查点之后的有效 REDO 日志拷贝到备份集中,因此,脱机备份一定是一致性备份。数据库正常关闭时,会生成完全检查点,脱机备份生成的备份集中,不包含任何 REDO 日志。
非一致性备份的备份集只包含数据文件相关内容,没有归档日志信息,利用非一致性备份还原的数据库,无法直接启动,必须借助归档日志来恢复。表空间备份、指定 WITHOUT LOG选项的联机备份生成的备份集都是非一致性备份集。
2.6.5 完全备份和增量备份
按照备份数据完整性,可将备份分为完全备份和增量备份。库备份和表空间备份支持增量备份,表备份不支持增量备份。
完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页。当数据规模比较大的情况下,生成的完全备份集通常会比较大,而且备份时间也会比较长。
增量备份是在某个特定备份集基础上,收集数据库新修改的数据页进行备份,可以有效减少备份集的空间占用、提高备份速度。这个特定的、已经存在的备份集称为增量备份的基备份,根据对基备份的要求不同,DM 的增量备份分为以下两种:
1. 差异增量备份
差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集。
利用增量备份进行还原操作时,要求其基备份必须是完整的;如果差异增量备份的基备份本身也是一个增量备份,那么同样要求其基备份是完整的;任何一个增量备份,最终都是以一个完全备份作为其基备份。因此,完全备份是增量备份的基础。
2. 累积增量备份
累积增量备份的基备份只能是完全备份集,而不能是增量备份集。
增量备份时,并不关心其基备份集是脱机备份生成的,还是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。
2.7 还原与恢复
还原是备份的逆过程,就是从备份集中读取数据页,并将数据页写入到目标数据库对应数据文件相应位置的过程。
由于联机备份时,系统中可能存在一些处于活动状态的事务正在执行,并不能保证备份集中的所有数据页是处于一致性状态;而脱机备份时,数据页不一定是正常关闭的,也不能保证备份集中所有数据页是处于一致性状态。因此,还原结束后目标库有可能处于非一致性状态,不能马上提供数据库服务;必须要进行数据库恢复操作后,才能正常启动。
与备份类似,下面将从数据组织形式、数据库状态、还原粒度、还原内容等方面介绍还原的相关内容。
2.7.1 逻辑还原和物理还原
逻辑还原是逻辑备份的逆过程,逻辑还原就是使用 dimp 工具,把 dexp 导出的备份数据重新导入到目标数据库。
物理还原是物理备份的逆过程,物理还原一般通过 DMRMAN 工具(或者 SQL 语句),把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件。
关于逻辑还原更详细的说明,可参考《DM7_dexp 和 dimp 使用手册》。本文档主要介绍物理备份、还原相关内容。
2.7.2 联机还原和脱机还原
联机还原指数据库处于运行状态时,通过 SQL 语句执行还原操作。表空间还原和表还原可以在联机状态下执行,并且表空间还原要求目标表空间不是 ONLINE 状态。
脱机还原指数据库处于关闭状态时执行的还原操作,脱机还原通过 DMRMAN 工具进行。库备份、表空间备份和归档备份,可以执行脱机还原。脱机还原操作的目标库必须处于关闭状态。
2.7.3 数据还原和归档日志还原
根据备份集类型,数据还原可以分为库还原、表空间还原和表还原。库还原的目标库必须处于关闭状态;表空间还原既可以脱机执行也可以联机执行;表还原操作只能联机执行。
表空间还原的数据来源既可以是表空间备份集,也可以是库备份集。还原的目标表空间不能是 TEMP 表空间,只能是 MAIN、SYSTEM、ROLL 表空间,或者用户定义的表空间。
表还原从表备份集读取数据,重新恢复目标表数据,还会在目标表上重建索引、约束。
归档日志还原则将归档日志备份集中的归档日志内容,重新生成到指定目录中。
2.7.4 完全还原和增量还原
完全还原是指直接利用完全备份集进行数据还原操作。增量还原指通过增量备份集进行数据还原操作。但是考虑到增量备份集的基础一定是一个完全备份集,因此增量还原过程中隐含了一个完全还原操作。如果增量备份集的基备份集被删除了,那么单独使用这个增量备份集是无法进行还原操作的。