1.概述

1.1 基本原理

DM 备份的本质是从数据库文件中拷贝有效的数据页保存到备份集中,有效数据页包括数据文件的描述页和被分配使用的数据页。

在备份的过程中,如果数据库系统还在继续运行,这期间的数据库操作并不是都会立即体现到数据文件中,而是首先以日志的形式写到归档日志中,因此,为了保证用户可以通过备份集将数据恢复到备份结束时间点的状态,就需要将备份过程中产生的归档日志也保存到备份集中。

还原与恢复是备份的逆过程。还原是将备份集中的有效数据页重新写入目标数据文件的过程。恢复则是指通过重做归档日志,将数据库状态恢复到备份结束时的状态;也可以恢复到指定时间点和指定 LSN。恢复结束以后,数据库中可能存在处于未提交状态的活动事务,这些活动事务在恢复结束后的第一次数据库系统启动时,会由 DM 数据库自动进行回滚。

以下是备份、还原与恢复的关系图:

1.2 支持与配置

DIsql 工具用于执行联机的数据备份与数据还原,包括数据库备份、归档备份、表空间备份与还原、表备份与还原;

DMRMAN 工具用于执行脱机的数据备份、还原与恢复,包括脱机的数据库备份、还原与恢复,脱机还原表空间,归档的备份、还原与修复;

客户端工具 MANAGER 和 CONSOLE 对应命令行工具 DIsql 和 DMRMAN 的功能,分别用于联机和脱机备份还原数据。

这四种工具都可以独立使用,也可以相互配合,如使用 DIsql 或 MANAGER 工具联机备份的数据库备份文件可以用 DMRMAN 或 CONSOLE 工具还原。

备份

还原

命令行工具

客户端工具

DISQL

MANAGER(DM管理工具)

DMRMAN

CONSOLE (DM控制台工具)

不同状态下支持的备份还原操作:

注意:

无论管理员选用哪一种备份方式,都要注意不应将备份产生的备份集与源备份库存放在同一磁盘或同一存储介质上,以避免存储介质发生硬件故障时,源备份库与备份集同时被毁坏。

备份与还原时,指定的备份集名称和目录名中最好不要包含中文、空格以及特殊字符,否则可能会因为字符处理及字符集问题导致一些不可预期的问题。

1.3 归档配置

1.3.1 概述

DM 数据库可以运行在归档模式或非归档模式下。如果是归档模式,联机日志文件中的内容保存到硬盘中,形成归档日志文件;如果是非归档模式,则不会形成归档日志。

DM 的 dmarch.ini 可以进行归档配置,dmarch.ini 生效的前提是 dm.ini 中的参数 ARCH_INI 设置为 1。

查询dm.ini中的ARCH_INI参数:

(1) 命令查询:cat /dmdata/data/DMTEST/dm.ini | grep ARCH_INI

(2) 查询 v$dm_arch_ini、v$arch_status 等动态视图可以获取归档配置以及归档状态等相关信息。

dmarch.ini 中与备份还原相关的配置参数及其介绍:

配置项

配置含义

[ARCH_NAME]

REDO 日志归档名

ARCH_TYPE

REDO 日志归档类型,LOCAL 表示本地归档,REMOTE 表示远程

ARCH_DEST

REDO 日志归档目标,LOCAL 对应归档文件存放路径;REMOTE 对应远程目标节点实例名

ARCH_FILE_SIZE

单个 REDO 日志归档文件大小,取值范围 64~2048,单位 MB,缺省值为 1024MB,即 1GB

ARCH_SPACE_LIMIT

REDO 日志归档空间限制,当所有本地归档文件达到限制值时,系统自动删除最老的归档文件。0 表示无空间限制,取值范围 1024~2147483647,单位 MB,缺省值为 0

ARCH_FLUSH_BUF_SIZE

归档合并刷盘缓存大小,取值范围 0~128,单位 MB,缺省值为 2,0 表示不使用归档合并刷盘

ARCH_HANG_FLAG

本地归档写入失败时系统是否挂起。取值 0 或 1。0 不挂起;1 挂起。缺省为 1。第一路本地归档系统内固定设为 1,设 0 实际也不起作用

ARCH_INCOMING_PATH

仅 REMOTE 归档有效,表示远程节点的本地归档日志文件存放路径

1.3.2 联机配置归档

联机配置归档的步骤如下:

(1) 修改数据库为 MOUNT 状态 NORMAL 模式,并开启归档模式;

(2) 增加、修改或删除归档;

(3) 修改数据库为 OPEN 状态。

alter database mount;
alter database archivelog;
alter database add archivelog 'DEST=/dmdata/arch,type=local,file_size=2048,space_limit=102400';
alter database open;

1.3.3 手动配置归档

手动配置归档即在数据库实例未启动的情况下,手动编写 dmarch.ini 文件和设置参数 ARCH_INI。

1.3.3.1 本地归档:

(1) 手动编辑 dmarch.ini 文件,之后保存在 dm.ini 所在的目录;

(2) 编辑 dm.ini 文件,设置参数 ARCH_INI=1,保存;

