《Oracle高級復制技術介紹及應用》引言:Oracle高級復制技術是Oracle最早提出的HA容災解決方案,起源于Oracle8i系統,至今在11G官方文檔上依然可以找到高級復制
高級復制技術是Oracle最早提出的HA容災解決方案,起源于Oracle 8i系統,至今在11G官方文檔上依然可以找到高級復制說明文檔。這個技術因為其古老我想大多數80后童靴只聞其聲~未聞其形。在生產環境下可能更沒有使用過。由于高級復制技術在當下已經屬于非主流漸漸的退出了其歷史舞臺,逐步被Data Guard、Golden Gate、Streams等新技術所代替,導致其沒落的原因是由于其本身機制問題,后面我們會介紹其原理和應用場景。雖說這種技術非常的原始,但可能還有一些老系統會繼續使用著。一種技術我們需要知道其優點、應用場景、局限性、風險性,這樣才能得心應手,有針對性的去使用,例如 原始的匯編語言現在幾乎沒有人在使用了,但由于其接近硬件的特點,在某些嵌入式系統中效率是最快的。所以說非主流技術我們也應該去了解一下,好的架構師就是需要具備在N種不同技術簇中,選擇出最適合的。始終問自己:能不能壓縮成本,能不能解決問題,能不能更易用。
《心得體會》
系統不同,架構不同,發現問題解決問題
好架構是系統演進出來的
保持簡潔
易于擴展,監控,容錯
一 高級復制技術應用架構
,當操作完之后馬上觸發->傳遞->應用
(4)和相關復制環境
(6)Master to Master提供節點冗余,負載均衡的復制方式
所有節點關系是對等的,數據是對等的,當其中一個Master不可用時,可以直接切換到其他Master
負載均衡,例如有三個Master相互復制,用戶1&2&3可以分別連接這三個Master主節點,實現負載均衡
常用于容災場景
(7)支持同步和異步復制
同步:可以實時推送,操作后立馬觸發->復制->應用,因為復制的表上就建立了trigger和package。
異步:可以設置定時job(后臺進程控制),定時、批量的復制數據,使用Deferred Transaction Queue實現。
(8)事務和依賴
高級復制自動處理事務的依賴關系,如果B事務訪問A事務,并且A事務有更新,稱作B事務對A事務有依賴
高級復制自動解決數據的約束關系
高級復制根據分布式事務方式,解決事務的一致性問題,比GG、Streams對事務的控制力更強,對用戶操作參與更多,我們應該盡量把用戶操作和數據復制分離開來,不要混淆在一起,提高系統的穩定性、健壯性。
(9)基于物化視圖的高級復制
對網絡質量要求不高,由于非實時傳遞,因此可以中斷
定時、批量的復制數據,直接利用解析物化視圖日志的方式復制數據
原理圖
------------------------------ ---------------------------------------------------------------------------------
REP LEO1.COM 源庫 Y 發送主節點 Y
REP LEO2.COM 目標庫 N 接收主節點 Y
目標端也應該可以查出
REPADMIN@leo2> select gname,dblink,masterdef,master from dba_repsites where gname='REP';
GNAME DBLINK MASTERDEF MASTER
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- - -
REP LEO1.COM Y Y
REP LEO2.COM N Y
檢查源端和目標端t表內容,應該都沒有數據
源端
AR@leo1> select * from t;
no rows selected
目標端
AR@leo2> select * from t;
no rows selected
10.啟動復制組rep(就可以實現高級復制了)
REPADMIN@leo1> execute ' 不能訪問源庫LEO1.COM
ORA-06550: line 1, column 8:
PLS-00201: identifier 'SYS@LEO1.COM' must be declared 必須聲明到源庫dblink
ORA-06550: line 1, column 8:
PL/SQL: Statement ignored
ORA-06550: line 1, column 7:
PLS-00352: Unable to access another database 'LEO1.COM'
ORA-06550: line 1, column 7:
PLS-00201: identifier 'SYS@LEO1.COM' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06512: at "SYS.DBMS_REPCAT_MAS", line 864
解決方法
目標端創建到源端dblink,因為兩端有信息交互,必須相通
REPADMIN@leo2> create database link leo1.com connect to repadmin identified by oracle using 'leo1';
Database link created.
必須重啟復制組rep
REPADMIN@leo1> execute dbms_repcat.suspend_master_activity('rep'); 暫停
PL/SQL procedure successfully completed.
REPADMIN@leo1> execute dbms_repcat.resume_master_activity('rep',true); 重啟
PL/SQL procedure successfully completed.
直到源端和目標端的t表上都生成內部觸發器、存儲過程、基表才能正常復制
REPADMIN@leo1> select sname,oname,gname,status from dba_repobject where gname='REP';
SNAME ONAME GNAME STATUS
------------------------------ ------------------------------ ------------------------------ ----------
AR T REP VALID
AR T$RP REP VALID
AR T$RP REP VALID
參考官方文檔地址:Database Advanced Replication Management API Reference書中的DBMS_REPCAT部分
目標端,當目標庫t表上有這些東西時就可以正常復制了
REPADMIN@leo2> select sname,oname,gname,status from dba_repobject where gname='REP';
SNAME ONAME GNAME STATUS
------------------------------ ------------------------------ ------------------------------ ----------
AR T REP VALID
AR T$RP REP VALID
AR T$RP REP VALID
再次測試
源庫,插入兩條記錄,當提交之后才會復制到目標庫
AR@leo1> insert into t values(1);
1 row created.
AR@leo1> select * from t;
X
----------
1
AR@leo1> insert into t values(2);
1 row created.
AR@leo1> select * from t;
X
----------
1
2
AR@leo1> commit;
Commit complete.
目標庫
AR@leo2> select * from t;
X
----------
1
2
源端,更新操作,提交之后才會傳到目標庫
AR@leo1> update t set x=10 where x=1;
1 row updated.
AR@leo1> update t set x=20 where x=2;
1 row updated.
AR@leo1> commit;
Commit complete.
目標端
AR@leo2> select * from t;
X
----------
10
20
DDL操作測試,上面我們說過了高級復制是不支持DDL操作的
源端
AR@leo1> truncate table t;
Table truncated.
AR@leo1> select * from t;
no rows selected
目標端并沒有被清空,源端的DDL操作并不會影響到目標端的
AR@leo2> select * from t;
X
----------
10
20
自動解決數據的約束關系,GG、Streams就不會自動解決
源庫
AR@leo1> insert into t values(10);
insert into t values(10)
*
ERROR at line 1:
ORA-00001: unique constraint (AR.SYS_C007046) violated 違反唯一約束
ORA-02063: preceding line from LEO2 來自于LEO2
說明:這個約束警告并不是源庫t表上的有問題,而是當事務發生后高級復制會立刻自動檢查兩端的數據約束關系,
當發現目標庫t表中有10這個值時,會立刻發出警告,,這個警告說明的是目標庫上違反了約束關系~全局約束。
AR@leo2> select * from t;
X
----------
10
20
全局約束:這是由分布式事務引起的,如果發現整個分布式環境中有約束沖突的話,就會告警。
我們插入30,就沒有問題,感覺比GG、streams速度還要快
AR@leo1> insert into t values(30);
1 row created.
AR@leo1> commit;
Commit complete.
AR@leo2> select * from t;
X
----------
10
20
30
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com