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

yangtingkun發表於2009-09-18

9i的時候,表空間的遷移使用EXP/IMP來實現。在10g中,除了使用EXP/IMP之外,還可以使用資料泵EXPDP/IMPDP,以及RMAN的命令TRANSPORT TABLESPACE命令,除此之外,還可以透過PL/SQLDBMS_STREAMS_TABLESPACE_ADM來實現。

這一篇介紹CLONE_TABLESPACES過程。

利用PLSQL實現表空間的遷移(一):http://yangtingkun.itpub.net/post/468/484859

利用PLSQL實現表空間的遷移(二):http://yangtingkun.itpub.net/post/468/485388

 

 

前文已經介紹過OracleDBMS_STREAMS_TABLESPACE_ADM包提供了8個過程:ATTACH_TABLESPACESATTACH_SIMPLE_TABLESPACECLONE_TABLESPACESCLONE_SIMPLE_TABLESPACEDETACH_TABLESPACESDETACH_SIMPLE_TABLESPACEPULL_TABLESPACESPULL_SIMPLE_TABLESPACE

這次遷移的表空間由於儲存在異地,因此無法透過PULL過程來實現,比如分成CLONEATTACH兩個階段。且由於當前的表空間包含多個資料檔案,因此不能使用SIMPLE方法,只能透過CLONE_TABLESPACESDETACH_TABLESPACES過程來實現。又因為源資料庫表空間不打算刪除,因此使用CLONE_TABLESPACES過程來實現遷移。

由於目標資料庫是用當前資料庫恢復得來的,因此不需要進行資料庫版本、資料塊大小、以及字符集的檢查,唯一需要檢查的是,被遷移表空間是否是自包含的。

SQL> SELECT DISTINCT OWNER
  2  FROM DBA_SEGMENTS
  3  WHERE TABLESPACE_NAME = 'ZHEJIANG';

OWNER
------------------------------
ZHEJIANG_OPERATOR
ZHEJIANG
ZHEJIANG_KHD

已選擇3行。

SQL> SELECT DISTINCT TABLESPACE_NAME
  2  FROM DBA_SEGMENTS
  3  WHERE OWNER IN ('ZHEJIANG', 'ZHEJIANG_OPERATOR', 'ZHEJIANG_KHD');

TABLESPACE_NAME
------------------------------
ZHEJIANG

已選擇 1 行。

SQL> SELECT FILE_NAME          
  2  FROM DBA_DATA_FILES
  3  WHERE TABLESPACE_NAME = 'ZHEJIANG';

FILE_NAME
--------------------------------------------------
/dev/vx/rdsk/datadg/tradedb_zhejiang_1_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_2_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_3_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_4_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_5_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_6_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_7_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_8_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_9_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_10_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_11_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_12_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_13_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_14_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_15_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_16_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_17_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_18_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_19_4g
/dev/vx/rdsk/datadg/tradedb_zhejiang_20_4g

已選擇20行。

SQL> EXEC DBMS_TTS.TRANSPORT_SET_CHECK('ZHEJIANG')

PL/SQL 過程已成功完成。

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

未選定行

由於需要一直保持只讀狀態,因此選擇手工將表空間置為只讀狀態,避免CLONE_TABLESPACES過程在操作完成後自動將表空間設定為可寫。

SQL> ALTER TABLESPACE ZHEJIANG READ ONLY;

表空間已更改。

下面需要建立CLONE_TABLESPACES過程所需的目錄:

SQL> CREATE DIRECTORY D_READFILE AS '/dev/vx/rdsk/datadg';

目錄已建立。

SQL> CREATE DIRECTORY D_WRITEFILE AS '/data/transport_zhejiang';

目錄已建立。

下面就可以執行CLONE_TABLESPACES過程了,需要注意,這個過程的輸入引數包括了索引組織表型別和記錄,因此需要透過建立一個PL/SQL匿名塊來完成呼叫,注意輸入引數變數的宣告需要用DBMS_STREAMS_TABLESPACE_ADM包中的型別進行宣告,否則呼叫會報錯:

SQL> SET SERVEROUT ON SIZE 1000000
SQL> DECLARE
  2     V_JOB_NAME VARCHAR2(30) := 'MY_CLONE_TABLESPACES';
  3     V_TABLESPACE_NAME DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
  4     V_DIRECTORY_NAME DBMS_STREAMS_TABLESPACE_ADM.DIRECTORY_OBJECT_SET;
  5     V_DUMPFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
  6     V_LOGFILE DBMS_STREAMS_TABLESPACE_ADM.FILE;
  7     V_DATAFILES DBMS_STREAMS_TABLESPACE_ADM.FILE_SET;
  8  BEGIN
  9     V_TABLESPACE_NAME(1) := 'ZHEJIANG';
 10     V_DIRECTORY_NAME(1) := 'D_WRITEFILE';
 11     V_DUMPFILE.DIRECTORY_OBJECT := 'D_WRITEFILE';
 12     V_DUMPFILE.FILE_NAME := 'zhejiang_090914.dp';
 13     V_LOGFILE.DIRECTORY_OBJECT := 'D_WRITEFILE';
 14     V_LOGFILE.FILE_NAME := 'zhejiang_090914.log';
 15     DBMS_STREAMS_TABLESPACE_ADM.CLONE_TABLESPACES(V_JOB_NAME,
 16             V_TABLESPACE_NAME,
 17             V_DUMPFILE,
 18             V_DIRECTORY_NAME,
 19             NULL,
 20             V_LOGFILE,
 21             V_DATAFILES);
 22     FOR I IN 1..V_DATAFILES.COUNT LOOP
 23             DBMS_OUTPUT.PUT_LINE(V_DATAFILES(I).FILE_NAME);
 24     END LOOP;
 25  END;
 26  /
tradedb_zhejiang_10_4g
tradedb_zhejiang_11_4g
tradedb_zhejiang_12_4g
tradedb_zhejiang_13_4g
tradedb_zhejiang_14_4g
tradedb_zhejiang_15_4g
tradedb_zhejiang_16_4g
tradedb_zhejiang_17_4g
tradedb_zhejiang_18_4g
tradedb_zhejiang_19_4g
tradedb_zhejiang_1_4g
tradedb_zhejiang_20_4g
tradedb_zhejiang_2_4g
tradedb_zhejiang_3_4g
tradedb_zhejiang_4_4g
tradedb_zhejiang_5_4g
tradedb_zhejiang_6_4g
tradedb_zhejiang_7_4g
tradedb_zhejiang_8_4g
tradedb_zhejiang_9_4g

PL/SQL 過程已成功完成。

檢查輸出的LOG檔案資訊:

bash-3.00$ more zhejiang_090914.log
啟動 "SYS"."MY_CLONE_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
處理物件型別 TRANSPORTABLE_EXPORT/POST_TABLE_ACTION
處理物件型別 TRANSPORTABLE_EXPORT/MATERIALIZED_VIEW_LOG
處理物件型別 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
已成功載入/解除安裝了主表 "SYS"."MY_CLONE_TABLESPACES"
******************************************************************************
SYS.MY_CLONE_TABLESPACES
的轉儲檔案集為:
  /data/transport_zhejiang/zhejiang_090914.dp
作業 "SYS"."MY_CLONE_TABLESPACES" 已於 20:47:26 成功完成

至此CLONE_TABLESPACES的過程完成。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-615030/,如需轉載,請註明出處,否則將追究法律責任。

相關文章