DM8 物理备份恢复原理
1. 基本概述
数据库的备份与恢复是系统容灾的重要方法,备份与恢复的目的是为了保护数据库的数据,防止其丢失
和损坏,并且能够在数据库数据被破坏的情况下,重构数据库,保证数据的正确性。
适用场景场景:
-
硬件故障(服务器崩溃、存储失效)
-
用户错误(误删表数据,误删数据库文件)学习,
以上场景会影响到数据库中数据的完整性和正确性,使数据库中全部或者部分数据丢失或更改。
-
数据移动或集群环境搭建
数据库备份是为了在数据库发生故障时,通过备份还原,将数据库恢复到可用状态 DM8 支持三种方式的备份:逻辑备份、使用联机 SQL 命令进行备份、DMRMAN 工具的备份

2. 相关概念
2.1 REDO 日志
重做日志又叫 REDO 日志,记录了所有物理页的修改,基本信息包括操作类型、表空间号、文件号、页号、页内偏移、实际数据等。数据库中 INSERT、DELETE、UPDATE 等 DML 操作以及 CREATE TABLE 等 DDL 操作最终都会转化为对某些数据文件、某些数据页的修改。因此,在系统故障重启时,通过重做 REDO 日志,可以将数据库恢复到故障时的状态
重做联机日志文件
DM 数据库默认包含两个扩展名为 log 的日志文件,用来保存 REDO 日志,称为联机重做日志文件。这两个文件循环使用。任何数据页从内存缓冲区写入磁盘之前,必须保证其对应的 REDO 日志已经写入到联机日志文件
REDO 日志包
REDO 日志包(RLOG_PKG)是 DM 数据库保存 REDO 日志的数据单元,一个日志包内可保存一个或多个 PTX(物理事务) 产生的 REDO 日志。日志包具有自描述的特性,日志包大小不固定,采用固定包头和可变包头结合的方式,包头记录日志的控制信息,包括类型、长度、包序号、LSN 信息、产生日志的节点号、加密压缩信息、日志并行数等内容
日志包生成时按照序号连续递增,相邻日志包的 LSN 顺序是总体递增的,但是在 DMDSC 集群环境下不一定连续;如果未开启并行日志,RLOG_PKG 包内日志的 LSN 是递增的。如果开启并行日志,一个 RLOG_PKG 包内包含多路并行产生的日志,每一路并行日志的 LSN 是递增的,但是各路之间的 LSN 并不能保证 LSN 有序,因此并行日志包内 LSN 具有局部有序,整体无序的特点
2.2 UNDO 日志
UNDO 日志用于撤销未提交事务对数据库的修改。当一个事务开始执行时,它的所有修改都会被记录在 UNDO 日志中。在系统崩溃后,使用 UNDO 日志可以撤销(undo)这些修改,恢复数据库到事务开始前的状态
- 存放被修改记录的旧值 old->new
- 事务结束后,purge 自动释放
- UNDO_RETENTION, PURGE_WAIT_TIME
2.3 LSN
LSN(Log Sequence Number) 是由系统自动维护的 Bigint 类型数值,具有自动递增、全局唯一特性
每一个 LSN 值代表着 DM 系统内部产生的一个物理事务,物理事务(Physical Transaction,简称 ptx)是数据库内部一系列修改物理数据页操作的集合,与数据库管理系统中事务(Transaction)概念相对应,具有原子性、有序性、无法撤销等特性
DM 数据库中与 LSN 相关的信息,可以通过查询 v r l o g 和 V rlog 和 V rlog和VRAPPLY_PARALLEL_INFO 表来获取,主要包含以下几种 LSN:
-
CUR_LSN
系统已经分配的最大
LSN值物理事务提交时,系统会为其分配一个唯一的
LSN值,大小等于CUR_LSN+1,然后再修改CUR_LSN=CUR_LSN+1 -
FLUSH_LSN :
已经发起日志刷盘请求,但还没有真正写入联机
Redo日志文件的最大LSN值 -
FILE_LSN :
已经写入联机
Redo日志文件的最大LSN值每次将
Redo日志包RLOG_PKG写入联机Redo日志文件后,都要修改FILE_LSN值。 -
CKPT_LSN
检查点
LSN所有
LSN <= CKPT_LSN的物理事务修改的数据页,都已经从Buffer缓冲区写入磁盘,CKPT_LSN由检查点线程负责调整 -
APPLY_LSN 是数据库还原恢复后已经写入联机
Redo日志文件的日志包的原始最大 LSN 值,APPLY_LSN取自源库的原始日志包中的最大LSN值DSC 集群的每一个节点独立维护
APPLY_LSN。 -
RPKG_LSN 是数据库还原恢复后已经重演日志的最大 LSN。DSC 集群的每一个节点独立维护
RPKG_LSN
数据故障重启时,CKPT_LSN 之前的 REDO 日志不需要重做,只需要从 CKPT_LSN+1 开始重做 REDO 日志,就可以将系统恢复到故障前状态。并且,在联机重做日志文件中,LSN <=CKPT_LSN 的 REDO 日志都可以被覆盖
数据写入与各个 LSN 关系

