利用PLSQL實現表空間的遷移(四)

yangtingkun發表於2009-09-19

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章