日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

手动建立规则方式创建stream环境

發(fā)布時(shí)間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手动建立规则方式创建stream环境 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
之前學(xué)習(xí)和聯(lián)系stream環(huán)境時(shí),都用的是DBMS_STREAMS_ADM包來(lái)配置的,在創(chuàng)建捕獲進(jìn)程后,每次要修改捕獲規(guī)則時(shí),都會(huì)自動(dòng)增加新的捕獲規(guī)則,并且新的條件不能生效,必須要?jiǎng)h除原有的規(guī)則才可以。并且自動(dòng)生成的規(guī)則名不易看懂,管理起來(lái)比較麻煩,認(rèn)真學(xué)習(xí)了三思的大作 《 一步一步學(xué)Streams》后,嘗試用手動(dòng)建立規(guī)則的方式來(lái)搭建流環(huán)境,感覺(jué)比自動(dòng)生成規(guī)則的方式方便很多,以下是實(shí)驗(yàn)步驟: 刪除strmadmin 用戶,為了干凈的刪除stream的規(guī)則等對(duì)象:
drop user strmadmin cascade;
? 源庫(kù)建立strmadmin用戶,并授權(quán).
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 目標(biāo)庫(kù)建立strmadmin用戶,并授權(quán).
create user strmadmin identified by strmadmin default tablespace tbs_stream temporary tablespace temp;
grant connect,resource,dba,aq_administrator_role to strmadmin; 授權(quán)Stream管理用戶 :
begin
dbms_streams_auth.grant_admin_privilege(grantee =>'strmadmin',grant_privileges => true);
end;
?
? --建立數(shù)據(jù)庫(kù)鏈
?切換回source數(shù)據(jù)庫(kù),以streams的操作用戶stradmin連接? ,創(chuàng)建隊(duì)列 create database link klir connect to strmadmin identified by strmadmin using 'klir';
?exec dbms_streams_adm.set_up_queue();
?
?
?切換到target數(shù)據(jù)庫(kù),以streams的操作用戶stradmin連接 ,創(chuàng)建隊(duì)列 create database link lirhz connect to strmadmin identified by strmadmin using 'lirhz';
? exec dbms_streams_adm.set_up_queue(); 手動(dòng)建立傳播規(guī)則和傳播進(jìn)程: 先建立一個(gè)傳播進(jìn)程的規(guī)則集:
sour> begin
dbms_rule_adm.create_rule_set(
rule_set_name => 'strmadmin.propagation_rules',
evaluation_context => 'sys.streams$_evaluation_context');
end; 建立規(guī)則集后,會(huì)在(dba_rulesets、dba_rule_sets)表中建立propagation_rules規(guī)則。 創(chuàng)建傳播的dml規(guī)則。
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;
??
寫(xiě)入表:? dba_rules 創(chuàng)建傳播的ddl規(guī)則。
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規(guī)則添加到規(guī)則集中
??
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_dml',
?? rule_set_name => 'strmadmin.propagation_rules');
end; 把ddl規(guī)則添加到規(guī)則集合中 ,
begin
?? dbms_rule_adm.add_rule(
?? rule_name => 'strmadmin.member_pro_ddl',
?? rule_set_name => 'strmadmin.propagation_rules');
end;
創(chuàng)建propagation進(jìn)程。 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; 創(chuàng)建capture進(jìn)程部分。
手動(dòng)建立捕獲規(guī)則和捕獲進(jìn)程: 創(chuàng)建規(guī)則集
sour> begin
?? dbms_rule_adm.create_rule_set(
?? rule_set_name => 'strmadmin.capture_rules',
?? evaluation_context => 'sys.streams$_evaluation_context');
?? end; 創(chuàng)建dml規(guī)則
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; 創(chuàng)建ddl規(guī)則??
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;
加入規(guī)則集。
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; 創(chuàng)建捕獲進(jìn)程
?begin
?? dbms_capture_adm.create_capture(
?? queue_name => 'strmadmin.streams_queue',
?? capture_name => 'lirhz_capture',
?? rule_set_name => 'strmadmin.capture_rules');?? 使用捕獲的規(guī)則集。
?? end; 源庫(kù)建立的捕獲傳播規(guī)則 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 源端準(zhǔn)備實(shí)例SCN (如果是使用dbms_streams_adm包來(lái)配置就不需要此步驟,過(guò)程會(huì)自動(dòng)進(jìn)行配置。)。
begin
?? dbms_capture_adm.prepare_schema_instantiation(
?? schema_name => 'test02',
?? supplemental_logging => 'keys');
?? end;
目標(biāo)庫(kù)做應(yīng)用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;
目標(biāo)庫(kù)使用dbms_streams_adm。建立apply.建立后的規(guī)則由ORACLE自動(dòng)命名。
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;
設(shè)置異常規(guī)則。 啟動(dòng)應(yīng)用進(jìn)程和傳播進(jìn)程后,這樣單向schema級(jí)的數(shù)據(jù)就能同步了。忽略......... ======================================================== 我使用手動(dòng)建立規(guī)則的方式去配置流,主要是考慮在實(shí)際應(yīng)用中可以需要修改和維護(hù)同步規(guī)則,例如要設(shè)置源庫(kù)的個(gè)別表不傳到目標(biāo)庫(kù),有2種方式:
1.在傳播級(jí)別修改規(guī)則,即設(shè)置某些規(guī)則不傳播。
2.在捕獲級(jí)別修改規(guī)則,即設(shè)置某些規(guī)則不捕獲。
原先的傳播規(guī)則命令
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傳播規(guī)則。增加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傳播規(guī)則。
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; 實(shí)際上增加的條件在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' ) 源庫(kù)啟動(dòng)傳播進(jìn)程,
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR');
?
PL/SQL procedure successfully completed
?
源庫(kù)的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
源庫(kù)可以看到新加的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
???????
??????? 轉(zhuǎn)到目標(biāo)庫(kù)查詢時(shí),無(wú)對(duì)應(yīng)的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
---------- ----------
通過(guò)以上實(shí)驗(yàn)可以證明,在傳播進(jìn)程中設(shè)置條件也可以控制到那些表不傳輸。 但查看dba_capture視圖可以看到幾個(gè)scn號(hào)已經(jīng)完全不一致了。因?yàn)椴东@的日志不一定都能應(yīng)用了。
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 繼續(xù)實(shí)驗(yàn):
? 實(shí)驗(yàn)需求,取消在傳播進(jìn)程規(guī)則中設(shè)置條件,修改為在捕獲進(jìn)程中設(shè)置條件。設(shè)置F6,F7表不傳。 源庫(kù)關(guān)閉傳播進(jìn)程。
SQL> exec dbms_propagation_adm.stop_propagation('PRI_TO_KLIR');
修改dml傳播規(guī)則。重新刪除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傳播規(guī)則。
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; 源庫(kù)啟動(dòng)傳播進(jìn)程。
SQL> exec dbms_propagation_adm.start_propagation('PRI_TO_KLIR'); 關(guān)閉捕獲進(jìn)程
SQL> exec dbms_capture_adm.stop_capture('LIRHZ_CAPTURE');
源庫(kù)在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
修改源庫(kù)的捕獲規(guī)則
?
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; 啟動(dòng)捕獲進(jìn)程:
SQL> exec dbms_capture_adm.start_capture('LIRHZ_CAPTURE'); 查看目標(biāo)庫(kù)的f6.f7表,修改捕獲規(guī)則前源庫(kù)插入的2個(gè)記錄不會(huì)再傳到目標(biāo)庫(kù)了。
SQL> select * from test02.f6 where id in (20,21);
?
??????? ID
----------
?
SQL> select * from test02.f7 where id in (20,21);
?
??????? ID
----------
? 源庫(kù)創(chuàng)建f8表,
SQL> create table test02.f8 (id number,name varchar2(10));
?
Table created 目標(biāo)庫(kù)能看到f8表已經(jīng)傳輸。 SQL> select * from test02.f8;
?
??????? ID NAME
---------- ---------- 可以看到dba_capture字典中記錄的捕獲和應(yīng)用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
本次實(shí)驗(yàn)參考了三思的一步步配置流系列文件,再次表示感謝!http://www.5ienet.com/note/html/streams/oracle10gr2_streams_single_source_rep_thr.shtml

轉(zhuǎn)載于:https://blog.51cto.com/gaoshan/418540

總結(jié)

以上是生活随笔為你收集整理的手动建立规则方式创建stream环境的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。