《Oracle高級復(fù)制技術(shù)介紹及應(yīng)用》引言:Oracle高級復(fù)制技術(shù)是Oracle最早提出的HA容災(zāi)解決方案,起源于Oracle8i系統(tǒng),至今在11G官方文檔上依然可以找到高級復(fù)制
高級復(fù)制技術(shù)是Oracle最早提出的HA容災(zāi)解決方案,起源于Oracle 8i系統(tǒng),至今在11G官方文檔上依然可以找到高級復(fù)制說明文檔。這個技術(shù)因為其古老我想大多數(shù)80后童靴只聞其聲~未聞其形。在生產(chǎn)環(huán)境下可能更沒有使用過。由于高級復(fù)制技術(shù)在當(dāng)下已經(jīng)屬于非主流漸漸的退出了其歷史舞臺,逐步被Data Guard、Golden Gate、Streams等新技術(shù)所代替,導(dǎo)致其沒落的原因是由于其本身機制問題,后面我們會介紹其原理和應(yīng)用場景。雖說這種技術(shù)非常的原始,但可能還有一些老系統(tǒng)會繼續(xù)使用著。一種技術(shù)我們需要知道其優(yōu)點、應(yīng)用場景、局限性、風(fēng)險性,這樣才能得心應(yīng)手,有針對性的去使用,例如 原始的匯編語言現(xiàn)在幾乎沒有人在使用了,但由于其接近硬件的特點,在某些嵌入式系統(tǒng)中效率是最快的。所以說非主流技術(shù)我們也應(yīng)該去了解一下,好的架構(gòu)師就是需要具備在N種不同技術(shù)簇中,選擇出最適合的。始終問自己:能不能壓縮成本,能不能解決問題,能不能更易用。
《心得體會》
系統(tǒng)不同,架構(gòu)不同,發(fā)現(xiàn)問題解決問題
好架構(gòu)是系統(tǒng)演進出來的
保持簡潔
易于擴展,監(jiān)控,容錯
一 高級復(fù)制技術(shù)應(yīng)用架構(gòu)
,當(dāng)操作完之后馬上觸發(fā)->傳遞->應(yīng)用
(4)和相關(guān)復(fù)制環(huán)境
(6)Master to Master提供節(jié)點冗余,負載均衡的復(fù)制方式
所有節(jié)點關(guān)系是對等的,數(shù)據(jù)是對等的,當(dāng)其中一個Master不可用時,可以直接切換到其他Master
負載均衡,例如有三個Master相互復(fù)制,用戶1&2&3可以分別連接這三個Master主節(jié)點,實現(xiàn)負載均衡
常用于容災(zāi)場景
(7)支持同步和異步復(fù)制
同步:可以實時推送,操作后立馬觸發(fā)->復(fù)制->應(yīng)用,因為復(fù)制的表上就建立了trigger和package。
異步:可以設(shè)置定時job(后臺進程控制),定時、批量的復(fù)制數(shù)據(jù),使用Deferred Transaction Queue實現(xiàn)。
(8)事務(wù)和依賴
高級復(fù)制自動處理事務(wù)的依賴關(guān)系,如果B事務(wù)訪問A事務(wù),并且A事務(wù)有更新,稱作B事務(wù)對A事務(wù)有依賴
高級復(fù)制自動解決數(shù)據(jù)的約束關(guān)系
高級復(fù)制根據(jù)分布式事務(wù)方式,解決事務(wù)的一致性問題,比GG、Streams對事務(wù)的控制力更強,對用戶操作參與更多,我們應(yīng)該盡量把用戶操作和數(shù)據(jù)復(fù)制分離開來,不要混淆在一起,提高系統(tǒng)的穩(wěn)定性、健壯性。
(9)基于物化視圖的高級復(fù)制
對網(wǎng)絡(luò)質(zhì)量要求不高,由于非實時傳遞,因此可以中斷
定時、批量的復(fù)制數(shù)據(jù),直接利用解析物化視圖日志的方式復(fù)制數(shù)據(jù)
原理圖
------------------------------ ---------------------------------------------------------------------------------
REP LEO1.COM 源庫 Y 發(fā)送主節(jié)點 Y
REP LEO2.COM 目標(biāo)庫 N 接收主節(jié)點 Y
目標(biāo)端也應(yīng)該可以查出
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
檢查源端和目標(biāo)端t表內(nèi)容,應(yīng)該都沒有數(shù)據(jù)
源端
AR@leo1> select * from t;
no rows selected
目標(biāo)端
AR@leo2> select * from t;
no rows selected
10.啟動復(fù)制組rep(就可以實現(xiàn)高級復(fù)制了)
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
解決方法
目標(biāo)端創(chuàng)建到源端dblink,因為兩端有信息交互,必須相通
REPADMIN@leo2> create database link leo1.com connect to repadmin identified by oracle using 'leo1';
Database link created.
必須重啟復(fù)制組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.
直到源端和目標(biāo)端的t表上都生成內(nèi)部觸發(fā)器、存儲過程、基表才能正常復(fù)制
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部分
目標(biāo)端,當(dāng)目標(biāo)庫t表上有這些東西時就可以正常復(fù)制了
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
再次測試
源庫,插入兩條記錄,當(dāng)提交之后才會復(fù)制到目標(biāo)庫
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.
目標(biāo)庫
AR@leo2> select * from t;
X
----------
1
2
源端,更新操作,提交之后才會傳到目標(biāo)庫
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.
目標(biāo)端
AR@leo2> select * from t;
X
----------
10
20
DDL操作測試,上面我們說過了高級復(fù)制是不支持DDL操作的
源端
AR@leo1> truncate table t;
Table truncated.
AR@leo1> select * from t;
no rows selected
目標(biāo)端并沒有被清空,源端的DDL操作并不會影響到目標(biāo)端的
AR@leo2> select * from t;
X
----------
10
20
自動解決數(shù)據(jù)的約束關(guān)系,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表上的有問題,而是當(dāng)事務(wù)發(fā)生后高級復(fù)制會立刻自動檢查兩端的數(shù)據(jù)約束關(guān)系,
當(dāng)發(fā)現(xiàn)目標(biāo)庫t表中有10這個值時,會立刻發(fā)出警告,,這個警告說明的是目標(biāo)庫上違反了約束關(guān)系~全局約束。
AR@leo2> select * from t;
X
----------
10
20
全局約束:這是由分布式事務(wù)引起的,如果發(fā)現(xiàn)整個分布式環(huán)境中有約束沖突的話,就會告警。
我們插入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
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com