(3) 启动数据库实例,数据库已运行于归档模式。

1.3.3.2 远程归档:

与本地归档一样,远程归档也是配置在 dmarch.ini 文件中,配置步骤参考本地归档。

一般建议 DMDSC 集群中的节点,在配置本地归档之外,再交叉配置集群中所有其他节点的远程归档。

下面以两节点 DMDSC 集群为例,说明如何编辑 dmarch.ini 文件以配置远程归档,DSC0 和 DSC1 是 DMDSC 集群中的两个实例,交叉进行 REMOTE 归档配置:

例 1: DSC0 实例的 dmarch.ini 配置:

[ARCHIVE_LOCAL1]
  ARCH_TYPE      	 = LOCAL
  ARCH_DEST     	 = +DMDATA/dameng/arch_dsc0
  ARCH_FILE_SIZE	 = 128
  ARCH_SPACE_LIMIT  = 0
  ARCH_HANG_FLAG	= 1
[ARCH_REMOTE1]
  ARCH_TYPE      	= REMOTE
  ARCH_DEST      	= DSC1
  ARCH_INCOMING_PATH = +DMDATA/dameng/arch_dsc1

例 2: DSC1 实例的 dmarch.ini 配置:

[ARCHIVE_LOCAL1]
  ARCH_TYPE     	 = LOCAL 
  ARCH_DEST     	 = +DMDATA/dameng/arch_dsc1
  ARCH_FILE_SIZE	 = 128
  ARCH_SPACE_LIMIT   = 0 
  ARCH_HANG_FLAG     = 1
[ARCH_REMOTE1]
  ARCH_TYPE     	 = REMOTE
  ARCH_DEST     	 = DSC0
  ARCH_INCOMING_PATH = +DMDATA/dameng/arch_dsc0

2.使用联机执行 SQL 语句进行备份还原

使用 DIsql 工具实现数据文件的备份、管理及还原。

备份分类

联机备份

脱机备份

库备份

表空间备份

表备份

归档日志备份

还原分类

联机还原

脱机还原

库还原

表空间还原

表还原

归档日志还原

2.1 概述

联机方式支持数据库、用户表空间、用户表和归档的备份以及用户表的还原。

在进行联机库级备份、归档备份和表空间备份时,必须保证系统处于归档模式,否则联机备份不能进行。

DM 备份还原在执行联机操作时,语句的解析执行使用的是 DM 服务器的编码方式,而文件操作使用操作系统的编码方式。因此,当 DM 建库参数的编码方式与操作系统编码方式不一致时,使用中文文件名或路径名等可能造成控制台打印信息和日志文件中的信息的中文部分显示乱码。

2.2 数据备份

数据备份常用语法参数:

BACKUP DATABASE:表示数据库备份。

BACKUP TABLESPACE:表示表空间备份。

BACKUP TABLE:表示表备份。

BACKUP ARCHIVELOG:表示归档备份。

BACKUPSET:为可选参数,指定当前备份集生成目录。如果此参数仅指定备份集名称即指定为相对路径,备份集会生成到默认的备份路径下。如果仅指定该关键字,不指定目标备份集目录,那么将会在数据库的默认备份目录下自动生成备份集。

WITH BACKUPDIR:用来指定基备份集的搜索目录。

COMPRESSED LEVEL:是否对备份数据进行压缩处理。LEVEL 表示压缩等级,取值范围 0~9:0 表示不压缩;1 表示 1 级压缩;9 表示 9 级压缩。压缩级别越高,压缩速度越慢,但压缩比越高。若指定 COMPRESSED,但未指定 LEVEL,则压缩等级默认 1。

IDENTIFIED BY:指定备份时的加密密码。密码可以用双引号括起来,这样可以避免一些特殊字符通不过语法检测。密码的设置规则遵从 INI 参数 PWD_POLICY 和 PWD_MIN_LEN 指定的口令策略。

WITH ENCRYPTION:指定加密类型,取值范围 0、1、2。0 表示不加密,不对备份文件进行加密处理;1 表示简单加密,对备份文件设置口令,但文件内容仍以明文方式存储;2 表示完全数据加密,对备份文件进行完全的加密,备份文件以密文方式存储。缺省值为 1,当不指定 WITH ENCRYPTION 子句时,采用简单加密。

ENCRYPT WITH:指定加密算法。当不指定 ENCRYPT WITH 子句时,使用 AES256_CFB 加密算法。

BACKUPINFO:备份的描述信息。

2.2.1 数据库备份(BACKUP DATABASE)

执行数据库备份,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行数据库备份。

备份类型:分为完全备份 FULL 和增量备份 INCREMENT 两种。缺省为 FULL。

(1) 完全备份

最简单的数据库完全备份语句,备份路径默认在数据库实例路径的bak目录:

BACKUP DATABASE FULL BACKUPSET 'DB_BAK_20250918_01';

备份集用来存放备份过程中产生的备份数据及备份信息。一个备份集对应了一次完整的备份,备份集包含一个或多个备份片文件,以及一个备份元数据文件。下面是数据库完全备份生成的备份集目录:

