DM7仅支持表空间和表的联机还原,数据库和归档日志的还原必须通过脱机工具DMRMAN执行。下面主要介绍如何使用DIsql工具还原表空间和表。
下面将介绍使用DIsql工具完成基本的表还原操作及实施一些还原策略。主要内容包括:
1. 概述
2. 表还原
1. 概述
表还原与表空间还原不同,不需要配置归档,DIsql中输入以下简单的RESTORE语句就可还原表:
SQL>RESTORE TABLE TAB_01 FROM BACKUPSET 'tab_bak_01'; 语法如下: RESTORE TABLE [<表名>][STRUCT] [WITH INDEX | WITHOUT INDEX] [WITH CONSTRAINT|WITHOUT CONSTRAINT] FROM BACKUPSET'<备份集路径>' [DEVICE TYPE <介质类型> [PARMS '<介质参数>']] [IDENTIFIED BY <密码>] [ENCRYPT WITH <加密算法>] [TRACE FILE '<TRACE文件名>'] [TRACE LEVEL <TRACE日志级别>];
TABLE:需要还原的表名称。
STRUCT:执行表结构还原,若未指定,则认为是表中数据还原;表数据还原要求还原目标表结构与备份集中完全一致,否则报错,所以表结构还原可以在表数据还原之前执行,减少报错。
WITH INDEX/WITHOUT INDEX:指定还原数据后是否重建二级索引,默认重建。
WITH CONSTRAINT/WITHOUT CONSTRAINT:指定还原数据后是否重建约束,默认重建。
BACKUPSET:表空间备份时指定的备份集路径。若指定为相对路径,会在默认备份目录下搜索备份集。
DEVICE TYPE:指存储备份集的介质类型,目前表还原暂时仅支持DISK,表示备份集存储介质为磁盘。
PARMS:介质参数,只对介质类型为TAPE时有效。
IDENTIFIED BY:加密备份表时,用户设置的密码。
ENCRYPT WITH:加密算法。缺省情况下,算法为AES256_CFB。
TRACE FILE:指定生成的TRACE文件名。
TRACE LEVEL:有效值1、2,默认为1表示不启用TRACE,为2表示启用TRACE。
使用说明:
1. 仅支持对普通用户表进行还原,包括堆表。其中,系统表、临时表、物化视图表、物化视图附属表和日志表、特定模式(DBG_PKG/INFORMATION_SCHEMA/INFO_SCHEM/SYSREP/SYSGEO/SYSJOB/SYSCPT/SYS)下的表不支持还原。表列类型为对象类型的表也不支持表还原。若还原表中存在位图连接索引和位图连接虚索引也不支持还原。
2. 备份集路径指备份集所在目录,其中应包含完整备份数据,包括元数据文件(.meta)和备份片文件(.bak)。仅支持从表备份集中还原表。
3. 表名设置为可选参数。若指定,则表必须存在且表定义必须与备份表严格一致;若不指定,则使用备份集中记录的备份表作为还原目标表。
4. 若指定WITHOUT INDEX,则还原后目标表中无索引信息,即使目标表本来存在,也会被删除;若未指定,则在数据还原后重新创建备份集中索引,目标表原来的索引信息会被删除。
5. 若指定WITHOUT CONSTRAINT,则还原后目标表中无约束信息,聚集主键除外,即使目标表本来存在,也会被删除;若未指定,则在数据还原后重新创建备份集中约束,目标表原来的约束信息会被删除。
6. 目标表所在的表空间必须处于联机状态。
7. 数据守护环境下,主库允许表备份还原,备库不允许。
8. MOUNT和SUSPEND状态下不允许进行表还原。
9. MPP环境不允许进行表还原。
10. 若在语句中指定STRUCT关键字,则执行表结构还原。表结构还原会根据备份集中备份表还原要求,对目标表定义进行校验,并删除目标表中已存在的二级索引和约束;若未指定WITHOUT CONSTRAINT,则会将备份集中的CHECK约束在目标表上重建。
11. 不指定STRUCT关键字,则执行表数据还原,表数据还原默认仅会将备份表中聚集索引上数据进行还原。表数据还原默认仅会在目标表定义与备份表一致且不存在二级索引和约束的情况下执行;若还原时未指定WITHOUT CONSTRAINT,也允许目标表中存在与备份表中相同的CHECK约束。
12. 若在未指定STRUCT的情况下,执行还原出现存在二级索引或冗余约束的错误;或者不指定目标表时,报目标不存在的情况,可先执行STRUCT还原后,再继续执行实际数据的还原。
13. WITH /WITHOUT INDEX用于指定还原数据后是否重建二级索引,默认重建;WITH/WITHOUT CONSTRAINT指定还原数据后是否在目标表上重建约束,默认重建。对于备份表中存在的无效索引和约束,若索引为无效或者不可见,则重建后,也保持无效或者不可见;若约束无效,则重建后,约束也保持无效状态。
14. TRACE FILE若用户指定,则指定的文件不能为已经存在的文件,否则报错;也不可以为ASM文件。
15. 若表中存在大字段列,表备份时INI参数BLOB_OUTROW_REC_STOR大于0,而建立还原目标表时INI参数BLOB_OUTROW_REC_STOR等于0,那么若大字段列存在行外数据,在执行表还原时会报错,且表数据会丢失。
16. 表还原不检查目标表的缺省表达式(default值)。
2. 表还原
执行表还原,数据库必须处于OPEN状态,MOUNT和SUSPEND状态下不允许执行表还原。与表空间还原不同,表还原不需要配置归档。表还原是联机完全备份还原,不需要借助本地归档日志,所以还原后不需要恢复。完整的表备份还原步骤如下:
1) 保证数据库为OPEN状态。
2) 创建待备份的表。
SQL> create table tab_for_res_1(c1 int); 操作已执行 已用时间: 3.498(毫秒). 执行号:57. SQL> begin 2 for i in 1 .. 100 loop 3 insert into tab_for_res_1 values(i); 4 end loop; 5 commit; 6 end; 7 / DMSQL 过程已成功完成 已用时间: 2.710(毫秒). 执行号:58.
3) 备份表数据。
SQL> backup table tab_for_res_1 to tab_for_res_1_bak backupset 'E:\dmdbms\backup\tab_for_res_1_bak'; 操作已执行 已用时间: 00:00:01.138. 执行号:59.
4) 校验备份。此步骤为可选。
SQL> select sf_bakset_check('disk','E:\dmdbms\backup\tab_for_res_1_bak'); 行号 SF_BAKSET_CHECK('disk','E:\dmdbms\backup\tab_for_res_1_bak') ---------- ------------------------------------------------------------ 1 1 已用时间: 21.435(毫秒). 执行号:60.
5) 还原表数据。
SQL> truncate table tab_for_res_1; 操作已执行 已用时间: 5.238(毫秒). 执行号:62. SQL> select count(*) from tab_for_res_1; 行号 COUNT(*) ---------- -------------------- 1 0 已用时间: 1.165(毫秒). 执行号:63. SQL> restore table tab_for_res_1 from backupset 'E:\dmdbms\backup\tab_for_res_1_bak'; 操作已执行 已用时间: 68.217(毫秒). 执行号:64. SQL> select count(*) from tab_for_res_1; 行号 COUNT(*) ---------- -------------------- 1 100 已用时间: 1.329(毫秒). 执行号:65.
表还原实质是表内数据的还原,以及索引和约束等的重建。如果备份文件与目标表中都包含索引或约束该如何还原呢?下面以表中包含索引为例说明如何还原表,具体步骤如下:
1) 保证数据库为OPEN状态。
2) 创建待备份的表。
SQL> create table tab_for_res_2(c1 int); 操作已执行 已用时间: 3.088(毫秒). 执行号:67. SQL> begin 2 for i in 1 .. 10 loop 3 insert into tab_for_res_2 values(i); 4 end loop; 5 commit; 6 end; 7 / DMSQL 过程已成功完成 已用时间: 5.434(毫秒). 执行号:68.
3) 创建索引。
SQL> create index i_tab_for_res_2 on tab_for_res_2(c1); 操作已执行 已用时间: 6.720(毫秒). 执行号:69.
4) 备份表。
SQL> backup table tab_for_res_2 backupset 'E:\dmdbms\backup\tab_for_res_2_bak'; 操作已执行 已用时间: 00:00:01.102. 执行号:70.
5) 校验备份。此步骤为可选。
SQL> select sf_bakset_check('disk','E:\dmdbms\backup\tab_for_res_2_bak'); 行号 SF_BAKSET_CHECK('disk','E:\dmdbms\backup\tab_for_res_2_bak') ---------- ------------------------------------------------------------ 1 1 已用时间: 38.046(毫秒). 执行号:71.
6) 执行表结构还原。表备份和表中都包含索引,如果直接执行表数据还原会报错:还原表中存在二级索引或冗余约束。
SQL> truncate table tab_for_res_2; 操作已执行 已用时间: 4.115(毫秒). 执行号:73. SQL> select * from tab_for_res_2; 未选定行 已用时间: 1.113(毫秒). 执行号:74. SQL> restore table tab_for_res_2 from backupset 'E:\dmdbms\backup\tab_for_res_2_bak'; restore table tab_for_res_2 from backupset 'E:\dmdbms\backup\tab_for_res_2_bak'; [-8327]:还原表中存在二级索引或冗余约束. 已用时间: 22.306(毫秒). 执行号:0. SQL> restore table tab_for_res_2 struct from backupset 'E:\dmdbms\backup\tab_for_res_2_bak'; 操作已执行 已用时间: 27.047(毫秒). 执行号:76.
7) 执行表数据还原。
SQL> restore table tab_for_res_2 from backupset 'E:\dmdbms\backup\tab_for_res_2_bak'; 操作已执行 已用时间: 66.335(毫秒). 执行号:77. SQL> select * from tab_for_res_2; 行号 C1 ---------- ----------- 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 10 rows got 已用时间: 1.491(毫秒). 执行号:78.