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