备份片文件后缀为.bak,用来存放备份数据。备份时,目标数据文件内容或归档日志内容经过处理后,都会存放到备份片文件中。

元数据文件用来存放备份信息,元数据文件的后缀为.meta。通过元数据文件,可以了解整个备份集信息

(2) 增量备份

增量备份指基于指定的库(或者表空间)的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改的数据页。执行增量备份的主要目的是快速备份数据库中的修改,减少备份时间和避免重复的备份。

BACKUP DATABASE INCREMENT WITH BACKUPDIR '/dmdata/data/DMDBS/bak/DB_BAK_20250918_01' BACKUPSET '/dmdata/data/DMDBS/bak/db_increment_bak_20250918_02';

增量备份语句中的 INCREMENT 参数不可省略。

若要创建累积增量备份,还需要指定 CUMULATIVE 参数,否则缺省为差异增量备份。

WITH BACKUPDIR 参数用来指定基备份集的搜索目录。

BASE ON BACKUPSET 参数用于增量备份中,用来指定基备份集路径。

如果不指定该参数,会在备份搜索目录中搜索最近一次的完全备份或增量备份作为这次增量备份的基备份。若需要在特定的备份集基础上执行增量备份就需要使用该参数。

根据对基备份的要求不同,DM 的增量备份分为以下两种:

(1) 差异增量备份

差异增量备份的基备份既可以是一个完全备份集,也可以是一个增量备份集。

利用增量备份进行还原操作时,要求其基备份必须是完整的;如果差异增量备份的基备份本身也是一个增量备份,那么同样要求其基备份是完整的;任何一个增量备份,最终都是以一个完全备份作为其基备份。因此,完全备份是增量备份的基础。

(2) 累积增量备份

累积增量备份的基备份只能是完全备份集,而不能是增量备份集。

增量备份的基备份集既可以是脱机备份生成的,也可以是联机备份生成的,脱机增量备份的基备份集可以是联机备份生成的,联机增量备份的基备份集也可以是脱机备份生成的。

2.2.2 表空间备份(BACKUP TABLESPACE)

在 disql 工具中使用 BACKUP 语句也可以备份单个表空间。执行表空间备份数据库实例必须运行在归档模式下。

BACKUP TABLESPACE MAIN BACKUPSET 'ts_bak_01';

增量备份指定基备份集路径:

BASE ON BACKUPSET 参数用于增量备份中,用来指定基备份集路径。

如果不指定该参数,会在备份搜索目录中搜索最近一次的完全备份或增量备份作为这次增量备份的基备份。若需要在特定的备份集基础上执行增量备份就需要使用该参数。

-- 全量备份表空间
BACKUP TABLESPACE MAIN BACKUPSET 'ts_full_bak_01';
-- 未指定备份集,基于最近一次全量表空间备份来增量备份表空间
BACKUP TABLESPACE MAIN INCREMENT BACKUPSET 'ts_increment_bak_01';
-- 指定备份集“ts_full_bak_01”增量备份表空间
BACKUP TABLESPACE MAIN INCREMENT BASE ON BACKUPSET 'ts_full_bak_01' BACKUPSET 'ts_increment_bak_02';

2.2.3 表备份(BACKUP TABLE)

备份表不需要服务器配置归档,表备份均为联机完全备份,不需要备份归档日志。表备份和归档备份不支持增量备份。

BACKUP TABLE TEST BACKUPSET 'tab_bak_01';

2.2.4 归档备份(BACKUP ARCHIVELOG)

归档备份的前提:

(1) 归档文件的 db_magic、permanent_magic 值和库的 db_magic、permanent_magic 值必须一样;

(2) 服务器必须配置归档;

(3) 归档日志必须连续,如果出现不连续的情况,前面的连续部分会忽略,仅备份最新的连续部分。如果备份时未收集到指定范围内的归档,则直接报错。

联机备份的时候经常会切换归档文件,最后一个归档总是空的,所以最后一个归档不会被备份。

归档备份拷贝指定归档目录下的所有的归档文件到备份集中,并记录各个归档文件的属性、文件大小以及 LSN 区间等。归档备份不存在增量备份之说。当需要保存库的归档时,可以使用归档备份。

归档备份最简单的语句:

BACKUP ARCHIVE LOG ALL BACKUPSET 'arch_bak_01';

备份归档日志,也可以通过 LSN BETWEEN ... AND ...来指定起始和截至 LSN。

-- 通过动态视图V$ARCH_FILE确定 LSN 范围:

select ARCH_LSN, CLSN, PATH from V$ARCH_FILE;

-- 指定LSN范围即可进行归档备份
BACKUP ARCHIVELOG LSN BETWEEN 45920 AND 46245 BACKUPSET '/dmdata/data/DMDBS/bak/arch_bak_time_20-45';

2.3 管理备份

(1) 备份管理相关系统过程与函数总结如下:

SF_BAKSET_BACKUP_DIR_ADD:添加备份目录。
SF_BAKSET_BACKUP_DIR_REMOVE:删除内存中指定的备份目录。
SF_BAKSET_BACKUP_DIR_REMOVE_ALL:删除内存中全部的备份目录。
SF_BAKSET_CHECK:对备份集进行校验。
SF_BAKSET_REMOVE:删除指定设备类型和指定备份集目录的备份集。
SF_BAKSET_REMOVE_BATCH:批量删除满足指定条件的所有备份集。
SF_BAKSET_REMOVE_BATCH_S:批量安全删除满足指定条件的所有库级备份集。
SF_BAKSET_REMOVE_BATCH_N:批量删除满足指定条件的所有备份集,并保留用户指定个数的库级完全备份集。
SP_DB_BAKSET_REMOVE_BATCH:批量删除指定时间之前的数据库备份集。
SP_TS_BAKSET_REMOVE_BATCH:批量删除指定表空间对象及指定时间之前的表空间备份集。
SP_TAB_BAKSET_REMOVE_BATCH:批量删除指定表对象及指定时间之前的表备份集。
SP_ARCH_BAKSET_REMOVE_BATCH:批量删除指定条件的归档备份集。

(2) 备份管理相关动态视图总结如下:

V$BACKUPSET:显示备份集基本信息。
V$BACKUPSET_DBINFO:显示备份集的数据库相关信息。
V$BACKUPSET_DBF:显示备份集中数据文件的相关信息。
V$BACKUPSET_ARCH:显示备份集的归档信息。
V$BACKUPSET_BKP:显示备份集的备份片信息。
V$BACKUPSET_SEARCH_DIRS:显示备份集搜索目录。
V$BACKUPSET_TABLE:显示表备份集中备份表信息。
V$BACKUPSET_SUBS:显示并行备份中生成的子备份集信息。
V$BACKUP_MONITOR:显示当前备份任务实时监控信息。
V$BACKUP_HISTORY:显示最近 100 条备份监控信息。
V$BACKUP_FILES:显示当前备份任务待备份数据文件列表。

2.4 数据还原

还原是备份的逆过程,就是从备份集中读取数据页,并将数据页写入到目标数据库对应数据文件相应位置的过程。

联机还原指数据库处于运行状态时,通过 SQL 语句执行还原操作。表还原可以在联机状态下执行,库还原和表空间必须脱机执行。

数据还原常用语法参数:

RESTORE TABLE:表示表还原。

BACKUPSET:表备份时指定的备份集路径。若指定为相对路径,会在默认数据库备份目录下搜索备份集。

BACKUPNAME:表备份时指定的备份名称,在备份集搜索目录下搜索备份集。

IDENTIFIED BY:加密备份表时,用户设置的加密密码。密码可以用双引号括起来,这样可以避免一些特殊字符通不过语法检测。密码的设置规则遵从 INI 参数 PWD_POLICY 和 PWD_MIN_LEN 指定的口令策略。

ENCRYPT WITH:加密备份表时,用户设置的加密算法。当不指定 ENCRYPT WITH 子句时,默认为 AES256_CFB 加密算法。

STRUCT:执行表结构还原,若未指定,则认为是表中数据还原;表数据还原要求还原目标表结构与备份集中完全一致,否则报错,所以表结构还原可以在表数据还原之前执行,减少报错。

2.4.1 表还原(RESTORE TABLE)

表还原之后不需要恢复操作。Disql 中输入以下简单的 RESTORE 语句就可还原表:

RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01';

表还原实质是表内数据的还原,以及索引和约束等的重建。表还原可分为带索引或约束以及不带索引或者约束的不同还原情况,不同情况下的完整的表备份还原步骤如下:

情况一:表中未包含索引的还原:

-- 表中未包含索引的备份还原
-- 1.保证数据库为 OPEN 状态;
-- 2.创建待备份的表;
CREATE TABLE TAB_FOR_RES_01(C1 INT);
-- 3.备份表数据;
BACKUP TABLE TAB_FOR_RES_01 BACKUPNAME TABLE_BAK_01 BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_01';
-- 4.校验备份,此步骤为可选;
SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DMDBS/bak/tab_bak_for_res_01');
-- 5.还原表数据
-- (1) 指定备份集路径进行还原:
RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_01';
-- (2) 指定备份名称进行还原:
RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPNAME TABLE_BAK_01;

情况二:表中包含索引的还原:

-- 表中包含索引的备份还原
-- 1.保证数据库为 OPEN 状态;
-- 2.创建待备份的表;
CREATE TABLE TAB_FOR_RES_02(C1 INT);
-- 3.创建索引;
CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
-- 4.备份表;
BACKUP TABLE TAB_FOR_RES_02 BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';
-- 5.校验备份,此步骤为可选;
SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DMDBS/bak/tab_bak_for_res_02');
-- 6. 执行表结构还原,表备份和目标表中都包含索引,如果直接执行表数据还原会报错:还原表中存在二级索引或冗余约束;
RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';
-- 7.执行表数据还原。
RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';

情况三:指定还原时不重建索引