2.4 包序号
每个 RLOG_PKG 都有对应的序号属性,称之为包序号(PKG SEQNO),日志包生成时按照序号连续递增。包序号包括本地包序号(LSEQ)和全局包序号(GSEQ)
- 本地包序号是节点内唯一、连续递增的值,用于校验联机日志连续性
- 全局包序号由数据守护集群的主备库共同维护,具有全局唯一、连续、递增的特性,用于校验归档日志的连续性
DM 数据库中与全局包序号相关的信息,可以通过查询 v r l o g 和 V rlog 和 V rlog和VRAPPLY_PARALLEL_INFO 表来获取。数据库端主要包括以下几种类型的全局包序号:
- CUR_SEQ 是系统已经分配的最大全局包序号。
RLOG_PKG写入联机日志文件前,系统会为其分配一个唯一的全局包序号 - FILE_SEQ 是已经写入联机 Redo 日志文件的最大全局包序号。每次将 Redo 日志包
RLOG_PKG写入联机 Redo 日志文件后,都要修改FILE_SEQ值 - APPLY_SEQ 是数据库还原恢复后已经写入联机 Redo 日志文件的原始最大全局包序号,
APPLY_SEQ取自源库的原始日志包的包序号。DSC 集群的每一个节点独立维护APPLY_SEQ - RPKG_SEQ 是数据库还原恢复后已经重演日志的最大全局包序号。DSC 集群的每一个节点独立维护
RPKG_SEQ
2.5 检查点
DM 数据库运行过程中,用户的所有操作都在内存中进行。每修改一条记录都必须先把记录所在的数据页加载到 BUFFER 缓冲区中,然后进行修改。事务运行时,会把生成的 REDO 日志保留在 Redo 日志包 RLOG_PKG 中,每条日志记录对应一个 LSN,当事务提交或 Redo 日志包满或执行检查点时会进行日志刷盘
检查点(checkpoint)是一个数据库事件,它的功能是按照数据页的修改顺序,依次将 BUFFER 缓冲区中的脏页写入磁盘,并在这个过程中动态调整 CKPT_LSN 值,释放日志空间
- 完全检查点:会将内存缓冲区中的所有脏页写入磁盘,并调整
CKPT_LSN,在数据库正常关闭时会产生一个完全检查点。 - 部分检查点:根据 dm.ini 配置文件中的参数 CKPT_FLUSH_RATE 和 CKPT_FLUSH_PAGES,确定每次检查点刷脏页的数量。执行部分检查点的过程中,DDL/DML 操作都可以正常执行,DM 系统中绝大多数情况下触发的都是部分检查点。
检查点触发场景:
- 自动判断发起
- 手动发起 checkpoint(10) 刷 10% 的脏页
- 日志切换
数据库运行过程中产生的待写入日志首先写入 Redo 日志包 RLOG_PKG,当日志刷盘时一起写入联机日志文件中。在联机日志文件中,可以覆盖写入 REDO 日志的文件长度为可用日志空间;不能被覆盖的 REDO 日志,系统故障重启需要重做的 REDO 日志为有效日志,有效日志的 LSN 取值范围是 (CKPT_LSN,FILE_LSN]
下图说明了联机日志文件、Redo 日志包 RLOG_PKG 以及相关各 LSN 之间的关系
日志 flush 时机:
- 对应脏数据写到数据文件之前
- 日志缓冲区可用空间决定
- 事务提交
- 检查点来临
2.6 备份集
一个备份集对应一次完整备份,为一个目录,由一个或多个备份片和一个元数据文件组成。
备份片
备份片(后缀为.bak)是用来存储备份数据的文件。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到这些备份片文件中。
元数据
元数据文件(后缀为.meta)用来存储备份信息。包括:
-
备份集本身相关的信息(是否联机备份,备份的范围,备份的加密信息,以及备份的压缩信息等)
-
备份源库的建库参数信息(DSC 的节点数,是否大小写敏感,PAGE_CHECK 属性等)
-
备份集中备份数据文件信息(备份了哪些数据文件,文件大小,以及文件相关的表空间信息等)
-
备份集中备份片的信息(包含哪些备份片文件、备份片大小等信息)
-
备份库的 dm.ini 参数信息和密钥文件(dm_service.prikey 或者 dm_external.config,若指定 usbkey 加密,则不备份)
2.7 归档日志
备份与恢复过程都依赖归档日志,归档日志是保证数据一致性和完整性的重要保障。配
有归档日志的数据库系统在出现故障时丢失数据的可能性更小,这是因为一旦出现介质故障
如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时
间点
归档方式:
-
本地归档
REDO 日志本地归档(LOCAL),就是将 REDO 日志写入到本地归档日志文件的过程。配置本地归档情况下,REDO 日志刷盘线程将 REDO 日志写入联机 REDO 日志文件后,对应的
RLOG_PKG由专门的归档线程负责写入本地归档日志文件中本地归档可以通过在 dmarch.ini 中设置
ARCH_HANG_FLAG参数表示本地归档写入失败系统是否挂起,缺省值为 1 表示本地归档写入失败系统挂起DM 提供了按指定的时间或指定的 LSN 删除归档日志的系统函数(
SF_ARCHIVELOG_DELETE_BEFORE_TIME和SF_ARCHIVELOG_DELETE_BEFORE_LSN) -
远程归档
远程归档(
REMOTE ARCHIVE)专门用于 DMDSC 环境中,是将当前节点的远程归档目录配置为另一节点的本地归档目录,以此来共享它的本地归档日志文件。远程归档必须双向配置,即两个节点将自己的远程归档相互配置在对方机器上。DMDSC 集群中,各个节点配置一个远程归档为其他节点的本地归档,通过这种共享本地归档的方式,可以在任意一个节点上,访问到 DMDSC 集群所有节点产生的、完整的归档日志文件。若节点出现故障,故障恢复后,因为该节点配置的远程归档为其他节点的本地归档,该节点的远程归档内容仍然是完整的,因此无需进行手动修复。
-
实时归档
-
即时归档
-
异步归档
2.7.1 归档修复
当数据库实例异常关闭时,可能存在部分 REDO 日志未写入本地归档日志文件中,归档日志文件中的内容比实际可恢复的数据少一部分。这种情况下,需要从联机日志文件拷贝该部分日志以补齐归档日志。
本地归档修复会扫描联机日志文件,将那些已经写入联机日志文件、但还没有写入到归档日志文件的 REDO 日志,重新写入到归档日志文件,流程如下:
- 收集本地归档日志文件
- 扫描归档文件,获取最后一个有效
RLOG_PKG偏移 - 首先,根据偏移来截取最后一个本地归档日志文件中有效内容,删除掉
RLOG_PKG偏移之后的多余内容,保留RLOG_PKG偏移之前的内容,并调整日志文件头信息。然后,再创建一个新的空的归档日志文件; - 扫描联机日志文件,拷贝缺失的 REDO 日志并写入新创建的归档日志文件
2.7.2 归档备份
归档日志备份仅备份指定数据库生成的本地归档日志文件,要求归档日志文件的 DB_MAGIC 与数据库的 DB_MAGIC 保持一致
说明:
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 就会产生变化,用来区分备份源库和还原目标库。
通过一下语句查看对应的魔术值:
SELECT PERMANENT_MAGIC; SELECT DB_MAGIC FROM V$RLOG;
归档日志备份方式: 联机执行归档日志备份和 DMRMAN 工具进行脱机备份
归档日志备份时,可以指定是否删除已经备份的归档日志文件,在生成归档日志备份集的同时,删除本地归档日志文件,释放磁盘空间
用户可通过 V$ARCH_BACKUP_HISTORY 查看当前节点的归档日志备份信息
2.7.3 归档还原
归档日志还原就是将备份集中的归档日志文件重新拷贝到指定归档目录中
使用归档日志备份集,可以将归档日志文件还原到指定数据(还原时指定目标库的 dm.ini)的归档目录,也可以还原到用户指定的任意归档目录中
归档日志还原的过程包括:
- 根据过滤条件,从归档日志备份集收集需要还原的归档日志文件。
- 在指定的归档目录创建归档文件。如果目标归档文件已经存在,默认采用认为该归档完好,生成一条日志记录,不再还原策略。也可以使用
OVERWRITE指定策略。OVERWRITE参数为:1 表示认为归档文件完好,不再还原该归档文件,添加一条日志记录;2 表示存在同名归档立即报错返回,终止还原;3 表示强制删除归档,重新还原同名归档。 - 从备份集拷贝 REDO 日志,写入目标归档日志文件
3. 数据备份还原
任何一个对 DM 数据库的操作,归根结底都是对某个数据文件页的读写操作。物理备份就是把这些数据文件中的有效数据页备份起来,在出现故障时,用于恢复数据。一份完整的物理备份包括数据备份和 REDO 日志备份两部分。数据备份是拷贝数据页内容,REDO 日志备份则是拷贝备份过程中产生的 REDO 日志
START_LSN:归档日志起始 LSN 值,END_LSN:归档日志结束 LSN 值
START_LSN = 备份开始时 CKPT_LSN + 1
END_LSN = 备份结束时 FILE_LSN
如果 START_LSN 等于 END_LSN + 1,则表明备份过程中,没有任何数据被修改

