使用dbms

來源:互聯網
上載者:User
進階|解決|資料|問題 使用dbms_rectifier_diff解決進階複製中的資料衝突問題作者:eygle出處:http://blog.eygle.com日期:January 19, 2005
« Oracle基於時間點的恢複 | Blog首頁 | 關於Oracle的衝突解決機制的研究 »

很多時候在進階複製中可能存在資料衝突和不一致現象。
Oracle提供的dbms_rectifier_diff包可以用於解決該衝突。

以下通過執行個體來說明一下該Package的用法。

1.建立複製組及複製對象


SQL> execute dbms_repcat.create_master_repgroup('rep_tt');
PL/SQL procedure successfully completed
SQL> select gname,master,status from dba_repgroup;
GNAME MASTER STATUS
------------------------------ ------ ---------
REP_TT Y QUIESCED






SQL> execute dbms_repcat.create_master_repobject(sname=>'hawa',oname=>'test', type=>'table',use_existing_object=>true,gname=>'rep_tt',copy_rows=>false);

PL/SQL procedure successfully completed

SQL>
SQL> execute dbms_repcat.generate_replication_support('hawa','test','table');

PL/SQL procedure successfully completed

SQL> select gname, master, status from dba_repgroup;

GNAME MASTER STATUS
------------------------------ ------ ---------
REP_TT Y QUIESCED

SQL> select * from dba_repobject;

SNAME ONAME TYPE STATUS GENERATION_STATUS ID OBJECT_COMMENT GNAME MIN_COMMUNICATION REPLICATION_TRIGGER_EXISTS INTERNAL_PACKAGE_EXISTS GROUP_OWNER NESTED_TABLE
------------------------------ ------------------------------ ---------------- ---------- ----------------- ---------- -------------------------------------------------------------------------------- -----------------
HAWA TEST TABLE VALID GENERATED 8620 REP_TT Y Y Y PUBLIC N
HAWA TEST$RP PACKAGE VALID 8641 SYSTEM-GENERATED: REPLICATION REP_TT PUBLIC
HAWA TEST$RP PACKAGE BODY VALID 8677 SYSTEM-GENERATED: REPLICATION REP_TT PUBLIC

3 rows selected

SQL>
SQL> execute dbms_repcat.add_master_database(gname=>'rep_tt',master=>'AUTHAA.COOLYOUNG.COM.CN',use_existing_objects=>true, copy_rows=>false, propagation_mode => 'synchronous');

PL/SQL procedure successfully completed


SQL> execute dbms_repcat.resume_master_activity('rep_tt',true);

PL/SQL procedure successfully completed

SQL> select * from dba_repgroup;

SNAME MASTER STATUS SCHEMA_COMMENT GNAME FNAME RPC_PROCESSING_DISABLED OWNER
-------- ------------------ ---- ------ ---- ---- -----------------------------------------------
REP_TT Y NORMAL REP_TT N PUBLIC

2.建立儲存衝突資料的資料表

a.missing_rows表用以儲存衝突行
SQL> create table hawa.missing_rows_test
2 as
3 select * from hawa.test where 1=0;

Table created

b.用於儲存缺失行位置及rowid
SQL> create table hawa.MISSING_LOCATION_TEST (
2 present VARCHAR2(128),
3 absent VARCHAR2(128),
4 r_id ROWID);

Table created

3.使用dbms_rectifier_diff.DIFFERENCES尋找缺失記錄


SQL> begin dbms_rectifier_diff.DIFFERENCES(
2 SNAME1 =>'HAWA',
3 ONAME1 =>'TEST',
4 REFERENCE_SITE =>'AVATAR.COOLYOUNG.COM.CN',
5 SNAME2 =>'HAWA',
6 ONAME2 =>'TEST',
7 COMPARISON_SITE =>'AUTHAA.COOLYOUNG.COM.CN',
8 WHERE_CLAUSE =>NULL,
9 COLUMN_LIST =>NULL,
10 MISSING_ROWS_SNAME =>'HAWA',
11 MISSING_ROWS_ONAME1 =>'MISSING_ROWS_TEST',
12 MISSING_ROWS_ONAME2 =>'MISSING_LOCATION_TEST',
13 MISSING_ROWS_SITE =>'AVATAR.COOLYOUNG.COM.CN',
14 MAX_MISSING =>500,
15 COMMIT_ROWS =>100
16 );
17 end;
18 /
PL/SQL procedure successfully completed





衝突記錄被儲存在我們建立的指定表中
SQL> select count(*) from hawa.missing_rows_test;

COUNT(*)
----------
172

共有172條差異記錄

SQL> select count(*) from hawa.test;

COUNT(*)
----------
548

SQL> select count(*) from hawa.test@authaa;

COUNT(*)
----------
376

SQL> select count(*) from hawa.missing_location_test;

COUNT(*)
----------
172

4.使用DBMS_RECTIFIER_DIFF.RECTIFY進行資料整合

首先需要注意的是:
RECTIFY過程使用DIFFERENCES產生的資料進行資料調整。
在第一個表中存在,在第二個表中不存在的資料將被插入第二張表。
在第二個表中存在,在第一個個表中不存在的資料將被從第二張表中刪除。

另外,在這個資料糾正過程中,你可以使用dbms_repcat.suspend_master_activity將複製組暫時掛起。
這樣便於保證資料完整性。
但這不是必須的,如果複製一直啟用,可能會有新的衝突出現。

SQL> BEGIN DBMS_RECTIFIER_DIFF.RECTIFY( 2 SNAME1 =>'HAWA', 3 ONAME1 =>'TEST', 4 REFERENCE_SITE =>'AVATAR.COOLYOUNG.COM.CN', 5 SNAME2 =>'HAWA', 6 ONAME2 =>'TEST', 7 COMPARISON_SITE =>'AUTHAA.COOLYOUNG.COM.CN', 8 COLUMN_LIST =>NULL, 9 MISSING_ROWS_SNAME =>'HAWA', 10 MISSING_ROWS_ONAME1 =>'MISSING_ROWS_TEST', 11 MISSING_ROWS_ONAME2 =>'MISSING_LOCATION_TEST', 12 MISSING_ROWS_SITE =>'AVATAR.COOLYOUNG.COM.CN', 13 COMMIT_ROWS =>100 14 ); 15 END; 16 /PL/SQL procedure successfully completedSQL> select count(*) from hawa.test@authaa; COUNT(*)---------- 548SQL> select count(*) from hawa.test; COUNT(*)---------- 548



資料矯正完成以後,資料會自動從missing_rows表中刪除。

SQL> select count(*) from hawa.missing_rows_test;

COUNT(*)
----------
0

SQL>


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。