ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用PLSQL实现表空间的迁移(四)

利用PLSQL实现表空间的迁移(四)

原创 Linux操作系统 作者:yangtingkun 时间:2009-09-19 20:42:40 0 删除 编辑

9i的时候,表空间的迁移使用EXP/IMP来实现。在10g中,除了使用EXP/IMP之外,还可以使用数据泵EXPDP/IMPDP,以及RMAN的命令TRANSPORT TABLESPACE命令,除此之外,还可以通过PL/SQLDBMS_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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-615094/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10403653