3.1 数据备份
数据备份过程中,根据 DM 数据文件系统的描述信息,准确判断每一个数据页是否被分配、使用,将未使用的数据页剔除,仅保留有效数据页进行备份,这个过程我们称为智能抽取。与直接文件拷贝方式相比,DM 物理备份丢弃了那些没有使用的数据页,因此可以节省对存储空间的要求,并有效减少 IO 数量,提升备份、还原的效率。
对处于 RES_OFFLINE 和 CORRUPT 状态的表空间,则只记录表空间相关信息和状态,不会真正拷贝数据页。数据备份过程中,会对数据进行校验,如果校验失败则会将相关信息写入到日志文件 dm_BAKRES_xxx.log 中,但不会终止当前备份操作。
使用 dminit 建库时,通过设置 INI 参数
page_check,指定页校验模式,当指定值不为 0 时,在执行备份过程中会对数据页执行校验操作,校验结果会记录在备份集中,并在备份结束后给出警告信息,警告码为 609,告知用户此备份集中存在被破坏的数据页。该警告只是提示作用,并不影响备份集的有效性。在还原库上,备份集中备份的被破坏数据页在经过还原和恢复操作后,可以正常使用
备份方式:
备份还原实现策略有两种:dmap 辅助进程方式和无辅助进程方式
用户可通过 DM.INI 参数 bak_use_ap 来选择(dmrman 使用参数 use_ap),bak_use_ap 可取值 1、2。默认为 1
- 1:DMAP 辅助进程方式,可支持第三方备份(指定
DEVICE TYPE为 TAPE)。如果选择使用 DMAP 辅助进程,执行备份还原之前就必须启动 DMAP 服务。安装 DM 数据库以后,DMAP 服务会自动启动 - 2:无辅助进程方式,不依赖 DMAP,由主进程
dmserver自身执行备份还原,但不支持第三方备份
3.1.1 库备份
支持联机和脱机备份
3.1.1.1 全量备份
备份程序会扫描数据文件,拷贝所有被分配、使用的数据页,写入到备份片文件中,库备份会扫描整个数据库的所有数据文件(除 TEMP 表空间),END_LSN 之前的数据文件都会备份下来
3.1.1.2 增量备份
备份程序会扫描数据文件,拷贝所有基备份结束以后被修改的数据页,写入到备份片文件中
由于全量备份过程中,全量备份 BEGIN_LSN 与 END_LSN 之间的数据页可能被修改,导致数据库中的数据与备份文件中的数据不一致,所以增量备份会拷贝 LSN > 基备份BEGIN_LSN 的数据页 写入备份片文件中也会扫描整个数据库的所有数据文件(除 TEMP 表空间)
DM8 增量备份存在以下两种方式:
-
差异增量备份
差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集,默认为差异增量备份
利用增量备份进行还原操作时,要求其基备份必须是完整的;如果差异增量备份的基备份本身也是一个增量备份,那么同样要求其基备份是完整的;任何一个增量备份,最终都是以一个完全备份作为其基备份。因此,完全备份是增量备份的基础
-
累积增量备份
累积增量备份的基备份只能是完全备份集,而不能是增量备份集
增量备份的基备份集既可以是脱机备份生成的,也可以是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。
3.1.2 表空间备份
只能在联机状态下执行
表空间备份只拷贝指定表空间的数据页,表空间备份支持完全备份和增量备份,不支持 TEMP 表空间备份还原
3.1.3 表备份
表备份主要包括数据备份和元信息备份两部分,表备份是从 BUFFER 中加载数据页,拷贝到备份片文件中。表备份的元信息则包括建表语句、重建约束语句、重建索引语句,以及其他相关属性信息
3.1.4 备份附加配置
3.1.4.1 REDO 日志备份
只有库级和表空间级备份支持联机日志备份。未指定
WITHOUT LOG参数执行的库备份或表空间备份则包含了联机日志备份。
在备份开始时,记录一个 BEGIN_LSN,在备份结束后记录一个 END_LSN,那么 [BEGIN_LSN,END_LSN] 之间的 REDO 日志,就对应备份过程中用户对数据的修改。其中 BEGIN_LSN=CKPT_LSN,作为日志备份的起点,END_LSN = 数据备份结束时的 FILE_LSN,作为日志备份的终点
还原后目标库中 REDO 日志的数量,由目标库本身 REDO 日志的数量决定。跟源库中 REDO 日志的数量无关。例如,源库中有 3 个 REDO 日志,目标库中只有 2 个,将源库还原到目标库后,目标库仍然只有 2 个 REDO 日志
3.1.4.2 压缩与加密
默认情况下,备份是不进行压缩和加密处理的,DM 共支持 9 个级别(1~9 级)的压缩处理,级别越高压缩比越高,但相应的压缩速度越慢、CPU 开销越大
备份加密包括加密密码、加密类型和加密算法三个要素
- 加密密码通过使用 IDENTIFIED BY< 加密密码 > 来指定,使用备份集的时候必须输入对应密码
- 加密类型分为不加密、简单加密和完全加密
- 简单加密仅仅对部分数据进行加密,加密速度快;完全加密对所有数据执行加密,安全系数
3.1.4.3 并行备份
库备份、表空间备份以及归档日志备份可以进行并行处理,用户通过关键字 PARALLEL 指定是否执行并行备份,以及并行备份的并行数。如果指定了 PARALLEL 关键字,但没指定并行数,则使用默认的并行数 4
目前的数据库并行备份还原都是以文件为单位,即一个数据文件为一个并行单位,适用于个数据文件大小差异不大的情况。若文件大小差别比较大,特别存在个别文件巨大时,建议指定 READ SIZE <拆分块大小> 再进行备份
执行并行备份会生成一个主备份集和若干个子备份集,备份过程中产生的 REDO 日志保存在主备份集中,子备份集仅包含数据文件相关内容
并行度为 3 和并行度为 0 的备份集区别如下:

