exp" 可傳輸表空

exp可傳輸表空間

exp --help幫助中可以看見這樣的一個參數

TRANSPORT_TABLESPACE 導出可傳輸表空間元數據

通過這個選項對一組自包含,只讀的表空間只導出元數據,然後在操作系統層將這些表空間的書記文件拷貝到目標平臺,並將元數據導入數據字典 這個過程稱爲插入 plugging 即完成了遷移

對於傳輸表空間有一個重要的概念:自包含 (self-contained)
在表空間的傳輸中,要求表空間集爲自包含
自包含: 表示用於傳輸的內部表空間集沒有引用指向外部的表空間集
自包含又分爲兩種:一種自包含表空間集 第二爲:完全(嚴格)自包含表空間集

常見的一下情況是違反自包含原則的
1,索引在內部表空間集,而表在外部表空間集(相反的,如果表在內部表空間集,而索引在外部表空間集,則不違反自包含原則)
2,分區表一部分區在內部表空間集,一部份在外部表空間集(對於分區表,要麼全部包含在內部表空間集中,要麼全不包含)
3,如果在傳輸表空間同事傳輸約束,則對於用完整性約束,約束指向的表在外部表空間集,則違反自包含約束,如果不傳輸約束,則與約束指向無關。
4,表在內部表空間集,而lob列在外部表空間集,則違反自包含約束。

通常可以通過系統包DBMS_TTS來檢查表空間是否自包含,驗證可以兩種方式執行;非嚴格方式和嚴格方式。


eg:做一個簡單是實驗來證實:

假如test 表空間存在一個表test ,其上存在索引存儲在USERS表空間;

SQL>create table test as select rownum id,username from dba_users;
SQL>create index ind_id on test(id) tablespace users;

用 sys用戶執行非嚴格自包含檢查(full_check=false)
SQL>connect /as sysdba
SQL>exec dbms_tts.transport_set_check('TEST',TRUE);
SQL>select * from TRANSPORT_SET_VIOLATIONS;
執行嚴格自包含檢查(full_check=true)
SQL>exec dbms_tts.transport_set_check('TEST',TRUE,true);
SQL>select * from TRANSPORT_SET_VIOLATIONS;

對於test表空間來說非嚴格自包含檢查成功通過,執行嚴格自包含檢查無法通過。

我們反過來對users表空間進行非嚴格自包含檢查測試
SQL>exec dbms_tts.transport_set_check('USERS',TRUE);
SQL>select * from TRANSPORT_SET_VIOLATIONS;
非嚴格自包含檢查都無法通過

那麼我們來同時對多個表空間進行傳輸問題是不是能得到解決呢?測試下
SQL>exec dbms_tts.transport_set_check('TEST,USERS',TRUE,true);
SQL>select * from TRANSPORT_SET_VIOLATIONS;
嚴格自包含檢查也可以成功通過


表空間自包含檢查完後進行表空間傳輸就方便了

(1)首先將表空間設置成只讀表空間
SQL>alter tablespace users read only;
(2)導出表空間
exp username/password tablesapces=users tranport_tablespace=y file=exp_users.dmp
此時導出的元數據,比較小
(3)轉移需要數據,元數據exp_users.dmp,數據文件user01.dbf傳輸到目標主機,如果通過FTP傳輸需要注意用BIN二進制傳輸。
(4)在目標數據庫中將表空間插入到數據庫中
imp username/password tablesapces=users tranport_tablespace=y file=exp_users.dmp datafiles='user01.dbf'

 

如果表空間包含多個數據文件該怎麼辦呢?下面是解決辦法:

imp transport_tablespace=y datafiles=('數據文件1全路徑','數據文件2全路徑',...) tablespaces=目標表空間名稱 file=dmp文件全路徑.dmp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章