-- 指定还原时不重建索引
-- 表备份时会默认备份表中的索引,还原时使用 RESTORE TABLE...WITHOUT INDEX...语句可选择不还原索引。
-- 1.保证数据库为 OPEN 状态;
-- 2.准备数据,创建待备份的表及索引;
CREATE TABLE tab_for_idx(c1 INT);
CREATE INDEX i_tab_for_idx ON tab_for_idx (c1);
INSERT INTO tab_for_idx VALUES(1);
INSERT INTO tab_for_idx VALUES(2);
INSERT INTO tab_for_idx VALUES(3);
INSERT INTO tab_for_idx VALUES(4);
INSERT INTO tab_for_idx VALUES(5);

-- 3.备份表数据;
BACKUP TABLE tab_for_idx BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_01';
-- 4.校验备份,此步骤为可选;
SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DMDBS/bak/tab_bak_for_res_01');
-- 5.准备还原表;
CREATE TABLE tab_for_res_idx(c1 INT);
-- 6.还原表数据,但不重建索引。
RESTORE TABLE tab_for_res_idx WITHOUT INDEX FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_01';

情况四:指定还原时不重建约束

-- 指定还原时不重建约束
-- 表备份时会默认备份表中的约束定义,还原时使用 RESTORE TABLE...WITHOUT CONSTRAINT...语句可选择还原时不重建约束。要求还原表上不能存在任何约束,否则执行还原时将报错。
-- 1.保证数据库为 OPEN 状态;
-- 2.准备数据,创建待备份的表及约束;
CREATE TABLE tab_for_cons(c1 INT, c2 INT CHECK(c2<10));
INSERT INTO tab_for_cons VALUES(1,1);
INSERT INTO tab_for_cons VALUES(2,2);
INSERT INTO tab_for_cons VALUES(3,3);
INSERT INTO tab_for_cons VALUES(4,4);
INSERT INTO tab_for_cons VALUES(5,5);

-- 3.备份表数据;
BACKUP TABLE tab_for_cons BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';
-- 4.校验备份,此步骤为可选;
SELECT SF_BAKSET_CHECK('DISK','/dmdata/data/DMDBS/bak/tab_bak_for_res_02');
-- 5.准备还原表,该表上不能存在任何约束;
CREATE TABLE TAB_FOR_RES_CONS(C1 INT, C2 INT);
-- 6.还原表数据,但不还原约束。
RESTORE TABLE tab_for_res_cons WITHOUT CONSTRAINT FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';

-- 如果直接将备份表作为还原表,由于备份表上存在约束,因此需要首先使用 RESTORE TABLE...STRUCT WITHOUT CONSTRAINT...语句还原备份表的表结构,去除表中约束后才能以不重建约束的方式还原表数据:
-- 1.首先还原表结构,不还原约束。
RESTORE TABLE tab_for_cons STRUCT WITHOUT CONSTRAINT FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';
-- 2.还原表数据,不还原约束。
RESTORE TABLE tab_for_cons WITHOUT CONSTRAINT FROM BACKUPSET '/dmdata/data/DMDBS/bak/tab_bak_for_res_02';

3.使用脱机工具 DMRMAN 进行备份还原

3.1 概述

DMRMAN 客户端:

DMRMAN 是 DM 提供的命令行工具,无需额外安装,用来执行数据库的备份还原操作。DMRMAN 客户端是一个命令行工具,命令行的好处是管理员可以编写复杂的脚本,将 DMRMAN 和操作系统的任务调度结合起来可以实现备份的自动化。

备份集:

利用 DMRMAN 工具可以将数据库中的一个或多个数据文件、数据库信息等备份到一个称为“备份集”的逻辑结构中,备份集的格式是特定的,只能由 DMRMAN 创建和访问。

一个备份集中会包含一个或多个二进制文件,该二进制文件被称为备份片。备份数据库会产生一个备份集,该备份集可能包含一个或者多个备份片。备份片的个数由数据库中数据文件的大小和文件系统对文件大小的限制共同决定。如果备份的数据文件大小超过了文件系统对文件大小的限制就会产生多个备份片。

3.2 DMRMAN配置与启动

3.2.1 DMRMAN启动与退出

在数据库安装路径的bin目录下,可以启动DMRMAN命令行工具:

cd /home/dmdba/dmdbms/bin

./dmrman

启动后控制台中输入 exit 命令即可退出 DMRMAN 环境:

RMAN> exit

3.2.2 DMRMAN参数配置

参数

含义

备注

CTLFILE

指定执行语句所在的文件路径,不能和 CTLSTMT 同时使用。脚本文件格式支持*.txt

可选参数

CTLSTMT

指定待执行语句,不能和 CTLFILE 同时使用。如:CTLSTMT="BACKUP DATABASE '/home/dmdbms/data/DAMENG/dm.ini'"

可选参数

DCR_INI

指定 dmdcr.ini 路径,用于 ASM 存储时访问 ASM 服务;若未指定,则认为不存在 ASM 存储。可单独使用,也可与其他参数配合使用。主要用于 DMDSC 环境

可选参数

USE_AP

