DM 仅支持表的联机还原,数据库、表空间和归档日志的还原必须通过脱机工具 DMRMAN 执行。

联机表还原

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

RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01';

执行表还原,数据库必须处于 OPEN 状态,MOUNT 和 SUSPEND 状态下不允许执行表还 原。表还原不需要配置归档,因为表还原是联机完全备份还原,所以不需要借助本地归档日 志进行恢复。完整的表备份还原步骤如下:

1) 保证数据库为 OPEN 状态;

2) 创建待备份的表;

CREATE TABLE TAB_FOR_RES_01(C1 INT);

3) 备份表数据;

BACKUP TABLE TAB_FOR_RES_01 BACKUPSET '/home/dm_bak/tab_bak_for_res_01';

4) 校验备份,此步骤为可选;

SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_01');

5) 还原表数据。

RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_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 '/home/dm_bak/tab_bak_for_res_02';

5) 校验备份,此步骤为可选;

SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_02');

6) 执行表结构还原,表备份和目标表中都包含索引,如果直接执行表数据还原会报错: 还原表中存在二级索引或冗余约束;

RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';

 7) 执行表数据还原。

RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';

当然也可以指定还原时不重建索引:

RESTORE TABLE TAB_FOR_RES_02 WITHOUT INDEX FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02'

也可以还原表数据,但不还原约束:

RESTORE TABLE TAB_FOR_RES_02 WITHOUT CONSTRAINT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';

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

DMRMAN 工具支持控制台输入命令、命令行设置参数两种操作方式。下面分别对这两种 操作方式进行介绍。

DMRMAN 控制台输入命令

当 DMRMAN 客户端已经启动且可以输入命令时会显示命令提示符。如下所示:

RMAN>

例如,输入以下用于执行的 DMRMAN 命令:

RMAN> HELP
RMAN> BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';

DMRMAN 控制台还可以执行脚本。如首先创建一个名为 cmd_file.txt 的文件,文件 中包含“BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini'”命令,保存到 /home/dm_cmd 目录下,则该文件的执行方式如下:

RMAN> `/home/dm_cmd/cmd_file.txt

DMRMAN 是按行解析命令,如果输入一行不完整的命令执行会报错,如一条完整的命令 分三行输入会导致报错,例如:

BACKUP 
DATABASE
'/opt/dmdbms/data/DAMENG/dm.ini';

DMRMAN 命令行设置参数执行

命令行指定脚本执行,要求我们先创建一个包含 DMRMAN 命令的文件,然后设置 CTLFILE 参数,参数后面指定文件的路径。例如,创建一个名为 cmd_rman.txt 的文件, 保存到/home/dm_cmd 目录下,文件中包含一行如下所示的 DMRMAN 命令:

BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';

设置 CTLFILE 参数启动 DMRMAN 工具,指定脚本文件中的命令将被执行:

./dmrman CTLFILE=/home/dm_cmd/cmd_rman.txt

命令执行完后 DMRMAN 工具会自动退出。

命令行执行语句执行,是 DMRMAN 工具设置 CTLSTMT 参数,参数后面执行需要执行的 DMRMAN 命令,使用方法如下所示:

./dmrman CTLSTMT="BACKUP DATABASE'/opt/dmdbms/data/DAMENG/dm.ini';"

数据备份

创建完全备份

RMAN>  BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FULL BACKUPSET 
'/home/dm_bak/db_full_bak_01';

备份成功后会在或者默认备份目录下生成备份集。备份集中包括一个 备份元数据文件,后缀.meta,以及一个或多个备份片文件,后缀.bak。

在执行脱机数据库备份过程中,如果报错归档不完整,则需要检查库是不是异常退 出。如果库是异常退出,则需要先进行归档修复。

创建增量备份

RMAN> BACKUP DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' INCREMENT WITH BACKUPDIR 
'/home/dm_bak' BACKUPSET '/home/dm_bak/db_increment_bak_02';

数据库还原

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

数据库备份集分为联机和脱机两种类型。通常情况下,用户会在联机状态下备份数据库, 因此下面以联机数据库备份为例说明使用 DMRMAN 如何执行数据库还原操作。

1. 联机备份数据库,保证数据库运行在归档模式及 OPEN 状态;

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

2. 准备目标库。还原目标库可以是已经存在的数据库,也可使用 dminit 工具初始 化一个新库。如下所示:

./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE

3. 校验备份,校验待还原备份集的合法性。校验备份有两种方式,联机和脱机,此 处使用脱机校验;

RMAN> CHECK BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

4. 还原数据库。启动 DMRMAN,输入以下命令:

RMAN> RESTORE DATABASE '/opt/dmdbms/data/DAMENG_FOR_RESTORE/dm.ini' FROM 
BACKUPSET '/home/dm_bak/db_full_bak_for_restore';

数据库恢复

使用 RECOVER 命令完成数据库恢复工作,可以是基于备份集的恢复工作,也可以是使 用本地归档日志的恢复工作。如果还原后,数据已经处于一致性状态了,则可以使用更新 DB_MAGIC 方式恢复,前提是不需要重做日志。

从备份集恢复

1) 启动 DIsql 联机备份数据库;

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

2) 准备目标库,可以使用备份库,也可以重新生成库;

重新生成库操作如下:

./dminit path=/opt/dmdbms/data db_name=DAMENG_FOR_RESTORE auto_overwrite=1

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';