在9i的时候,表空间的迁移使用EXP/IMP来实现。在10g中,除了使用EXP/IMP之外,还可以使用数据泵EXPDP/IMPDP,以及RMAN的命令TRANSPORT TABLESPACE命令,除此之外,还可以通过PL/SQL包DBMS_STREAMS_TABLESPACE_ADM来实现。
这一篇介绍ATTACH_TABLESPACES过程。
利用PLSQL实现表空间的迁移(一):http://yangtingkun.itpub.net/post/468/484859
利用PLSQL实现表空间的迁移(二):http://yangtingkun.itpub.net/post/468/485388
利用PLSQL实现表空间的迁移(三):http://yangtingkun.itpub.net/post/468/491799
上一篇文章中已经介绍了通过CLONE_TABLESPACES过程表空间,这一篇继续描述如何通过ATTACH_TABLESPACES过程,将表空间加载到目标数据库中。
由于目标数据库使用了ASM,因此在执行ATTACH_TABLESPACES过程之前,需要使用DBMS_FILE_TRANSFER将数据文件放到ASM磁盘组上:
bash-3.00$ pwd
/data/zhejiang/transport_tablespace
bash-3.00$ ls -l
total 167935608
drwxr-xr-x 2 oracle oinstall 512 Sep 16 22:10 exp
drwxr-xr-x 2 oracle oinstall 512 Sep 16 21:59 expdp
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 19:42 tradedb_zhejiang_10_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 19:48 tradedb_zhejiang_11_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 19:54 tradedb_zhejiang_12_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:00 tradedb_zhejiang_13_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:07 tradedb_zhejiang_14_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:13 tradedb_zhejiang_15_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:19 tradedb_zhejiang_16_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:25 tradedb_zhejiang_17_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:31 tradedb_zhejiang_18_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:38 tradedb_zhejiang_19_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:44 tradedb_zhejiang_1_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:50 tradedb_zhejiang_20_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 20:56 tradedb_zhejiang_2_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:02 tradedb_zhejiang_3_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:08 tradedb_zhejiang_4_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:15 tradedb_zhejiang_5_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:21 tradedb_zhejiang_6_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:27 tradedb_zhejiang_7_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:33 tradedb_zhejiang_8_4g
-rw-r--r-- 1 oracle oinstall 4296015872 Sep 16 21:39 tradedb_zhejiang_9_4g
-rw-r--r-- 1 oracle oinstall 20414464 Sep 16 21:39 zhejiang_090914.dp
-rw-r--r-- 1 oracle oinstall 1129 Sep 16 21:39 zhejiang_090914.log
而数据文件的目标位置为:
SQL> select file_name from dba_data_files;
FILE_NAME
-----------------------------------------------------------------------------------------
+MEMBER/tradedb/tradedb_system_1_4g
+MEMBER/tradedb/tradedb_undotbs1_1_4g
+MEMBER/tradedb/tradedb_undotbs1_2_4g
+MEMBER/tradedb/tradedb_undotbs1_3_4g
+MEMBER/tradedb/tradedb_undotbs1_4_4g
+MEMBER/tradedb/tradedb_undotbs1_5_4g
+MEMBER/tradedb/tradedb_sysaux_1_1g
+MEMBER/tradedb/tradedb_undotbs2_1_4g
+MEMBER/tradedb/tradedb_undotbs2_2_4g
+MEMBER/tradedb/tradedb_undotbs2_3_4g
+MEMBER/tradedb/tradedb_undotbs2_4_4g
+MEMBER/tradedb/tradedb_undotbs2_5_4g
+MEMBER/tradedb/tradedb_users_1_200m
+MEMBER/tradedb/tradedb_ndmain_1_4g
+MEMBER/tradedb/tradedb_ndmain_2_4g
+MEMBER/tradedb/tradedb_ndmain_3_4g
+MEMBER/tradedb/tradedb_ndmain_4_4g
+MEMBER/tradedb/tradedb_ndmain_5_4g
+MEMBER/tradedb/tradedb_gpo_1_4g
+MEMBER/tradedb/tradedb_zhejrep_1_8g
+MEMBER/tradedb/tradedb_sysaux_2_1g
已选择21行。
下面创建目录:
SQL> create or replace directory d_trans_file as '/data/zhejiang/transport_tablespace';
目录已创建。
SQL> create or replace directory d_datafile as '+MEMBER/tradedb';
目录已创建。
通过DBMS_FILE_TRANSFER包将数据文件放到ASM磁盘组中:
SQL> exec dbms_file_transfer.copy_file('D_TRANS_FILE', 'tradedb_zhejiang_1_4g', 'D_DATAFILE', 'tradedb_zhejiang_1_4g')
PL/SQL 过程已成功完成。
SQL> exec dbms_file_transfer.copy_file('D_TRANS_FILE', 'tradedb_zhejiang_2_4g', 'D_DATAFILE', 'tradedb_zhejiang_2_4g')
PL/SQL 过程已成功完成。
SQL> exec dbms_file_transfer.copy_file('D_TRANS_FILE', 'tradedb_zhejiang_3_4g', 'D_DATAFILE', 'tradedb_zhejiang_3_4g')
PL/SQL 过程已成功完成。
.
.
.
SQL> exec dbms_file_transfer.copy_file('D_TRANS_FILE', 'tradedb_zhejiang_20_4g', 'D_DATAFILE', 'tradedb_zhejiang_20_4g')
PL/SQL 过程已成功完成。
下面可以执行ATTACH_TABLESPACES过程了:
SQL> SET SERVEROUT ON SIZE 1000000
SQL> DECLARE
2 V_JOB_NAME VARCHAR2(30) := 'MY_ATTACH_TABLESPACES';
3 V_TABLESPACE_NAME DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
4 V_DUMPFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
5 V_LOGFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
6 V_DATAFILES DBMS_STREAMS_TABLESPACE_ADM.FILE_SET;
7 BEGIN
8 V_DUMPFILE.DIRECTORY_OBJECT := 'D_TRANS_FILE';
9 V_DUMPFILE.FILE_NAME := 'zhejiang_090914.dp';
10 V_LOGFILE.DIRECTORY_OBJECT := 'D_TRANS_FILE';
11 V_LOGFILE.FILE_NAME := 'zhejiang_imp_090917.log';
12 V_DATAFILES(1).DIRECTORY_OBJECT := 'D_DATAFILE';
13 V_DATAFILES(2).DIRECTORY_OBJECT := 'D_DATAFILE';
14 V_DATAFILES(3).DIRECTORY_OBJECT := 'D_DATAFILE';
15 V_DATAFILES(4).DIRECTORY_OBJECT := 'D_DATAFILE';
16 V_DATAFILES(5).DIRECTORY_OBJECT := 'D_DATAFILE';
17 V_DATAFILES(6).DIRECTORY_OBJECT := 'D_DATAFILE';
18 V_DATAFILES(7).DIRECTORY_OBJECT := 'D_DATAFILE';
19 V_DATAFILES(8).DIRECTORY_OBJECT := 'D_DATAFILE';
20 V_DATAFILES(9).DIRECTORY_OBJECT := 'D_DATAFILE';
21 V_DATAFILES(10).DIRECTORY_OBJECT := 'D_DATAFILE';
22 V_DATAFILES(11).DIRECTORY_OBJECT := 'D_DATAFILE';
23 V_DATAFILES(12).DIRECTORY_OBJECT := 'D_DATAFILE';
24 V_DATAFILES(13).DIRECTORY_OBJECT := 'D_DATAFILE';
25 V_DATAFILES(14).DIRECTORY_OBJECT := 'D_DATAFILE';
26 V_DATAFILES(15).DIRECTORY_OBJECT := 'D_DATAFILE';
27 V_DATAFILES(16).DIRECTORY_OBJECT := 'D_DATAFILE';
28 V_DATAFILES(17).DIRECTORY_OBJECT := 'D_DATAFILE';
29 V_DATAFILES(18).DIRECTORY_OBJECT := 'D_DATAFILE';
30 V_DATAFILES(19).DIRECTORY_OBJECT := 'D_DATAFILE';
31 V_DATAFILES(20).DIRECTORY_OBJECT := 'D_DATAFILE';
32 V_DATAFILES(1).FILE_NAME := 'tradedb_zhejiang_1_4g';
33 V_DATAFILES(2).FILE_NAME := 'tradedb_zhejiang_2_4g';
34 V_DATAFILES(3).FILE_NAME := 'tradedb_zhejiang_3_4g';
35 V_DATAFILES(4).FILE_NAME := 'tradedb_zhejiang_4_4g';
36 V_DATAFILES(5).FILE_NAME := 'tradedb_zhejiang_5_4g';
37 V_DATAFILES(6).FILE_NAME := 'tradedb_zhejiang_6_4g';
38 V_DATAFILES(7).FILE_NAME := 'tradedb_zhejiang_7_4g';
39 V_DATAFILES(8).FILE_NAME := 'tradedb_zhejiang_8_4g';
40 V_DATAFILES(9).FILE_NAME := 'tradedb_zhejiang_9_4g';
41 V_DATAFILES(10).FILE_NAME := 'tradedb_zhejiang_10_4g';
42 V_DATAFILES(11).FILE_NAME := 'tradedb_zhejiang_11_4g';
43 V_DATAFILES(12).FILE_NAME := 'tradedb_zhejiang_12_4g';
44 V_DATAFILES(13).FILE_NAME := 'tradedb_zhejiang_13_4g';
45 V_DATAFILES(14).FILE_NAME := 'tradedb_zhejiang_14_4g';
46 V_DATAFILES(15).FILE_NAME := 'tradedb_zhejiang_15_4g';
47 V_DATAFILES(16).FILE_NAME := 'tradedb_zhejiang_16_4g';
48 V_DATAFILES(17).FILE_NAME := 'tradedb_zhejiang_17_4g';
49 V_DATAFILES(18).FILE_NAME := 'tradedb_zhejiang_18_4g';
50 V_DATAFILES(19).FILE_NAME := 'tradedb_zhejiang_19_4g';
51 V_DATAFILES(20).FILE_NAME := 'tradedb_zhejiang_20_4g';
52 DBMS_STREAMS_TABLESPACE_ADM.ATTACH_TABLESPACES(V_JOB_NAME,
53 V_DUMPFILE,
54 V_DATAFILES,
55 V_DATAFILES,
56 NULL,
57 V_LOGFILE,
58 V_TABLESPACE_NAME);
59 FOR I IN 1..V_TABLESPACE_NAME.COUNT LOOP
60 DBMS_OUTPUT.PUT_LINE(V_TABLESPACE_NAME(I));
61 END LOOP;
62 END;
63 /
DECLARE
*
第 1 行出现错误:
ORA-06512: 在 "SYS.DBMS_STREAMS_TABLESPACE_ADM", line 2006
ORA-06512: 在 line 52
执行过程报错,检查对应的导入输出文件:
bash-3.00$ more zhejiang_imp_090917.log
已成功加载/卸载了主表 "SYS"."MY_ATTACH_TABLESPACES"
启动 "SYS"."MY_ATTACH_TABLESPACES":
处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
处理对象类型 TRANSPORTABLE_EXPORT/TABLE
处理对象类型 TRANSPORTABLE_EXPORT/GRANT/OWNER_GRANT/OBJECT_GRANT
处理对象类型 TRANSPORTABLE_EXPORT/INDEX
处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
处理对象类型 TRANSPORTABLE_EXPORT/INDEX_STATISTICS
处理对象类型 TRANSPORTABLE_EXPORT/COMMENT
处理对象类型 TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
处理对象类型 TRANSPORTABLE_EXPORT/TRIGGER
处理对象类型 TRANSPORTABLE_EXPORT/INDEX/FUNCTIONAL_AND_BITMAP/INDEX
处理对象类型 TRANSPORTABLE_EXPORT/INDEX/STATISTICS/FUNCTIONAL_AND_BITMAP/INDEX_STATISTICS
处理对象类型 TRANSPORTABLE_EXPORT/TABLE_STATISTICS
ORA-39125: 在 KUPW$WORKER.PUT_DDLS 中 Worker 发生意外的致命错误 (在调用 DBMS_METADATA.CONVERT [] 时)
ORA-06502: PL/SQL: 数字或值错误
LPX-00225: end-element tag "HIST_GRAM_LIST_ITEM" does not match start-element tag "EPVALUE"
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: 在 "SYS.KUPW$WORKER", line 6228
----- PL/SQL Call Stack -----
object line object
handle number name
4f5e86138 14916 package body SYS.KUPW$WORKER
4f5e86138 6293 package body SYS.KUPW$WORKER
4f5e86138 12280 package body SYS.KUPW$WORKER
4f5e86138 3278 package body SYS.KUPW$WORKER
4f5e86138 6882 package body SYS.KUPW$WORKER
4f5e86138 1259 package body SYS.KUPW$WORKER
502b0c270 2 anonymous block
作业 "SYS"."MY_ATTACH_TABLESPACES" 因致命错误于 12:36:28 停止
可以看到,在迁移最后表统计部分报错,总的来说,表空间的迁移已经成功完成,不过需要重新收集统计信息。
SQL> select file_name
2 from dba_data_files;
FILE_NAME
------------------------------------------------------------------------------------
+MEMBER/tradedb/tradedb_system_1_4g
+MEMBER/tradedb/tradedb_undotbs1_1_4g
+MEMBER/tradedb/tradedb_undotbs1_2_4g
+MEMBER/tradedb/tradedb_undotbs1_3_4g
+MEMBER/tradedb/tradedb_undotbs1_4_4g
+MEMBER/tradedb/tradedb_undotbs1_5_4g
+MEMBER/tradedb/tradedb_sysaux_1_1g
+MEMBER/tradedb/tradedb_undotbs2_1_4g
+MEMBER/tradedb/tradedb_undotbs2_2_4g
+MEMBER/tradedb/tradedb_undotbs2_3_4g
+MEMBER/tradedb/tradedb_undotbs2_4_4g
+MEMBER/tradedb/tradedb_undotbs2_5_4g
+MEMBER/tradedb/tradedb_users_1_200m
+MEMBER/tradedb/tradedb_ndmain_1_4g
+MEMBER/tradedb/tradedb_ndmain_2_4g
+MEMBER/tradedb/tradedb_ndmain_3_4g
+MEMBER/tradedb/tradedb_ndmain_4_4g
+MEMBER/tradedb/tradedb_ndmain_5_4g
+MEMBER/tradedb/tradedb_gpo_1_4g
+MEMBER/tradedb/tradedb_zhejrep_1_8g
+MEMBER/tradedb/tradedb_zhejiang_20_4g
+MEMBER/tradedb/tradedb_zhejiang_19_4g
+MEMBER/tradedb/tradedb_zhejiang_18_4g
+MEMBER/tradedb/tradedb_zhejiang_17_4g
+MEMBER/tradedb/tradedb_zhejiang_16_4g
+MEMBER/tradedb/tradedb_zhejiang_15_4g
+MEMBER/tradedb/tradedb_zhejiang_14_4g
+MEMBER/tradedb/tradedb_zhejiang_13_4g
+MEMBER/tradedb/tradedb_zhejiang_12_4g
+MEMBER/tradedb/tradedb_zhejiang_11_4g
+MEMBER/tradedb/tradedb_zhejiang_10_4g
+MEMBER/tradedb/tradedb_zhejiang_9_4g
+MEMBER/tradedb/tradedb_zhejiang_8_4g
+MEMBER/tradedb/tradedb_zhejiang_7_4g
+MEMBER/tradedb/tradedb_zhejiang_6_4g
+MEMBER/tradedb/tradedb_zhejiang_5_4g
+MEMBER/tradedb/tradedb_zhejiang_4_4g
+MEMBER/tradedb/tradedb_zhejiang_3_4g
+MEMBER/tradedb/tradedb_sysaux_2_1g
+MEMBER/tradedb/tradedb_zhejiang_2_4g
+MEMBER/tradedb/tradedb_zhejiang_1_4g
已选择41行。
SQL> select tablespace_name
2 from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
UNDOTBS2
USERS
NDMAIN
ZHEJIANG
GPO
ZHEJREP
已选择10行。
SQL> conn zhejiang
输入口令:
已连接。
SQL> select count(*) from tab;
COUNT(*)
----------
621
除了需要手工收集统计信息外,如果用户还需要过程、包之类的对象,那么还需要通过EXPDP/IMPDP导入,这些对象是传输表空间无法导入的。
不过对应当前的用户来说,由于用户没有删除,而只是删除了表空间,因此其他的对象都保留了下来,只需要重新编译就可以使用。
如果需要修改表空间,那么将表空间至于READ WRITE状态:
SQL> alter tablespace zhejiang read write;
表空间已更改。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-615094/ ,如需转载,请注明出处,否则将追究法律责任。