下面介绍一些表还原操作中复杂的还原场景。主要内容包括:
1. 指定还原时不重建索引
2. 指定还原时不重建约束
1.指定还原时不重建索引
表备份时会默认备份表中的索引,还原时使用RESTORE TABLE…WITHOUT INDEX…语句可选择不还原索引。完整示例如下:
1) 保证数据库为OPEN状态。
2) 准备数据。创建待备份的表及索引。
SQL> create table tab_for_idx_01(c1 int); 操作已执行 已用时间: 6.323(毫秒). 执行号:108. SQL> begin 2 for i in 1 .. 10 loop 3 insert into tab_for_idx_01 values(i); 4 end loop; 5 end; 6 / DMSQL 过程已成功完成 已用时间: 1.236(毫秒). 执行号:109. SQL> create index i_tab_for_idx_01 on tab_for_idx_01(c1); 操作已执行 已用时间: 11.300(毫秒). 执行号:110.
3) 备份表数据。
SQL> backup table tab_for_idx_01 backupset 'E:\dmdbms\backup\tab_for_idx_01_bak'; 操作已执行 已用时间: 00:00:01.099. 执行号:111.
4) 校验备份。此步骤为可选。
SQL> select sf_bakset_check('disk','E:\dmdbms\backup\tab_for_idx_01_bak'); 行号 SF_BAKSET_CHECK('disk','E:\dmdbms\backup\tab_for_idx_01_bak') ---------- ------------------------------------------------------------- 1 1 已用时间: 20.171(毫秒). 执行号:112.
5) 还原表数据,但不重建索引。
SQL> restore table tab_for_idx_01 without index from backupset 'E:\dmdbms\backup\tab_for_idx_01_bak'; restore table tab_for_idx_01 without index from backupset 'E:\dmdbms\backup\tab_for_idx_01_bak'; [-8327]:还原表中存在二级索引或冗余约束. 已用时间: 31.373(毫秒). 执行号:0. SQL> restore table tab_for_idx_01 struct from backupset 'E:\dmdbms\backup\tab_for_idx_01_bak'; 操作已执行 已用时间: 44.737(毫秒). 执行号:125. SQL> restore table tab_for_idx_01 without index from backupset 'E:\dmdbms\backup\tab_for_idx_01_bak'; 操作已执行 已用时间: 78.096(毫秒). 执行号:126. SQL> select * from tab_for_idx_01; 行号 C1 ---------- ----------- 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 SQL> select owner,table_name,index_name from dba_indexes where owner='SYSDBA' and table_name='TAB_FOR_IDX_01'; 行号 OWNER TABLE_NAME INDEX_NAME ---------- ------ -------------- ------------- 1 SYSDBA TAB_FOR_IDX_01 INDEX33555549 已用时间: 35.494(毫秒). 执行号:132.
2.指定还原时不重建约束
表备份时会默认备份表中的索引定义,还原时使用RESTORE TABLE…WITHOUT CONSTRAINT…语句可选择还原时不重建约束。完整示例如下:
1) 保证数据库为OPEN状态。
2) 准备数据。创建待备份的表及索引。
SQL> create table tab_for_cons_01(c1 int); 操作已执行 已用时间: 4.824(毫秒). 执行号:134. SQL> alter table tab_for_cons_01 add constraint unique_cons1 unique(c1); 操作已执行 已用时间: 7.979(毫秒). 执行号:135. SQL> select owner,table_name,index_name from dba_indexes where owner='SYSDBA' and table_name='TAB_FOR_CONS_01'; 行号 OWNER TABLE_NAME INDEX_NAME ---------- ------ --------------- ------------- 1 SYSDBA TAB_FOR_CONS_01 INDEX33555551 2 SYSDBA TAB_FOR_CONS_01 INDEX33555552 已用时间: 32.121(毫秒). 执行号:136. SQL> select owner,constraint_name,constraint_type,table_name from dba_constraints where owner='SYSDBA' and table_name='TAB_FOR_CONS_01'; 行号 OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME ---------- ------ --------------- --------------- --------------- 1 SYSDBA UNIQUE_CONS1 U TAB_FOR_CONS_01 已用时间: 17.818(毫秒). 执行号:138. SQL> begin 2 for i in 1 .. 10 loop 3 insert into tab_for_cons_01 values(i); 4 end loop; 5 commit; 6 end; 7 / DMSQL 过程已成功完成 已用时间: 3.485(毫秒). 执行号:143.
3) 备份表数据。
SQL> backup table tab_for_cons_01 backupset 'E:\dmdbms\backup\tab_for_cons_01_bak'; 操作已执行 已用时间: 00:00:01.128. 执行号:144.
4) 校验备份。此步骤为可选。
SQL> select sf_bakset_check('disk','E:\dmdbms\backup\tab_for_cons_01_bak'); 行号 SF_BAKSET_CHECK('disk','E:\dmdbms\backup\tab_for_cons_01_bak') ---------- -------------------------------------------------------------- 1 1 已用时间: 33.044(毫秒). 执行号:145.
5) 还原表数据,但不还原约束。
SQL> truncate table tab_for_cons_01; 操作已执行 已用时间: 5.036(毫秒). 执行号:146. SQL> select * from tab_for_cons_01; 未选定行 已用时间: 1.542(毫秒). 执行号:147. SQL> restore table tab_for_cons_01 without constraint from backupset 'E:\dmdbms\backup\tab_for_cons_01_bak'; restore table tab_for_cons_01 without constraint from backupset 'E:\dmdbms\backup\tab_for_cons_01_bak'; [-8327]:还原表中存在二级索引或冗余约束. 已用时间: 33.927(毫秒). 执行号:0. SQL> restore table tab_for_cons_01 struct from backupset 'E:\dmdbms\backup\tab_for_cons_01_bak'; 操作已执行 已用时间: 38.765(毫秒). 执行号:149. SQL> restore table tab_for_cons_01 without constraint from backupset 'E:\dmdbms\backup\tab_for_cons_01_bak'; 操作已执行 已用时间: 75.178(毫秒). 执行号:150. SQL> select * from tab_for_cons_01; 行号 C1 ---------- ----------- 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 10 rows got 已用时间: 2.870(毫秒). 执行号:151. SQL> select owner,table_name,index_name from dba_indexes where owner='SYSDBA' and table_name='TAB_FOR_CONS_01'; 行号 OWNER TABLE_NAME INDEX_NAME ---------- ------ --------------- ------------- 1 SYSDBA TAB_FOR_CONS_01 INDEX33555551 已用时间: 21.005(毫秒). 执行号:152.
查询约束发现确实没有被还原
SQL> select owner,constraint_name,constraint_type,table_name from dba_constraints where owner='SYSDBA' and table_name='TAB_FOR_CONS_01'; 未选定行 已用时间: 9.087(毫秒). 执行号:153.