备份的主要目的是数据容灾,保证数据的安全性,在数据库发生故障时,通过还原备份集,将数据恢复到可用状态
归档日志
中,为了保证用户可以通过备份集将数据恢 复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中ARCH_NAME_DB_MAGIC[SEQNO]_日期时间.log
。其中ARCH_NAME是在dmarch.ini中配置的LOCAL/REMOTE归档名称,DB_MAGIC是生成日志的数据库魔数,SEQNO代表DSC节点号,日期时间是归档日志文件的创建时间。比如:ARCHIVE_LOCAL1_0x567891[0]_2018-05-30_10-35-34.logLSN(Log Sequence Number)是由系统自动维护的Bigint类型数值,具有自动递增、全局唯一特性,每一个LSN值代表着DM系统内部产生的一个物理事务。物理事务(Physical Transaction,简称 PTX)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性
DM主要包括以下几种类型的 LSN:
V$RLOG
和V$RAPPLY_PARALLEL_INFO
表来获取备份片:
存储备份数据的文件备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到各自的备份片文件中。备份片文件后缀为.bak,用来存放备份数据,备份集中存放数据页的备份片称为数据备份片,存放REDO日志的备份片称为日志备份片,备份片的大小可以在备份时通过MAXPIECESIZE指定,一个备份集中可能生成多个备份片
元数据
元数据文件用来存放备份信息,元数据文件的后缀为.meta。通过元数据文件,可以了解整个备份集信息。元数据文件中包含的备份信息包括:
· 备份集本身相关的信息,如是否联机备份,备份的范围,备份的加密信息,以及备份的压缩信息等;
· 备份源库的建库参数信息,如DSC的节点数,是否大小写敏感,PAGE_CHECK属性等;
· 数据文件信息,如备份了哪些数据文件,文件大小,以及文件相关的表空间信息等;
· 备份片的信息,如包含哪些备份片文件、备份片大小等信息;
· 备份库的dm.ini参数信息和密钥文件(dm_service.prikey或者dm_external.config,若指定usbkey加密,则不备份)
备份集搜索目录
用于搜集目标备份集的文件路径,备份集搜索目录包括 4 类:
· 数据库的默认备份目录;
· WITH BACKUPDIR 子句指定的目录;
· 还原时备份集所在的上级目录;
· 增量备份时基备份集所在的上级目录。
如果使用第三方备份(介质为TAPE类型),则只搜索WITH BACKUPDIR子句指定的备份集目录,具体搜集方式由第三方备份程序决定WITH BACKUPDIR子句指定的目录列表,包含非法目录或目录不存在时,不会报错,只在日志中打印警告
逻辑备份和物理备份
联机备份和脱机备份
数据备份和归档日志备份(备份内容不同)
· 数据备份主要针对数据文件内容,包括库备份、表空间备份和表备份。其中未指定
WITHOUT LOG参数执行的库备份和表空间备份还包含了REDO日志备份。
· 归档日志备份是专门针对归档日志文件进行操作,不涉及任何数据文件内容。归档日志
备份扫描归档目录收集归档日志文件,并将归档日志写入到备份集中。既可以在数据库运行
状态下,执行联机归档日志备份;也可以在数据库关闭状态下执行脱机归档日志备份。
归档日志备份范围
联机备份过程中,用户可以正常访问、修改数据库,为了准确记录备份过程中产生了哪些REDO日志,确定日志备份范围,我们特别定义了下述几个包序号和 LSN:
· 节点BEGIN_LSN
为了保证备份的完整性和有效性,必须包含的归档日志起始LSN值。BEGIN_LSN = 备份开始时检查点偏移前一个RLOG_PKG的max_lsn
· 节点BEGIN_SEQ
BEGIN_SEQ记录了BEGIN_LSN所在REDO日志包的序号。
· 节点END_LSN
为了保证备份的完整性和有效性,必须包含归档日志结束 LSN 值。END_LSN = 备份结束时 FILE_LSN。
· 节点END_SEQ
BEGIN_SEQ 记录了 END_LSN 所在 REDO 日志包的序号。
· BAK_END_LSN
备份结束时可以保证事务一致性的全局备份结束LSN。单节点BAK_END_LSN=END_LSN;DSC 集群环境中,每个节点的 END_LSN 都不相同,BAK_END_LSN 大于等于最大的 END_LSN。
如果BEGIN_SEQ等于END_SEQ,则表明备份过程中,该节点没有任何数据被修改。为了简化还原过程,增量备份时要求BEGIN_LSN必须大于等于基准备份的END_LSN,如果不满足条件,则强制生成检查点,直到BEGIN_LSN满足条件为止
一致性备份和非一致性备份(备份集中的数据是否满足一致性)
· 不指定WITHOUT LOG选项的备份生成的备份集就是一致性备份。一致性备份的备份集包含了完整的数据文件内容和 REDO 日志信息;利用一个一致性备份集就可以将数据库恢复到备份时状态。
· 指定WITHOUT LOG选项的备份生成的备份集都是非一致性备份集。非一致性备份的备份集只包含数据文件相关内容,没有 REDO 日志信息,利用非一致性备份集还原的数据库,无法直接启动,必须借助归档日志进行恢复之后才可以启动。但是有一种情况除外:数据库正常关闭时,会生成完全检查点,脱机备份生成的备份集中,不包含任何 REDO 日志。因此脱机备份一个正常关闭的数据库,既可以从归档日志恢复也可以从备份集恢复。
· 表空间备份生成的备份集是非一致性备份集。
完全备份和增量备份
按照备份数据完整性,可将备份分为完全备份和增量备份。库备份和表空间备份支持增量备份,表备份不支持增量备份。
· 完全备份生成的备份集包含了指定库(或者表空间)的全部有效数据页。当数据规模比较大的情况下,生成的完全备份集通常会比较大,而且备份时间也会比较长。
· 增量备份是在某个特定备份集基础上,收集数据库新修改的数据页进行备份,可以有效减少备份集的空间占用、提高备份速度。这个特定的、已经存在的备份集称为增量备份的基备份,根据对基备份的要求不同,DM 的增量备份分为以下两种:
还原结束后目标库有可能处于非一致性状态,不能马上提供数据库服务;必须要进行数据库恢复操作后,才能正常启动。
逻辑还原和物理还原
· 逻辑还原是逻辑备份的逆过程,逻辑还原就是使用dimp工具,把dexp导出的备份数据重新导入到目标数据库
· 物理还原是物理备份的逆过程,物理还原一般通过 DMRMAN 工具(或者 SQL 语句),把备份集中的数据内容(数据文件、数据页、归档文件)重新拷贝、写入目标文件
联机还原和脱机还原
联机还原指数据库处于运行状态时,通过 SQL 语句执行还原操作。表还原可以在联机
状态下执行。
脱机还原指数据库处于关闭状态时执行的还原操作,脱机还原通过DMRMAN工具进行。
库备份、表空间备份和归档备份,可以执行脱机还原。脱机还原操作的目标库必须处于关闭
状态
数据还原和归档日志还原
根据备份集类型,数据还原可以分为库还原、表空间还原和表还原。库还原和表空间必
须脱机执行;表还原操作只能联机执行。
表空间还原的数据来源既可以是表空间备份集,也可以是库备份集。还原的目标表空间不能是 TEMP 表空间,只能是 MAIN、SYSTEM、ROLL 表空间,或者用户定义的表空间。
表还原从表备份集读取数据,重新恢复目标表数据,还会在目标表上重建索引、约束。
归档日志还原则将归档日志备份集中的归档日志内容,重新生成到指定目录中
完全还原和增量还原
完全还原是指直接利用完全备份集进行数据还原操作。增量还原指通过增量备份集进行数据还原操作。但是考虑到增量备份集的基础一定是一个完全备份集,因此增量还原过程中隐含了一个完全还原操作。如果增量备份集的基备份集被删除了,那么单独使用这个增量备份集是无法进行还原操作的。
库备份还原:备份—还原—恢复。恢复又细分为恢复一致性、更新DB_MAGIC两步;
表空间备份还原:备份—还原—恢复。恢复只包括恢复一致性这一步;
表备份还原:备份—还原
当前仅支持备份集方式的备份还原,不再支持其他备份方式。备份还原实现策略有两种:dmap辅助进程方式和无辅助进程方式。用户可通过dm.ini参数bak_use_ap来选择(dmrman使用参数use_ap),bak_use_ap可取值1、2。默认为1
bak_use_ap的两种取值的相应作用如下:
1. DMAP辅助进程方式,可支持第三方备份(指定DEVICE TYPE为TAPE)。DMAP插件执行,改造了备份还原任务子系统,允许指定并行度,大幅提升了备份还原的效率,特别是加密、压缩的处理效率。如果选择使用DMAP辅助进程,执行备份还原之前就必须启动DMAP服务。安装DM数据库以后,DMAP服务会自动启动。如果需要手动启动,有两种途径,一是启动DM服务查看器中的DmAPService。二是通过手动启动DMAP执行码实现,DMAP执行码位于DM安装目录的bin子目录下。除此之外,LINUX下,还可以调用bin目录下的DmAPService 脚本。
2:无辅助进程方式,不依赖DMAP,由主进程dmserver自身执行备份还原,但不支持第三方备份(指定 DEVICE TYPE 为 TAPE)
备份还原相关的归档有本地归档和远程归档两种
本地归档
REDO 日志本地归档(LOCAL),就是将 REDO 日志写入到本地归档日志文件的过程。配置本地归档情况下,REDO 日志刷盘线程将 REDO 日志写入联机 REDO 日志文件后,对应的 RLOG_PKG 由专门的归档线程负责写入本地归档日志文件中。
与联机 REDO 日志文件可以被覆盖重用不同,本地归档日志文件不能被覆盖,写入其中的 REDO 日志信息会一直保留,直到用户主动删除;如果配置了归档日志空间上限,系统会自动删除最早生成的归档 REDO 日志文件,腾出空间。
为了最大限度地保护数据,当磁盘空间不足导致归档写入失败,系统将自动挂起等待,直到用户主动释放出足够的空间后继续运行。在设置多路本地归档的情况下,如果第一路本地归档若磁盘空间不足,则系统会被强制挂起,直到磁盘空间释放后继续运行。其它本地归档可以通过在 dmarch.ini 中设置 ARCH_HANG_FLAG 参数表示本地归档写入失败系统是否挂起,缺省值为 1 表示本地归档写入失败系统挂起。此外,系统会定期尝试恢复 INVALID的本地归档状态为 VALID。恢复 VALID 状态之后,如果正好剩余磁盘空间充足,那么可以继续归档。但是其它路(第一路归档之外的)本地归档中缺失的归档就需要人工手动进行修复了。当磁盘损坏导致归档日志写入失败时,系统会强制 HALT。
DM 提供了按指定的时间或指定的 LSN 删除归档日志的系统函数(SF_ARCHIVELOG_DELETE_BEFORE_TIME和SF_ARCHIVELOG_DELETE_BEFORE_LSN,具体请参考《DM8_SQL 语言使用手册》),但需谨慎使用。避免归档日志缺失,导致数据无法恢复。
远程归档
远程归档必须双向配置。否则,单向配置后远程归档会处于无效状态。
所谓远程归档(REMOTE ARCHIVE),顾名思义就是将归档目录配置在远程节点上。远程归档专门用于 DMDSC 环境中。远程归档采用双向配置的方式,双向配置远程归档就是两个节点将自己的远程归档相互配置在对方机器上。集群中所有的节点,都拥有一套包括所有节点的,完整的归档日志文件。
具体有两种配置方式:一是共享本地归档的远程归档,即将远程归档目录配置为另一节点的本地归档目录,以此来共享它的本地归档日志文件;二是通过 MAL 发送的远程归档,即将写入本地归档的 REDO 日志信息,通过 MAL 发送到远程节点,并写入远程节点的指定归档目录中,形成远程归档日志文件。
远程归档与本地归档的主要区别是 REDO 日志写入的位置不同,本地归档将 REDO 日志
写入数据库实例所在节点的磁盘,而远程归档则将 REDO 日志写入到其他数据库实例所在节
点的指定归档目录。
通过 MAL 发送的远程归档与本地归档的另外一个区别就是归档失败的处理策略不同:本地归档写入失败(比如磁盘空间不足),系统将会挂起;而远程归档失败则会直接将远程归档失效,不再发送 REDO 日志到指定数据库实例。当节点间网络恢复、或者远程节点重启成功后,系统会自动检测并恢复远程归档,继续发送新写入的 REDO 日志,但不会主动补齐故障期间的 REDO 日志。因此,在出现节点故障等情况下,通过 MAL 发送的远程归档的内容有可能是不完整的,而本地归档的内容肯定是完整的;如果备份还原恰好需要用到这段丢失的远程归档日志,那么可以从源端的本地归档拷贝、补齐这部分内容。而共享本地归档的远程归档,其本质就是本地归档,因而不存在远程归档日志丢失的问题,加上共享本地归档精省去了 MAL 发送的过程,因此更加可靠高效。综上所述,DM 推荐用户使用共享本地归档的远程归档。
共享本地归档的远程归档
共享本地归档的远程归档就是双向配置的两个节点都不再发送 REDO 日志到对方机器上生成远程归档日志文件,而是将对方的本地归档作为自己的远程归档。例如,节点 0 的本地归档配置在 ASM 共享存储或其他共享磁盘上。节点 1 可以通过将自己的远程归档目录设置为节点 0 的本地归档目录,将节点 0 的本地归档日志文件作为自己的远程归档日志文件。图展示了一个共享本地归档的远程归档的双向配置示意图
DMDSC 集群中,各个节点配置一个远程归档为其他节点的本地归档,通过这种共享本地归档的方式,可以在任意一个节点上,访问到 DMDSC 集群所有节点产生的、完整的归档日志文件。若节点出现故障,故障恢复后,因为该节点配置的远程归档为其他节点的本地归档,该节点的远程归档内容仍然是完整的,因此无需进行手动修复。
通过MAL发送的远程归档
通过 MAL 发送的远程归档就是将写入本地归档的 REDO 日志信息,发送到远程节点,并写入远程节点的指定归档目录中。远程归档的触发时机是,在 REDO 日志写入本地归档日志文件的同时,将 REDO 日志通过 MAL 系统发送给指定的数据库实例。
DMDSC 集群中,如果各个节点在配置本地归档之外,再双向配置一个远程归档,那么就可以在任意一个节点的本地磁盘中,找到一套 DMDSC 集群所有节点产生的、完整的归档日志文件。图展示了一个通过 MAL 发送的远程归档的双向配置示意图
若节点出现故障,故障恢复后,因为该节点配置的通过 MAL 发送的远程归档,该节点
的远程归档内容可能不完整,可能缺少故障期间的 REDO 日志,因此需要进行手动修复。
在数据库异常关闭后使用
DM 数据库实例正常退出时,会将所有 REDO 日志写入归档日志文件中;但是数据库实例异常关闭时,可能存在部分 REDO 日志未写入归档日志文件中,归档日志文件中的内容比实际可恢复的数据少一部分。这种情况下,将无法利用归档日志文件将数据恢复到最新状态,需要从联机日志文件拷贝该部分日志以补齐本地归档日志。
本地归档修复会扫描联机日志文件,将那些已经写入联机日志文件、但还没有写入到归档日志文件的 REDO 日志,重新写入到归档日志文件,流程如下:
除了通常意义上的数据备份、还原之外,DM 还支持对本地归档日志文件进行备份和还原。
归档日志备份是数据库备份的一个有效补充。在使用非一致性备份集进行还原后,必须使用归档日志进行恢复之后,数据库才能启动。
因为归档日志文件中保存了所有数据库操作产生的 REDO 日志,所以只要在一个基准备份集的基础上,加上一个完整的归档日志,我们就可以将数据库恢复到任意时间点的状态。
与联机备份收集备份过程中产生的 REDO 日志写入备份集不同,归档日志备份专门用来备份本地归档日志文件,将符合条件的本地归档日志文件拷贝到备份集中保存起来。
归档日志备份仅备份指定数据库生成的本地归档日志文件,要求归档日志文件的DB_MAGIC 与数据库的 DB_MAGIC 保持一致。如果本地归档目录中包含多个不同数据库的归档日志文件,也只会备份一个特定数据库的归档日志。由于经过还原后数据库的DB_MAGIC 会产生变化,因此即便 PERMANENT_MAGIC 相同,DB_MAGIC 不同的数据库产生的归档日志也不会备份。
与普通的数据库备份一样,归档日志备份也支持加密与压缩功能,可以联机执行归档日志备份,也可以在数据库关闭情况下使用 DMRMAN 工具进行脱机备份。归档日志备份时,可以指定是否删除已经备份的归档日志文件,在生成归档日志备份集的同时,删除本地归档日志文件,释放磁盘空间。
归档日志还原就是将备份集中的归档日志文件重新拷贝到指定归档目录中。使用归档日志备份集,既可以将归档日志文件还原到指定数据(还原时指定目标库的 dm.ini)的归档目录,也可以还原到用户指定的任意归档目录中。
归档日志还原的过程包括:
任何一个对 DM 数据库的操作,归根结底都是对某个数据文件页的读写操作。
物理备份就是把这些数据文件中的有效数据页备份起来,在出现故障时,用于恢复数据。一份完整的物理备份包括数据备份和 REDO 日志备份两部分。数据备份是拷贝数据页内容,REDO 日志备份则是拷贝备份过程中产生的 REDO 日志。
INI 参数 **page_check**,指定**页校验模式**,当指定值不为 0 时,在执行备份过程中会对数据页执行校验操作,校验结果会记录在备份集中,并在备份结束后给出警告信息,警告码为 609,告知用户此备份集中存在被破坏的数据页。该警告只是提示作用,并不影响备份集的有效性。在还原库上,备份集中备份的被破坏数据页在经过还原和恢复操作后,可以正常使用
DM 支持联机和脱机库级备份。
库备份分为完全备份和增量备份两种。
完全备份
备份程序扫描数据文件,拷贝所有被分配、使用的数据页,写入到备份片文件中。库备份会扫描整个数据库的所有数据文件。
参照如图 1.2,若执行库备份,则备份数据文件包括除 TEMP 表空间以外的其他表空间内的所有数据文件。数据文件备份结束后,BEGIN_LSN 之前修改的所有数据页都被备份下来。
增量备份
执行增量备份,备份程序会扫描数据文件,拷贝所有基备份结束以后被修改的数据页,写入到备份片文件中。
为了简化增量备份的还原过程,避免还原过程中重做基备份集对应的归档日志,DM 要求执行增量备份时,<=基备份 END_LSN 的所有数据页已经写入磁盘。由于基备份过程中,基备份BEGIN_LSN 与 END_LSN 之间的数据页可能被修改,导致数据库中的数据与备份文件中的数据不一致,所以增量备份会拷贝 LSN >基备份 BEGIN_LSN 的数据页写入备份片文件中,LSN <= 基备份 BEGIN_LSN 的数据页不需要写入到备份片文件中。
同样库增量备份会扫描整个数据库的所有数据文件。
DM 只支持联机表空间备份。但是不支持对 TEMP 表空间进行备份还原。
表空间备份也支持完全备份和增量备份。
表空间备份只拷贝指定表空间的数据页。
相对于数据库备份而言,表空间备份的速度会更快,生成的备份集会更小。对一些包含
关键数据的用户表空间,我们可以使用表空间备份功能,进一步保障数据安全。
DM 只支持联机表备份。
表备份主要包括数据备份和元信息备份两部分。与库备份和表空间备份不同,表备份不
是直接扫描数据文件,而是从 BUFFER 中加载数据页,拷贝到备份片文件中。表备份的元
信息则包括建表语句、重建约束语句、重建索引语句,以及其他相关属性信息。表备份不需
要配置归档就可以执行,并且不支持增量表备份。
增量备份和完全备份的 REDO 日志备份流程完全相同。
只有库级和表空间级备份支持 REDO 日志备份。未指定 WITHOUT LOG 参数执行的库备份或表空间备份则包含了 REDO 日志备份。
REDO 日志备份就是将备份开始(BEGIN_LSN)之后产生的 REDO 日志拷贝到备份片文件中,用来在数据库还原结束后,将数据库恢复到一致性状态。如图 2.所示,在执行备份过程中,用户可能修改数据库中的数据,并产生对应的 REDO 日志。在备份开始时,记录一个 BEGIN_LSN,在备份结束后记录一个 END_LSN,那么[BEGIN_LSN, END_LSN]之间的 REDO 日志,就对应备份过程中用户对数据的修改。其中BEGIN_LSN = CKPT_LSN,作为日志备份的起点,END_LSN = 数据备份结束时的FILE_LSN,作为日志备份的终点。
库备份和表空间备份均默认开启日志备份,将备份过程中产生的 REDO 日志单独写入备份片作为备份集的一部分。也可以通过 WITHOUT LOG 子句取消这部分 REDO 日志的拷贝,这种情况下生成的备份本身是不完整的,还原后,还要依赖备份库的本地归档日志来进行恢复操作后,才能将数据恢复到一致性状态;否则,还原后的数据库将无法正常启动。其中,对正常退
出的库执行脱机备份,因为没有可备份的 REDO 日志,因此可关闭日志备份。
还原后目标库中 REDO 日志的数量,由目标库本身 REDO 日志的数量决定。跟源库中REDO 日志的数量无关。例如,源库中有 3 个 REDO 日志,目标库中只有 2 个,将源库还原到目标库后,目标库仍然只有 2 个 REDO 日志。
DM 支持对备份数据进行压缩和加密处理,用户在执行备份时,可以指定不同的压缩级别,以获得不同的数据压缩比。默认情况下,备份是不进行压缩和加密处理的,详细使用方法参考 3 备份还原实战中的相关介绍。
DM 共支持 9 个级别(1~9 级)的压缩处理,级别越高压缩比越高,但相应的压缩速度
越慢、CPU 开销越大。
备份加密包括加密密码、加密类型和加密算法三个要素。加密密码通过使用IDENTIFIED BY<加密密码>来指定,使用备份集的时候必须输入对应密码。加密类型分为不加密、简单加密和完全加密。简单加密仅仅对部分数据进行加密,加密速度快;完全加密对所有数据执行加密,安全系数高。加密算法可参考《DM8 安全管理》加密章节。
加密类型和算法,用户均可手动指定。如果用户指定了加密密码,但没有指定加密类型和算法,则使用默认加密算法进行简单加密。用户也可以指定加密密码,但将加密类型指定为不加密。
如果同时指定加密和压缩,则备份过程中,会先进行压缩处理,再进行加密处理,备份的所有数据页和 REDO 日志都会进行压缩、加密处理。
如果基备份集没有指定加密类型,那么增量备份也不能指定加密类型;
如果基备份集指定了加密算法,那么增量备份的加密类型、加密算法和密码必须与基备份保持一致。
库备份、表空间备份以及归档日志备份可以进行并行处理,用户通过关键字 PARALLEL指定是否执行并行备份,以及并行备份的并行数。如果指定了 PARALLEL 关键字,但不指定并行数,那么默认的并行数为 4,但实际的备份并行度由 DMAP 最终创建成功的并行子任务数决定。增量备份是否并行以及并行数与其基备份集无关。
目前的数据库并行备份还原都是以文件为单位,适用于待备份文件大小比较均匀的情况。若文件大小差别比较大,特别存在个别文件巨大时,并行备份还原基本没有优势。因此在进行数据库备份时,需要指定 READ SIZE <拆分块大小>,将巨大的数据文件先进行拆分之后再进行备份。
执行并行备份会生成一个主备份集和若干个子备份集,子备份集不能单独还原,也不能作为其他备份集的基备份。备份过程中产生的 REDO 日志保存在主备份集中,子备份集仅包含数据文件相关内容。
以下为一个并行数为 3 的脱机并行备份集(左)和非并行脱机备份集(右)比较截图:
还原是备份的逆过程,具体包括数据还原和数据恢复两步。
数据还原的主要目的是将目标数据库还原到备份结束时刻的状态,数据还原的主要动作是将数据页从备份集中拷贝回数据库文件相应位置。数据恢复则是重做 REDO 日志将数据库恢复到一致性状态。
还原恢复时,若性能较差,则可以通过适当增大 dm.ini 文件中 BUFFER 的参数值或根据当前系统主机核数适当调整 REDOS_PARALLEL_NUM 的参数值来提升还原恢复性能。其中,BUFFER 的参数值建议为可用物理内存的 60%~80%。
库还原就是根据库备份集中记录的文件信息重新创建数据库文件,并将数据页重新拷贝到目标数据库的过程。
DM 既可以将一个已存在的数据库作为还原目标库,也可以指定一个路径作为还原目标库的目录。库还原的主要步骤包括:清理目标库环境;重建数据库文件;拷贝数据页;重建联机日志文件;修改配置参数等。
清理目标库环境
如果指定已存在的数据库作为还原目标库,还原操作首先解析 dm.ini 配置文件,获取 dm.ctl 控制文件路径,删除控制文件中的数据文件,然后根据 OVERWRITE 选项
· 如指定OVERWRITE 选项,若待还原文件存在,则删除
· 如果未指定 OVERWRITE 选项,若待还原文件存在,则报错,但保留目标库的日志文件、控制文件等
需要注意的是,HUGE 数据文件未记录在 dm.ctl 控制文件中。如果指定还原到一个目录,则根据 OVERWRITE 参数选择策略,检查目标目录内的dm.ini文件、dm.ctl 文件、默认的日志文件 DBNAME01.log 和 DBNAME02.log(其中 DBNAME 为数据库名称)、待还原的数据文件等。
重建数据库文件
如果将一个已存在数据库作为还原目标,则需要将目标数据库的 dm.ini 路径作为还原参数。还原过程中,会重新创建数据文件,并将相关信息写入 dm.ctl 控制文件中。
如果将数据库还原到指定目录,则会在这个目录创建一个 dm.ini 配置文件,设置CTL_PATH、SYSTEM_PATH 配置项指向这个目录,并在这个目录下创建 dm.ctl 控制文件。
DMDSC 不支持指定目录还原数据库。
数据文件重建策略:
表空间还原是根据库备份集或表空间备份集中记录的数据信息,重建目标表空间数据文件并拷贝数据页的过程,该过程不涉及日志操作。
表空间还原只可以在脱机状态下执行。脱机时通过 DMRMAN 工具执行,对表空间状态没有限制。
表空间还原后如果表空间状态为 RES_OFFLINE,表明目标表空间已进行还原操作,但数据不完整。
在部分数据文件损坏,或者部分物理磁盘损坏情况下,我们可以指定还原数据文件,跳过那些不正常的数据文件,以提升还原速度。
表空间还原也支持使用 mapped file 进行数据文件映射,如果不指定 mapped file,则默认当前系统目录与备份集中一致。实际创建过程中,若发现已经存在或者创建失败后,处理方式与数据库还原中数据重建策略处理一致。
表空间状态包括:ONLINE(联机状态)、OFFLINE(脱机状态)、RES_OFFLINE(还原状态)、CORRUPT(损坏状态)。V$TABLESPACE 表的 STATUS$列值表示 表 空 间 状 态 , 0/1/2/3 分 别 代 表 ONLINE 状 态 /OFFLINE 状 态/RES_OFFLINE 状态/CORRUPT 状态。
表空间发生故障,比如还原失败(处于 RES_OFFLINE 状态)、表空间文件损坏或缺失(处于 OFFLINE 状态),这两种故障情况下如果想直接删除表空间,不考虑还原恢复的方式,则可以手动将表空间切换到 CORRUPT 状态,再执行删除操作,否则无法删除。已经切换到 CORRUPT 状态后,仍然允许再次执行还原恢复
表还原是表备份的逆过程,表还原从表备份集中读取数据替换目标表,将目标表还原成备份时刻的状态。表还原主要包括三部分内容:表结构还原、数据还原、以及重建索引和约束。
如果还原目标表不存在,则利用备份集中记录的建表语句重建目标表;如果还原目标表已经存在,则清除表中的数据、删除二级索引和约束;如果备份表存在附加列(通过 ALTER TABLE 语句快速增加的列),那么还原目标表必须存在、并且目标表所有列的物理存储格式必须与备份源表完全一致。
数据还原过程从表备份集拷贝数据页,重构数据页之间的逻辑关系,并重新形成一个完整的表对象。
在数据还原结束后,使用备份集中记录的信息,重新在表上创建二级索引,并建立各种约束。
表还原只支持在联机状态下执行,表还原过程中也不需要重做 REDO 日志。并且,表备份集允许跨库还原,但要求还原目标库与源库的数据页大小等建库参数相同。需要匹配的建库参数参考下表
数据恢复是指在还原执行结束后,重做 REDO 日志,将数据库恢复到一致性状态,并执行更新 DB_MAGIC 的过程。
重做 REDO 日志可以多次执行,直到恢复到目标状态。还原结束后,必须经过恢复操作,数据库才允许启动。即使备份过程中没有修改任何数据,备份集不包含任何 REDO 日志,在数据库还原结束后,也必须使用 DMRMAN 工具执行数据恢复操作后,才允许启动数据库。
数据恢复重做的 REDO 日志,既可以是那些在备份过程中产生的、包含在备份集中的 REDO 日志,也可以是备份数据库本地归档日志文件。在本地归档日志完整的情况下,数据还原结束后,可以利用本地归档日志,将数据库恢复到备份结束后任意时间点状态。
不管采用哪种数据恢复方法,REDO 日志的范围至少要覆盖备份过程中产生的 REDO 日志,也就是说必须完整包括备份集中记录的[BEGIN_LSN, END_LSN]之间的 REDO 日志,如果归档日志缺失将会导致数据库恢复失败。只有库备份和表空间备份还原后,需要执行数据恢复,表还原结束后,不需要执行数据恢复。
PERMANENT_MAGIC
和 DB_MAGIC
是用来标识数据库的 INTEGER 类型值。DM 在初始化数据库时生成 PERMANENT_MAGIC 和 DB_MAGIC 值,其中 PERMANENT_MAGIC 一经生成,永远不会改变(DDL_CLONE 还原库的 PERMANENT_MAGIC 除外),称为数据库永久魔数。只有 DDL_CLONE 还原库的 PERMANENT_MAGIC 会发生改变,当一个库使用 DDL_CLONE备份集还原并恢复之后,在执行 RECOVER DATABASE …… UPDATE DB_MAGIC 时,PERMANENT_MAGIC 会发生改变。
DB_MAGIC 称为数据库魔数,同样可以用来表示某一个数据库,但 DB_MAGIC 是可以变化的,每经过一次还原、恢复操作后,DB_MAGIC 就会产生变化,用来区分备份源库和还原目标库。可以通过下列语句查看系统的 PERMANENT_MAGIC 和 DB_MAGIC 值。
数据库恢复分为两步:一恢复一致性
;二更新 DB_MAGIC
。
恢复一致性
恢复一致性有两种途径:一是通过指定备份集恢复;二是通过指定归档恢复。用户需根据备份时是否选择WITHOUT LOG
子句来决定选择何种恢复途径。
只能在还原后的数据库上执行更新DB_MAGIC操作
考虑到用户表空间上的数据库对象定义是保存在SYSTEM 表空间的系统表内,而用户表空间仅保存这些数据库对象的数据,为了避免出现数据库对象的数据与定义不一致的情况,一般要求在表空间还原后,重做指定表空间所有 REDO 日志将这个表空间数据恢复到最新状态。与表空间还原类似,表空间恢复也只能在脱机状态下通过 DMRMAN 工具完成。
表空间恢复的 REDO 日志是从本地归档日志文件中提取。表空间恢复同样要求满足归档日志覆盖[BEGIN_LSN, END_LSN]的要求。
注:表空间恢复结束,并执行 ONLINE 表空间操作后,用户就可以访问这个表空间;但 ONLINE 操作并不会触发事务回滚,所以重做 REDO 日志产生的未 COMMIT 事务,也不会被回滚掉
DMDSC 库与普通单节点数据库的区别在于 DMDSC 库的多个节点共同维护一份库数据,每个节点上都有独立的联机日志和本地归档日志。重做 REDO 日志恢复时,需要重做所有节点上的 REDO 日志,因此需要提供各个节点的归档日志。
解密和解压缩是备份过程中加密和压缩的逆操作,如果备份时未指定加密或压缩,还原和恢复过程中也不需要执行解密或者解压缩操作。
如果备份时进行了加密,那么还原时用户必须指定与备份时一致的加密密码和加密算法,否则还原会报错。如果备份时没有加密,那么还原时用户不需要指定加密密码和加密算法,如果指定了,也不起作用。DM 还原时的解密过程主要包括:
指定并行备份生成的备份集,在还原时默认采用并行方式还原,并行度上限为备份时指定的并行数,实际并行度由 DMAP 最终创建成功的并行子任务数决定。目前,非并行备份生成的备份集,不支持以并行方式还原。