利用PLSQL實現表空間的遷移(四)
在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部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-615094/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用PLSQL實現表空間的遷移(一)SQL
- 利用PLSQL實現表空間的遷移(二)SQL
- 利用PLSQL實現表空間的遷移(三)SQL
- 利用PLSQL實現表空間的遷移(五)SQL
- 利用RMAN遷移表空間碰到的問題(四)
- 利用CONVERT實現跨平臺表空間遷移
- 表空間遷移
- 遷移表空間
- 【實驗】利用可傳輸表空間技術實現資料的高效遷移
- 利用RMAN遷移表空間碰到的問題(五)
- 利用RMAN遷移表空間碰到的問題(三)
- 利用RMAN遷移表空間碰到的問題(二)
- 利用RMAN遷移表空間碰到的問題(一)
- 【遷移】表空間transport
- RMAN遷移表空間
- 遷移表到新的表空間
- ORACLE表批量遷移表空間Oracle
- 遷移SYSTEM表空間為本地管理表空間
- 基於可傳輸表空間的表空間遷移
- expdp/impdp 遷移表空間
- Oracle10g新特性——利用RMAN遷移表空間Oracle
- 跨平臺表空間遷移(傳輸表空間)
- Oracle中表空間、表、索引的遷移Oracle索引
- Oracle10g新特性——利用RMAN遷移表空間(二)Oracle
- Oracle10g新特性——利用RMAN遷移表空間(一)Oracle
- table/index/LOBINDEX遷移表空間Index
- lob欄位表空間遷移
- Oracle 不同平臺間表空間遷移Oracle
- MySQL 遷移表空間,備份單表MySql
- 表、索引遷移表空間alter table move索引
- 空間遷移
- 利用可傳輸表空間跨平臺遷移 -RMAN CONVERT
- 利用oracle10g_rman_convert_transportable tablespace遷移表空間Oracle
- 分割槽表對應的表空間遷移案例
- 表空間遷移辦法補充
- 使用RMAN簡單遷移表空間
- 資料庫物件遷移表空間資料庫物件
- 【資料遷移】使用傳輸表空間遷移資料