當前位置:
首頁 >
手动建立规则方式创建stream环境
發布時間:2025/3/20
49
豆豆
生活随笔
收集整理的這篇文章主要介紹了
手动建立规则方式创建stream环境
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前學習和聯系stream環境時,都用的是DBMS_STREAMS_ADM包來配置的,在創建捕獲進程后,每次要修改捕獲規則時,都會自動增加新的捕獲規則,并且新的條件不能生效,必須要刪除原有的規則才可以。并且自動生成的規則名不易看懂,管理起來比較麻煩,認真學習了三思的大作 《 一步一步學Streams》后,嘗試用手動建立規則的方式來搭建流環境,感覺比自動生成規則的方式方便很多,以下是實驗步驟: 刪除strmadmin 用戶,為了干凈的刪除stream的規則等對象:
drop user strmadmin cascade;
? 源庫建立strmadmin用戶,并授權.
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 目標庫建立strmadmin用戶,并授權.
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 授權Stream管理用戶 :
begin
dbms_streams_auth.grant_admin_privilege(grantee =>'strmadmin',grant_privileges => true);
end;
?
? --建立數據庫鏈
?切換回source數據庫,以streams的操作用戶stradmin連接? ,創建隊列 create database link klir connect to strmadmin identified by strmadmin using 'klir';
?exec dbms_streams_adm.set_up_queue();
?
?
?切換到target數據庫,以streams的操作用戶stradmin連接 ,創建隊列 create database link lirhz connect to strmadmin identified by strmadmin using 'lirhz';
? exec dbms_streams_adm.set_up_queue(); 手動建立傳播規則和傳播進程: 先建立一個傳播進程的規則集:
sour> begin
dbms_rule_adm.create_rule_set(
rule_set_name => 'strmadmin.propagation_rules',
evaluation_context => 'sys.streams$_evaluation_context');
end; 建立規則集后,會在(dba_rulesets、dba_rule_sets)表中建立propagation_rules規則。 創建傳播的dml規則。
sour> begin
dbms_rule_adm.create_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' ');
end;
??
寫入表:? dba_rules 創建傳播的ddl規則。
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end;
??
把dml、ddl規則添加到規則集中
??
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_dml',
?? rule_set_name => 'strmadmin.propagation_rules');
end; 把ddl規則添加到規則集合中 ,
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? rule_set_name => 'strmadmin.propagation_rules');
end;
創建propagation進程。 begin
?? dbms_propagation_adm.create_propagation(
?? propagation_name => 'pri_to_klir',
?? source_queue => 'strmadmin.streams_queue',
?? destination_queue => 'strmadmin.streams_queue',
?? destination_dblink => 'klir',
?? rule_set_name => 'strmadmin.propagation_rules');
?? end; 創建capture進程部分。
手動建立捕獲規則和捕獲進程: 創建規則集
sour> begin
?? dbms_rule_adm.create_rule_set(
?? rule_set_name => 'strmadmin.capture_rules',
?? evaluation_context => 'sys.streams$_evaluation_context');
?? end; 創建dml規則
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
?? ' :dml.is_null_tag() =''Y'' AND '||
?? ' :dml.get_source_database_name()= ''LIRHZ'' ');
?? end; 創建ddl規則??
sour> begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
?? end;
加入規則集。
sour> begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? rule_set_name => 'strmadmin.capture_rules');
?? end;
? sour> begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? rule_set_name => 'strmadmin.capture_rules');
?? end; 創建捕獲進程
?begin
?? dbms_capture_adm.create_capture(
?? queue_name => 'strmadmin.streams_queue',
?? capture_name => 'lirhz_capture',
?? rule_set_name => 'strmadmin.capture_rules');?? 使用捕獲的規則集。
?? end; 源庫建立的捕獲傳播規則 SQL>? select RULE_NAME,RULE_CONDITION from dba_rules where rule_owner='STRMADMIN';
?
RULE_NAME????????????????????? RULE_CONDITION
------------------------------ --------------------------------------------------------------------------------
MEMBER_CAP_DDL???????????????? (:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND
MEMBER_CAP_DML???????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_sour
MEMBER_PRO_DDL???????????????? (:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND
MEMBER_PRO_DML???????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_sour 源端準備實例SCN (如果是使用dbms_streams_adm包來配置就不需要此步驟,過程會自動進行配置。)。
begin
?? dbms_capture_adm.prepare_schema_instantiation(
?? schema_name => 'test02',
?? supplemental_logging => 'keys');
?? end;
目標庫做應用scn。
declare
?iscn number;
?begin
?iscn:=dbms_flashback.get_system_change_number();
?dbms_apply_adm.set_schema_instantiation_scn@klir(
?source_schema_name => 'test02',
?source_database_name => 'lirhz',
?instantiation_scn => iscn,
?recursive? => true);
end;
目標庫使用dbms_streams_adm。建立apply.建立后的規則由ORACLE自動命名。
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'test02',
streams_type => 'apply',
streams_name => 'apply_standy',
queue_name => 'strmadmin.STREAMS_QUEUE',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'lirhz',
inclusion_rule => true);
end;
設置異常規則。 啟動應用進程和傳播進程后,這樣單向schema級的數據就能同步了。忽略......... ======================================================== 我使用手動建立規則的方式去配置流,主要是考慮在實際應用中可以需要修改和維護同步規則,例如要設置源庫的個別表不傳到目標庫,有2種方式:
1.在傳播級別修改規則,即設置某些規則不傳播。
2.在捕獲級別修改規則,即設置某些規則不捕獲。
原先的傳播規則命令
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end;
修改dml傳播規則。增加F1,F5的不傳條件。 sour> begin
dbms_rule_adm.alter_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' and ' ||
' (:dml.get_object_name() <> ''F1'' and :dml.get_object_name() <> ''F5'' ) ');
end;
修改ddl傳播規則。
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F1'' and :dml.get_object_name() <> ''F5'' ) ');
end; 實際上增加的條件在dba_rules 表的RULE_CONDITION字段中有顯示,值如下。
(:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND? :ddl.is_null_tag() ='Y' AND? :ddl.get_source_database_name()= 'LIRHZ' and? (:dml.get_object_name() <> 'F1' and :dml.get_object_name() <> 'F5' )
??????????????????????????????????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_source_database_name()= 'LIRHZ' and? (:dml.get_object_name() <> 'F1' and :dml.get_object_name() <> 'F5' ) 源庫啟動傳播進程,
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR');
?
PL/SQL procedure successfully completed
?
源庫的f1,f5分別插入記錄。
SQL>? insert into test02.f1 values (33,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f1 values (34,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f5 values (34,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f5 values (33,'guangzhou');
1 row inserted
?
SQL> commit;
Commit complete
源庫可以看到新加的33,34記錄,
SQL> select * from test02.f5 where id in (33,34);
?
??????? ID NAME
---------- ----------
??????? 33 guangzhou
??????? 34 guangzhou
?
SQL> select * from test02.f1 where id in (33,34);
?
??????? ID NAME
---------- ----------
??????? 33 guangzhou
??????? 34 guangzhou
???????
??????? 轉到目標庫查詢時,無對應的33,34記錄
SQL> select * from test02.f5 where id in (33,34);
?
??????? ID NAME
---------- ----------
?
SQL> select * from test02.f1 where id in (33,34);
?
??????? ID NAME
---------- ----------
通過以上實驗可以證明,在傳播進程中設置條件也可以控制到那些表不傳輸。 但查看dba_capture視圖可以看到幾個scn號已經完全不一致了。因為捕獲的日志不一定都能應用了。
SQL> select capture_name,START_SCN,STATUS,CAPTURED_SCN,APPLIED_SCN? from dba_capture;
?
CAPTURE_NAME??????????????????? START_SCN STATUS?? CAPTURED_SCN APPLIED_SCN
------------------------------ ---------- -------- ------------ -----------
LIRHZ_CAPTURE????????????????? 2582441264 ENABLED??? 2582659272? 2582659140 繼續實驗:
? 實驗需求,取消在傳播進程規則中設置條件,修改為在捕獲進程中設置條件。設置F6,F7表不傳。 源庫關閉傳播進程。
SQL> exec dbms_propagation_adm.stop_propagation('PRI_TO_KLIR');
修改dml傳播規則。重新刪除F1,F5表的不傳條件。
sour> begin
dbms_rule_adm.alter_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' ');
end;
修改ddl傳播規則。
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end; 源庫啟動傳播進程。
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR'); 關閉捕獲進程
SQL> exec dbms_capture_adm.stop_capture('LIRHZ_CAPTURE');
源庫在f6,f7表中各插入2條記錄。 SQL> insert into test02.f6 values (20);
1 row inserted
?
SQL> insert into test02.f6 values (21);
1 row inserted
?
SQL> insert into test02.f7 values (21);
1 row inserted
?
SQL> insert into test02.f7 values (20);
1 row inserted
?
SQL> commit;
Commit complete
修改源庫的捕獲規則
?
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
?? ' :dml.is_null_tag() =''Y'' AND '||
?? ' :dml.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F6'' and :dml.get_object_name() <> ''F7'' ) ');
?? end;
??
sour> begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F6'' and :dml.get_object_name() <> ''F7'' ) ');
?? end; 啟動捕獲進程:
SQL> exec dbms_capture_adm.start_capture('LIRHZ_CAPTURE'); 查看目標庫的f6.f7表,修改捕獲規則前源庫插入的2個記錄不會再傳到目標庫了。
SQL> select * from test02.f6 where id in (20,21);
?
??????? ID
----------
?
SQL> select * from test02.f7 where id in (20,21);
?
??????? ID
----------
? 源庫創建f8表,
SQL> create table test02.f8 (id number,name varchar2(10));
?
Table created 目標庫能看到f8表已經傳輸。 SQL> select * from test02.f8;
?
??????? ID NAME
---------- ---------- 可以看到dba_capture字典中記錄的捕獲和應用scn是一樣的了。
SQL> select capture_name,START_SCN,STATUS,CAPTURED_SCN,APPLIED_SCN? from dba_capture;
?
CAPTURE_NAME??????????????????? START_SCN STATUS?? CAPTURED_SCN APPLIED_SCN
------------------------------ ---------- -------- ------------ -----------
LIRHZ_CAPTURE????????????????? 2582441264 ENABLED??? 2582752740? 2582752740
本次實驗參考了三思的一步步配置流系列文件,再次表示感謝!http://www.5ienet.com/note/html/streams/oracle10gr2_streams_single_source_rep_thr.shtml
drop user strmadmin cascade;
? 源庫建立strmadmin用戶,并授權.
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 目標庫建立strmadmin用戶,并授權.
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 授權Stream管理用戶 :
begin
dbms_streams_auth.grant_admin_privilege(grantee =>'strmadmin',grant_privileges => true);
end;
?
? --建立數據庫鏈
?切換回source數據庫,以streams的操作用戶stradmin連接? ,創建隊列 create database link klir connect to strmadmin identified by strmadmin using 'klir';
?exec dbms_streams_adm.set_up_queue();
?
?
?切換到target數據庫,以streams的操作用戶stradmin連接 ,創建隊列 create database link lirhz connect to strmadmin identified by strmadmin using 'lirhz';
? exec dbms_streams_adm.set_up_queue(); 手動建立傳播規則和傳播進程: 先建立一個傳播進程的規則集:
sour> begin
dbms_rule_adm.create_rule_set(
rule_set_name => 'strmadmin.propagation_rules',
evaluation_context => 'sys.streams$_evaluation_context');
end; 建立規則集后,會在(dba_rulesets、dba_rule_sets)表中建立propagation_rules規則。 創建傳播的dml規則。
sour> begin
dbms_rule_adm.create_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' ');
end;
??
寫入表:? dba_rules 創建傳播的ddl規則。
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end;
??
把dml、ddl規則添加到規則集中
??
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_dml',
?? rule_set_name => 'strmadmin.propagation_rules');
end; 把ddl規則添加到規則集合中 ,
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? rule_set_name => 'strmadmin.propagation_rules');
end;
創建propagation進程。 begin
?? dbms_propagation_adm.create_propagation(
?? propagation_name => 'pri_to_klir',
?? source_queue => 'strmadmin.streams_queue',
?? destination_queue => 'strmadmin.streams_queue',
?? destination_dblink => 'klir',
?? rule_set_name => 'strmadmin.propagation_rules');
?? end; 創建capture進程部分。
手動建立捕獲規則和捕獲進程: 創建規則集
sour> begin
?? dbms_rule_adm.create_rule_set(
?? rule_set_name => 'strmadmin.capture_rules',
?? evaluation_context => 'sys.streams$_evaluation_context');
?? end; 創建dml規則
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
?? ' :dml.is_null_tag() =''Y'' AND '||
?? ' :dml.get_source_database_name()= ''LIRHZ'' ');
?? end; 創建ddl規則??
sour> begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
?? end;
加入規則集。
sour> begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? rule_set_name => 'strmadmin.capture_rules');
?? end;
? sour> begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? rule_set_name => 'strmadmin.capture_rules');
?? end; 創建捕獲進程
?begin
?? dbms_capture_adm.create_capture(
?? queue_name => 'strmadmin.streams_queue',
?? capture_name => 'lirhz_capture',
?? rule_set_name => 'strmadmin.capture_rules');?? 使用捕獲的規則集。
?? end; 源庫建立的捕獲傳播規則 SQL>? select RULE_NAME,RULE_CONDITION from dba_rules where rule_owner='STRMADMIN';
?
RULE_NAME????????????????????? RULE_CONDITION
------------------------------ --------------------------------------------------------------------------------
MEMBER_CAP_DDL???????????????? (:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND
MEMBER_CAP_DML???????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_sour
MEMBER_PRO_DDL???????????????? (:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND
MEMBER_PRO_DML???????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_sour 源端準備實例SCN (如果是使用dbms_streams_adm包來配置就不需要此步驟,過程會自動進行配置。)。
begin
?? dbms_capture_adm.prepare_schema_instantiation(
?? schema_name => 'test02',
?? supplemental_logging => 'keys');
?? end;
目標庫做應用scn。
declare
?iscn number;
?begin
?iscn:=dbms_flashback.get_system_change_number();
?dbms_apply_adm.set_schema_instantiation_scn@klir(
?source_schema_name => 'test02',
?source_database_name => 'lirhz',
?instantiation_scn => iscn,
?recursive? => true);
end;
目標庫使用dbms_streams_adm。建立apply.建立后的規則由ORACLE自動命名。
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'test02',
streams_type => 'apply',
streams_name => 'apply_standy',
queue_name => 'strmadmin.STREAMS_QUEUE',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'lirhz',
inclusion_rule => true);
end;
設置異常規則。 啟動應用進程和傳播進程后,這樣單向schema級的數據就能同步了。忽略......... ======================================================== 我使用手動建立規則的方式去配置流,主要是考慮在實際應用中可以需要修改和維護同步規則,例如要設置源庫的個別表不傳到目標庫,有2種方式:
1.在傳播級別修改規則,即設置某些規則不傳播。
2.在捕獲級別修改規則,即設置某些規則不捕獲。
原先的傳播規則命令
begin
?? dbms_rule_adm.create_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end;
修改dml傳播規則。增加F1,F5的不傳條件。 sour> begin
dbms_rule_adm.alter_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' and ' ||
' (:dml.get_object_name() <> ''F1'' and :dml.get_object_name() <> ''F5'' ) ');
end;
修改ddl傳播規則。
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F1'' and :dml.get_object_name() <> ''F5'' ) ');
end; 實際上增加的條件在dba_rules 表的RULE_CONDITION字段中有顯示,值如下。
(:ddl.get_object_owner()='TEST02' OR? :ddl.get_base_table_owner() ='TEST02') AND? :ddl.is_null_tag() ='Y' AND? :ddl.get_source_database_name()= 'LIRHZ' and? (:dml.get_object_name() <> 'F1' and :dml.get_object_name() <> 'F5' )
??????????????????????????????????????????? :dml.get_object_owner()='TEST02' AND? :dml.is_null_tag() ='Y' AND? :dml.get_source_database_name()= 'LIRHZ' and? (:dml.get_object_name() <> 'F1' and :dml.get_object_name() <> 'F5' ) 源庫啟動傳播進程,
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR');
?
PL/SQL procedure successfully completed
?
源庫的f1,f5分別插入記錄。
SQL>? insert into test02.f1 values (33,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f1 values (34,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f5 values (34,'guangzhou');
1 row inserted
?
SQL>? insert into test02.f5 values (33,'guangzhou');
1 row inserted
?
SQL> commit;
Commit complete
源庫可以看到新加的33,34記錄,
SQL> select * from test02.f5 where id in (33,34);
?
??????? ID NAME
---------- ----------
??????? 33 guangzhou
??????? 34 guangzhou
?
SQL> select * from test02.f1 where id in (33,34);
?
??????? ID NAME
---------- ----------
??????? 33 guangzhou
??????? 34 guangzhou
???????
??????? 轉到目標庫查詢時,無對應的33,34記錄
SQL> select * from test02.f5 where id in (33,34);
?
??????? ID NAME
---------- ----------
?
SQL> select * from test02.f1 where id in (33,34);
?
??????? ID NAME
---------- ----------
通過以上實驗可以證明,在傳播進程中設置條件也可以控制到那些表不傳輸。 但查看dba_capture視圖可以看到幾個scn號已經完全不一致了。因為捕獲的日志不一定都能應用了。
SQL> select capture_name,START_SCN,STATUS,CAPTURED_SCN,APPLIED_SCN? from dba_capture;
?
CAPTURE_NAME??????????????????? START_SCN STATUS?? CAPTURED_SCN APPLIED_SCN
------------------------------ ---------- -------- ------------ -----------
LIRHZ_CAPTURE????????????????? 2582441264 ENABLED??? 2582659272? 2582659140 繼續實驗:
? 實驗需求,取消在傳播進程規則中設置條件,修改為在捕獲進程中設置條件。設置F6,F7表不傳。 源庫關閉傳播進程。
SQL> exec dbms_propagation_adm.stop_propagation('PRI_TO_KLIR');
修改dml傳播規則。重新刪除F1,F5表的不傳條件。
sour> begin
dbms_rule_adm.alter_rule(
rule_name => 'strmadmin.member_pro_dml',
condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
' :dml.is_null_tag() =''Y'' AND '||
' :dml.get_source_database_name()= ''LIRHZ'' ');
end;
修改ddl傳播規則。
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' ');
end; 源庫啟動傳播進程。
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR'); 關閉捕獲進程
SQL> exec dbms_capture_adm.stop_capture('LIRHZ_CAPTURE');
源庫在f6,f7表中各插入2條記錄。 SQL> insert into test02.f6 values (20);
1 row inserted
?
SQL> insert into test02.f6 values (21);
1 row inserted
?
SQL> insert into test02.f7 values (21);
1 row inserted
?
SQL> insert into test02.f7 values (20);
1 row inserted
?
SQL> commit;
Commit complete
修改源庫的捕獲規則
?
begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_cap_dml',
?? condition => ':dml.get_object_owner()=''TEST02'' AND ' ||
?? ' :dml.is_null_tag() =''Y'' AND '||
?? ' :dml.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F6'' and :dml.get_object_name() <> ''F7'' ) ');
?? end;
??
sour> begin
?? dbms_rule_adm.alter_rule(
?? rule_name => 'strmadmin.member_cap_ddl',
?? condition => '(:ddl.get_object_owner()=''TEST02'' OR ' ||
?? ' :ddl.get_base_table_owner() =''TEST02'') AND ' ||
?? ' :ddl.is_null_tag() =''Y'' AND '||
?? ' :ddl.get_source_database_name()= ''LIRHZ'' and ' ||
?? ' (:dml.get_object_name() <> ''F6'' and :dml.get_object_name() <> ''F7'' ) ');
?? end; 啟動捕獲進程:
SQL> exec dbms_capture_adm.start_capture('LIRHZ_CAPTURE'); 查看目標庫的f6.f7表,修改捕獲規則前源庫插入的2個記錄不會再傳到目標庫了。
SQL> select * from test02.f6 where id in (20,21);
?
??????? ID
----------
?
SQL> select * from test02.f7 where id in (20,21);
?
??????? ID
----------
? 源庫創建f8表,
SQL> create table test02.f8 (id number,name varchar2(10));
?
Table created 目標庫能看到f8表已經傳輸。 SQL> select * from test02.f8;
?
??????? ID NAME
---------- ---------- 可以看到dba_capture字典中記錄的捕獲和應用scn是一樣的了。
SQL> select capture_name,START_SCN,STATUS,CAPTURED_SCN,APPLIED_SCN? from dba_capture;
?
CAPTURE_NAME??????????????????? START_SCN STATUS?? CAPTURED_SCN APPLIED_SCN
------------------------------ ---------- -------- ------------ -----------
LIRHZ_CAPTURE????????????????? 2582441264 ENABLED??? 2582752740? 2582752740
本次實驗參考了三思的一步步配置流系列文件,再次表示感謝!http://www.5ienet.com/note/html/streams/oracle10gr2_streams_single_source_rep_thr.shtml
轉載于:https://blog.51cto.com/gaoshan/418540
總結
以上是生活随笔為你收集整理的手动建立规则方式创建stream环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RHEL/Fedora/CentOs的系
- 下一篇: IT规划的企业应用实践(8)研究的目的和