指定备份还原执行策略。取值 1、2。默认为 1。 1:使用 dmap 辅助进程方式执行备份还原;执行备份还原时要求先启动 dmap 服务。 2:无辅助进程方式,由 dmrman 进程自身完成备份还原,不依赖 dmap 服务;配置成 2 的情况下,不能执行第三方备份(即指定 DEVICE TYPE 为 TAPE)。

可选参数

AP_PORT

使用 DMAP 备份还原时 DMAP 的端口号,dmap 的监听端口,监听方配置此参数,取值范围 1024~65534,默认为 4236,发起连接端的端口在 1024-65535 之间随机分配

可选参数

DMAP_INI

指定 dmap.ini 路径,用于配置使用 dmrman 执行脱机备份还原操作生成的 dmrman、BAKRES 日志的日志切换参数。dmap.ini 可配置参数详见《DM8_SQL 语言使用手册》。 需要注意的是,dmap.ini 中配置的 AP_PORT 不更改 dmrman 连接 dmap 的端口号,以指定的 AP_PORT 为准。

可选参数

HELP

打印帮助信息

可选参数

3.3 数据备份

3.3.1 数据库备份

在 DMRMAN 工具中使用 BACKUP 命令可以备份整个数据库。

使用 DMRMAN 脱机备份数据库需要关闭数据库实例。

若是正常退出的数据库,则脱机备份前不需要配置归档;若是故障退出的数据库,则备份前,需先进行归档修复。

(1) 完全备份

-- 完全备份
-- 1.保证数据库处于脱机状态;
-- 2.启动 DMRMAN 命令行工具;
-- 3.DMRMAN 中输入以下命令:
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL BACKUPSET '/home/dm_bak/db_full_bak_01';

(2) 增量备份

增量备份指基于指定的库的某个备份(完全备份或者增量备份),备份自该备份以来所有发生修改了的数据页。

脱机增量备份要求两次备份之间数据库必须有操作,否则备份会报错。

-- 增量备份
-- 1.保证数据库处于脱机状态;
-- 2.启动 DMRMAN 命令行工具;
-- 3.DMRMAN 中输入以下命令:
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR '/home/dm_bak'BACKUPSET '/home/dm_bak/db_increment_bak_02';

3.3.2 归档备份

执行归档备份要求数据库处于脱机状态。与联机归档备份一样,脱机归档备份需要配置归档。

(1) 完全归档备份

-- 脱机归档备份
-- 1.配置归档;
-- 2.保证数据库处于脱机状态;
-- 3.启动 DMRMAN 命令行工具;
-- 4.DMRMAN 中输入以下命令:
RMAN>BACKUP ARCHIVE LOG ALL DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET '/home/dm_bak/arch_all_bak_01';

(2) 指定条件归档备份

设置条件的归档备份指通过设置 LSN 或者时间点,控制需要备份归档的范围。

-- 1.配置归档;
-- 2.保证数据库处于脱机状态;
-- 3.启动 DMRMAN 命令行工具;
-- 4.DMRMAN 中输入以下命令:
-- 命令中的 LSN BETWEEN start AND end 表示备份 LSN 值在 start 与 end 之间的归档,也可以设置 FROM LSN(TIME)或 UNTIL LSN(TIME)。
RMAN>BACKUP ARCHIVE LOG LSN BETWEEN 50000 AND 120000 DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET '/home/dm_bak/arch_lsn_bak_02';

3.4 数据还原

3.4.1 数据库还原

数据库的还原包括数据库配置文件还原和数据文件还原,目前可能需要还原的数据库配置文件包括 dm.ini、dm.ctl、服务器秘钥文件(dm_service.prikey 或者 dm_external.config,若备份库指定 usbkey 加密,则无秘钥文件)、联机日志文件。

通过 RESTORE 命令还原数据库,还原后的数据库不可用,需进一步执行 RECOVER 命令,将数据库恢复到备份结束时的状态。

数据库备份集分为联机和脱机两种类型。通常情况下,用户会在联机状态下备份数据库,

(1) 使用 DMRMAN 执行数据库还原:

-- 数据库还原
-- 联机数据库备份后 使用 DMRMAN 执行数据库还原
-- 1.联机备份数据库,保证数据库运行在归档模式及 OPEN 状态;
SQL>BACKUP DATABASE BACKUPNAME DB_FULL_BAK_01 BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

-- 2.准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始化一个新库。
-- 注意:如果还原目标库与故障库是同一个,建议先执行故障库的归档修复操作。

./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE sysdba_pwd=DMdba_123 sysauditor_pwd=DMauditor_123

-- 3.校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

-- 4.还原数据库。
-- 直接指定还原目标库的 dm.ini 进行数据库还原
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore';
-- 指定 REUSE DMINI 子句进行数据库还原,此时会将备份集中备份的 dm.ini 中除路径相关的 INI 参数外,均拷贝到当前 dm.ini 上
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' REUSE DMINI FROM BACKUPSET '/home/dm_bak/db_full_bak_for_restore';
-- 指定备份名进行数据库还原
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPNAME DB_FULL_BAK_01;

(2) 数据库恢复

使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使用本地归档日志的恢复工作。