3.2 数据还原
3.2.1 库还原
DM 既可以将一个已存在的数据库作为还原目标库,也可以指定一个路径作为还原目标库的目录。库还原的主要步骤包括:清理目标库环境;重建数据库文件;拷贝数据页;重建联机日志文件;修改配置参数等
-
清理目标环境
-
指定已存在的库还原
还原操作首先解析 dm.ini 配置文件,获取 dm.ctl 控制文件路径,删除控制文件中的数据文件,然后根据
OVERWRITE选项,如果指定OVERWRITE选项,若待还原文件存在,则删除;如果未指定OVERWRITE选项,若待还原文件存在,则报错,但保留目标库的日志文件、控制文件等 -
指定还原到目录
根据
OVERWRITE参数选择策略,检查目标目录内的 dm.ini 文件、dm.ctl 文件、默认的日志文件 DBNAME01.log 和 DBNAME02.log(其中 DBNAME 为数据库名称)、待还原的数据文件等如果用户指定
OVERWRITE参数,并且存在相关文件情况下,还原过程中会自动删除这些已经存在的文件;如果没有指定OVERWRITE参数,并且存在相关文件,则会报错
-
-
重建数据库文件
-
指定已存在的库还原
将目标数据库的 dm.ini 路径作为还原参数。还原过程中,会重新创建数据文件,并将相关信息写入 dm.ctl 控制文件中
-
指定还原到目录
在这个目录创建一个 dm.ini 配置文件,设置
CTL_PATH、SYSTEM_PATH配置项指向这个目录,并在这个目录下创建 dm.ctl 控制文件。DMDSC 不支持指定目录还原数据库 -
重建策略
- 目标库和备份集中的
SYSTEM_PATH路径相同,则按照备份集中记录的原始路径创建文件 - 目标库和备份集中的
SYSTEM_PATH路径不相同,默认在目标库的SYSTEM_PATH目录下创建文件 - 目标库设置
REDOS_FILE_PATH_POLICY参数为 1 时,用户创建的表空间(表空间 id 大于等于 5)按照数据文件在源库中的路径结构,在目标库SYSTEM_PATH下创建相同路径结构的文件 - 使用
mapped file指定源文件与目标文件的映射关系,定制数据库文件的物理分布情况,可以很好的满足用户关于数据文件分布的需求
- 目标库和备份集中的
-
-
重建联机日志文件
指定目录还原,系统目录使用指定还原目录,所有库配置文件均认为在指定还原目录下
-
拷贝数据页
拷贝数据页是从备份集中读取数据页,并将数据页写入数据文件指定位置的过程
还原过程只涉及被分配使用的数据页
-
重置数据库
- 更新日志信息,设置当前
CKPT_LSN为备份集中BEGIN_LSN,并设置日志文件状态为INACTIVE - 更新
DB_MAGIC,还原后,库中PERMANENT_MAGIC仍与备份集中相同 - 设置还原标志,标识当前库为指定库要还原的库,不允许使用
- 更新目标库的控制文件 dm.ctl,把当前库中的数据文件信息都记录到控制文件中,使用备份集中的服务器秘钥文件,重新生成新的秘钥文件
- 更新日志信息,设置当前
-
修改配置参数
-
还原到指定库时,默认会保留目标库的配置参数不变,还原时指定
REUSE DMINI子句,使用备份集中的参数注: 路径相关的配置参数,比如 SYSTEM_PATH 等还是保留目标库 dm.ini 的原始值不变
-
注意事项:
-
指定的 dm.ini 必须存在且各项配置信息有效,其中 CTL_PATH 必须配置且路径必须有效
-
指定目录还原,指定目录将会作为数据库系统目录处理
-
对于增量备份的还原,需要搜集完整的备份集链表,然后从前到后,逐个还原备份集中数据
增量备份的还原过程中,不需要重做任何归档日志
-
-
3.2.2 表空间还原
表空间还原是根据库备份集或表空间备份集中记录的数据信息,重建目标表空间数据文件并拷贝数据页的过程
表空间还原只可以在脱机状态下执行,脱机时通过 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 状态后,仍然允许再次执行还原恢复
3.2.3 表还原
表还原只支持在联机状态下执行
表还原主要包括三部分内容:表结构还原、数据还原、以及重建索引和约束
- 目标表不存在,备份集中的建表语句重建目标表
- 目标表存在,还原时会清除表中的数据、删除二级索引和约束
注: 如果备份表通过
ALTER TABLE ADD COLUMN语法添加过列,则目标表必须存在且目标表所有列的物理存储格式必须与备份源表完全一致
表备份集允许跨库还原, 但要求还原目标库与源库的数据页大小等建库参数相同,可以使用 DMRMAN 工具的 SHOW 功能查看备份的数据页大小等建库参数,需要匹配的建库参数参考下表
| 名称 | 描述 |
|---|---|
| PAGE_SIZE | 数据页大小 |
| BLANK_PAD_MODE | 空格填充模式,可选值:0/1 |
| CASE_SENSITIVE | 字符大小写是否敏感 |
| CHARSET/UNICODE_FLAG | 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR] |
| USE_NEW_HASH | 是否使用新的 HASH 算法 |
| PAGE_ENC_SLICE_SIZE | 数据页加密分片大小 |
| ENCRYPT_NAME | 全库加密密钥使用的算法名 |
3.3 数据恢复
数据恢复是指在还原执行结束后,重做 REDO 日志,将数据库恢复到一致性状态,并执行更新 DB_MAGIC 的过程
必须完整包括备份集中记录的 [BEGIN_LSN,END_LSN] 之间的 REDO 日志,如果归档日志缺失将会导致数据库恢复失败
注: 只有库备份和表空间备份还原后,需要执行数据恢复
3.3.1 数据库恢复
数据库恢复分为两步:一恢复一致性;二更新 DB_MAGIC
3.3.1.1 恢复一致性
恢复一致性有两种途径,根据备份时是否选择 WITHOUT LOG 子句来决定:
- 指定备份集恢复
- 指定归档恢复
指定备份集恢复
默认未指定 WITHOUT LOG 子句的联机库备份生成的备份集,包含了备份过程中产生的 REDO 日志
基备份集中包含的 REDO 日志不需要重做,只要重做指定执行还原操作的备份集中包含的 REDO 日志
指定备份集恢复的简要过程包括:
- 从备份集读取 REDO 日志,并生成一个临时的本地归档日志文件
- 利用生成的临时归档日志文件,重做 REDO 日志,并将数据修改写入磁盘
- 删除临时生成的归档日志文件
- 更新数据库日志信息,设置
CKPT_LSN为最后一个重做的 REDO 日志 LSN 值 - 修改数据状态为 ACTIVE,标记数据库启动时需要进行相应的回滚活动事务、PURGE 已提交事务
指定归档恢复
备份时指定了 WITHOUT LOG 子句,那么产生的备份集不包含备份过程中产生的 REDO 日志,这种备份集还原后,必须利用本地归档日志,将数据库恢复到一致性状态
利用本地归档日志进行恢复时,DMRMAN 工具会扫描指定的归档日志目录,收集与恢复数据库 PERMANENT_MAGIC 值相等的归档日志文件
指定归档恢复的执行场景主要包括:
- 将还原后处于非一致性状态的数据库恢复到一致性状态
- 将已经处于一致性状态的数据库尽可能地恢复到最新状态
- 将数据库恢复到指定时间点状态
- 将数据库恢复到指定 LSN 产生时的状态
注意:
- 使用 DDL CLONE 方式备份的数据库,不支持指定归档恢复
- 指定归档恢复时,不建议使用联机状态下源库的归档,此时无法保证归档的完整性
3.3.1.2 更新 DB_MAGIC
若备份集满足 BEGIN_LSN 等于 END_LSN,即在备份过程中未产生 REDO 日志,则使用此备份集还原后只需要更新 DB_MAGIC 即可完成恢复
更新 DB_MAGIC 不重做 REDO 日志,仅仅更新库的 DB_MAGIC 值和数据库状态
3.3.2 表空间恢复
一般要求在表空间还原后,重做指定表空间所有 REDO 日志将这个表空间数据恢复到最新状态
表空间恢复也只能在脱机状态下通过 DMRMAN 工具完成
表空间恢复的 REDO 日志是从本地归档日志文件中提取,表空间恢复同样要求满足归档日志覆盖 [BEGIN_LSN,END_LSN] 的要求
3.3.3 DMDSC 库恢复
重做 REDO 日志恢复时,需要重做所有节点上的 REDO 日志,因此需要提供各个节点的归档日志
3.4 还原与恢复附加项
3.4.1 解密与解压缩
DM 还原时的解密过程主要包括:
- 检查用户输入的密码和算法是否与备份集中记录的加密信息一致;
- 从备份集读取数据之后,写到目标文件(包括目标数据文件和临时归档文件)之前执行解密操作
3.4.2 并行还原
在还原时默认采用并行方式还原,并行度上限为备份时指定的并行数,实际并行度由 DMAP 最终创建成功的并行子任务数决定。目前,非并行备份生成的备份集,不支持以并行方式还原
更多达梦技术资讯,请访问达梦技术社区:https://eco.dameng.com/

550

被折叠的 条评论
为什么被折叠?



