Schema 級的複製可以通過DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS建立,經過前面資料表空間級的試練,接著建立schema級的複製環境還是比較簡單的。
本章樣本繼續沿用前章中的環境(主要是oracle環境,之前的複製環境已被清除),並設定環境如下:
來源資料庫 sid : jssweb ,目標庫 : jssstr ;
複製schema:member,同步DML,DDL操作;
本地捕獲,雙向同步(又變了喲,又改為本地捕獲了);
DBMS_STREAMS_ADM.MAINTAIN_TTS 直接產生 配置 ;
STREAMS 管理員已經建立,源和目標端通訊用的資料庫鏈也已經建立。
由於前面剛剛使用MAINTAIN_TTS做完資料表空間級的同步,因此這裡準備工作可以都省掉了,如果你沒有按照三思本文的介紹的順序執行測試,務必先參考前章資料表空間級同步時的準備工作。
如果是完全按照三思介紹的步驟進行的測試,千萬別忘了在執行本步之前,先清除之前的複製環境,並刪除目標端member下所有對象。
1、 執行建立
除了清除之前的複製環境,刪除原目標端schema中對象外,就沒啥別的要做了,直接執行建立即可,建立非常簡單,基本就是一個過程的事情。
首先在源端以strmadmin登陸:
JSSWEB> conn strmadmin/strmadmin
Connected.
JSSWEB> BEGIN
2 DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
3 schema_names => ¨member¨,
4 source_directory_object => ¨mydt_source¨,
5 destination_directory_object => ¨mydt_dest¨,
6 source_database => ¨jssweb.jss.cn¨,
7 destination_database => ¨jssstr.jss.cn¨,
8 perform_actions => true,
9 dump_file_name => ¨export_member.dmp¨,
10 log_file => ¨export_member_expdp.log¨,
11 bi_directional => true,
12 include_ddl => true,
13 instantiation => DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA);
14 END;
15 /
PL/SQL procedure successfully completed.
本過程又帶來一個新的參數:instantiation ,該參數用來指定是否執行執行個體化,有如下幾種值:
DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA :通過expdp/impdp初始化資料,並在目標端匯入資料時執行執行個體化,預設情況下即是該值。
DBMS_STREAMS_ADM.INSTANTIATION_SCHEMA_NETWORK :impdp直接通過網路傳輸資料而不產生dmp檔案。在匯入資料時執行執行個體化。
DBMS_STREAMS_ADM.INSTANTIATION_NONE :不執行執行個體化,該屬性值僅當perform_actions參數設定為false時有效。
注意:
由於我們此處選擇配置雙向複製,因此在執行該過程時,目標端不要對member中對象做任何DML/DDL操作,以免存在資料丟失。
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
MAINTAIN_SCHEMAS 過程支援同時多個schema,比如有多個schema需要複製,則在begin之前聲明一個DBMS_UTILITY.UNCL_ARRAY陣列變數即可,例如:
DECLARE
tab_schema dbms_utility.uncl_array;
Begin
tab_schema(1):=¨scott¨;
tab_schema(2):=¨member¨;
................
DBMS_STREAMS_ADM.MAINTAIN_SCHEMAS(
schema_names => tab_schema,
.............
.............
2、 測試一下
源端執行:
JSSWEB> desc member.dt_tbl1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NAME NOT NULL VARCHAR2(30)
VL VARCHAR2(20)
JSSWEB> select count(0) from member.dt_tbl1;
COUNT(0)
----------
10 2
JSSWEB> insert into member.dt_tbl1 values (103,¨c¨,null);
1 row created.
JSSWEB> alter table member.dt_tbl1 drop column vl;
Table altered.
JSSWEB> alter system switch logfile;
System altered.
切換到目標端查看:
JSSSTR> select count(0) from member.dt_tbl1;
COUNT(0)
----------
103
JSSSTR> desc member.dt_tbl1;
名稱 是否為空白? 類型