如果还原后,不需要重做日志,数据就已经处于一致性状态了(例如正常关闭库的脱机备份还原),则可以跳过恢复一致性步骤,直接进入数据库更新阶段。

数据库恢复是指重做 REDO 日志,有两种方式:

从备份集恢复,即重做备份集中的 REDO 日志;

从归档恢复,即重做归档中的 REDO 日志。

由于日志重做过程中,修改好的数据页首先存入缓冲区,缓冲区分批次将修改好的数据页写入磁盘,如果在此过程中发生异常中断,可能导致缓冲区中的数据页无法写入磁盘,造成数据的不一致,数据库启动时校验失败,所以数据库恢复过程中不允许异常中断。

数据库恢复后,还需要执行数据库更新操作,将数据库调整为可正常工作的库才算完成。

恢复一致性:

从备份集恢复:

-- 从备份集恢复
-- 如果备份集在备份过程中生成了日志,且这些日志在备份集中有完整备份(如联机数据库备份),在执行数据库还原后,可以重做备份集中备份的日志,将数据库恢复到备份时的状态,即从备份集恢复。
-- 1.启动 DIsql 联机备份数据库;
BACKUP DATABASE BACKUPNAME DB_FULL_BAK_01 BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

-- 2.准备目标库,可以使用备份库,也可以重新生成库;
./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1 sysdba_pwd=DMdba_123 sysauditor_pwd=DMauditor_123

-- 3.启动 RMAN,校验备份;
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

-- 4.还原数据库;
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';

-- 5.恢复数据库
-- 指定备份集路径进行恢复
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_backupset';
-- 指定备份名称进行恢复
RMAN> RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPNAME DB_FULL_BAK_01;

从归档恢复:

-- 从归档恢复
-- 从归档恢复是利用重做本地归档日志来恢复数据的过程。从归档恢复允许恢复到指定的时间点及指定的 LSN 值。若同时指定了时间点和 LSN,则以较早的为结束点。
-- 执行过从备份集还原,或者执行过从备份集还原恢复的库可以使用从归档进行恢复。此时本地归档日志属于生成备份集的源库,本地归档日志的 DB_MAGIC 与备份集中记录的 DB_MAGIC 值相同。
-- 1.查看动态视图V$RLOG中的CKPT_LSN列,得出当前检查点LSN。
select CKPT_LSN from V$RLOG;

-- 2.启动 DIsql 联机备份数据库,以及备份从检查点开始的本地归档日志;
BACKUP ARCHIVELOG FROM LSN 421401 BACKUPSET '/home/dm_bak/arch_bak_lsn_421401';

BACKUP DATABASE BACKUPSET '/home/dm_bak/db_full_bak_for_recover_arch';

-- 3.准备目标库,可以使用备份库,也可以重新生成库;
-- 如果使用原备份库,且备份库故障,需要先执行目标库归档修复:
RMAN>REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini';
-- 如果使用新生成的库,生成之后需要先重启一下数据库实例,才可以被还原。重新生成的库不需要执行归档修复(REPAIR)操作。重新生成库:
./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1 sysdba_pwd=DMdba_123 sysauditor_pwd=DMauditor_123

-- 4.启动 RMAN,校验备份;
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_recover_arch';

-- 5.还原数据库;
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_arch';

-- 6.查看备份集的数据库信息,获取源库的 DB_MAGIC;
-- 若还原后,立即执行恢复,可以不用获取源库DB_MAGIC。因为DMRMAN执行库级备份集还原后,会将备份集中的DB_MAGIC刷入还原后的库中。
RMAN> SHOW BACKUPSET '/home/dm_bak/db_full_bak_for_recover_arch' INFO DB;

-- 7.利用归档恢复数据库。由步骤 6 显示的备份集信息可知,源库的 DB_MAGIC 值为 1447060265;
-- 若还原后,立即执行恢复,可以不用指定DB_MAGIC。
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' WITH ARCHIVEDIR'/home/dm_arch/arch' USE DB_MAGIC 1447060265;

数据库更新(更新 DB_MAGIC):

数据库更新是指更新数据库的 DB_MAGIC,并将数据库调整为可正常工作状态,与数据库恢复一样使用 RECOVER 命令完成。

数据库更新发生在重做 REDO 日志恢复数据库后,或者目标库不需要执行重做日志已经处于一致状态的情况。

-- 更新 DB_MAGIC:以使用正常退出数据库的脱机备份的备份集还原为完整示例
-- 1.启动 DMRMAN 备份数据库,保证数据库处于正常退出的脱机状态;
RMAN>BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' BACKUPSET '/home/dm_bak/db_full_bak_for_recover_dbmagic';

-- 2.准备目标库,可以使用备份库,也可以重新生成库或者直接指定目录还原;
-- 重新生成库
./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1 sysdba_pwd=DMdba_123 sysauditor_pwd=DMauditor_123

-- 3.校验备份;
RMAN>CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_recover_dbmagic';

-- 4.还原数据库;
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_dbmagic';

-- 5.恢复数据库;
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM BACKUPSET '/home/dm_bak/db_full_bak_for_recover_dbmagic';

-- 6.更新数据库
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' UPDATE DB_MAGIC;

3.4.2 表空间还原

脱机表空间还原仅涉及表空间数据文件的重建与数据页的拷贝。不需要事先置目标表空间为 OFFLINE 状态。

(1) 表空间还原

-- 表空间还原
-- 以联机表空间备份集为例,展示 DMRMAN 如何完成表空间的还原:
-- 1.联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
BACKUP TABLESPACE MAIN BACKUPNAME TS_FULL_BAK_01 BACKUPSET '/home/dm_bak/ts_full_bak_for_restore';

-- 2.校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN>CHECK BACKUPSET '/home/dm_bak/ts_full_bak_for_restore';

-- 3.还原表空间。需要注意,表空间还原的目标库只能是备份集产生的源库,否则将报错。
-- 指定备份集路径进行还原:
RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE MAIN FROM BACKUPSET  '/home/dm_bak/ts_full_bak_for_restore';
-- 指定备份名称进行还原:
RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' TABLESPACE MAIN FROM BACKUPNAME TS_FULL_BAK_01;

(2) 表空间恢复

表空间恢复通过重做 REDO 日志,以将数据更新到一致状态。

由于日志重做过程中,修改好的数据页首先存入缓冲区,缓冲区分批次将修改好的数据页写入磁盘,如果在此过程中发生异常中断,可能导致缓冲区中的数据页无法写入磁盘,造成数据的不一致,数据库启动时校验失败,所以表空间恢复过程中不允许异常中断。

-- 表空间恢复
-- 表空间恢复通过重做 REDO 日志,以将数据更新到一致状态。由于日志重做过程中,修改好的数据页首先存入缓冲区,缓冲区分批次将修改好的数据页写入磁盘,如果在此过程中发生异常中断,可能导致缓冲区中的数据页无法写入磁盘,造成数据的不一致,数据库启动时校验失败,所以表空间恢复过程中不允许异常中断。
-- 表空间恢复时指定LSN或时间戳,恢复完成后不能保证数据库数据的一致性,用户需保证恢复操作的正确性。
-- 以联机表空间备份为例,展示 DMRMAN 如何完成表空间的恢复:
-- 1.联机备份表空间,保证数据库运行在归档模式及 OPEN 状态;
BACKUP TABLESPACE MAIN BACKUPSET '/home/dm_bak/ts_full_bak_for_recover';

-- 2.校验备份,校验待还原备份集的合法性,此处使用脱机校验;
RMAN>CHECK BACKUPSET '/home/dm_bak/ts_full_bak_for_recover';

-- 3.还原表空间。启动 DMRMAN,输入以下命令:
RMAN>RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RECOVER/dm.ini' TABLESPACE MAIN FROM BACKUPSET '/home/dm_bak/ts_full_bak_for_recover';

-- 4.恢复表空间。启动 DMRMAN,输入以下命令:
RMAN>RECOVER DATABASE '/opt/dmdbms/data/DAMENG_FOR_RECOVER/dm.ini' TABLESPACE MAIN;

3.4.3 归档还原

使用 RESTORE 命令完成脱机还原归档操作,在还原语句中指定归档备份集。备份集可以是脱机归档备份集,也可以是联机归档备份集。

-- 归档还原
-- 1.联机备份归档,保证数据库运行在归档模式及 OPEN 状态;
BACKUP ARCHIVE LOG ALL BACKUPNAME ARCH_ALL_BAK_01 BACKUPSET '/home/dm_bak/arch_all_for_restore';
-- 2.校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此处使用脱机校验;
RMAN> CHECK BACKUPSET '/home/dm_bak/arch_all_for_restore';
-- 3.还原归档。启动 DMRMAN,设置 OVERWRITE 为 2,如果归档文件已存在,会报错。
-- 指定还原的目标归档日志目录:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO ARCHIVEDIR'/opt/dmdbms/data/DAMENG_FOR_RESTORE/arch_dest' OVERWRITE 2;
-- 指定还原目标库的 dm.ini 文件路径:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPSET '/home/dm_bak/arch_all_for_restore' TO DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2;
-- 指定备份名称进行还原:
RMAN> RESTORE ARCHIVE LOG FROM BACKUPNAME ARCH_ALL_BAK_01 TO DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' OVERWRITE 2;

3.4.4 归档修复

使用 REPAIR 命令完成指定数据库的归档修复,归档修复会对目标库 dmarch.ini 中配置的所有本地归档日志目录执行修复。

若目标库没有配置本地归档,则不执行修复。

执行修复时,目标库一定不能处于运行状态。

一般建议在数据库故障后,应立即执行归档修复,否则后续还原恢复将会导致联机日志中未刷入本地归档的 REDO 日志丢失,届时再利用本地归档恢复将无法恢复到故障前的最新状态。

-- 归档修复
-- 1.单机环境下,确保目标库已经停止工作后,执行归档修复;
RMAN> REPAIR ARCHIVELOG DATABASE '/opt/dmdbms/data/dm.ini';

达梦社区地址:https://eco.dameng.com/

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