Oracle Data Guard 理论知识
RAC,?Data?Gurad,?Stream?是Oracle?高可用性體系中的三種工具,每個(gè)工具即可以獨(dú)立應(yīng)用,也可以相互配合。?他們各自的側(cè)重點(diǎn)不同,適用場(chǎng)景也不同。
RAC?它的強(qiáng)項(xiàng)在于解決單點(diǎn)故障和負(fù)載均衡,因此RAC?方案常用于7*24?的核心系統(tǒng),但RAC?方案中的數(shù)據(jù)只有一份,盡管可以通過(guò)RAID?等機(jī)制可以避免存儲(chǔ)故障,但是數(shù)據(jù)本身是沒(méi)有冗余的,容易形成單點(diǎn)故障。
Data?Gurad?通過(guò)冗余數(shù)據(jù)來(lái)提供數(shù)據(jù)保護(hù),Data?Gurad?通過(guò)日志同步機(jī)制保證冗余數(shù)據(jù)和主數(shù)據(jù)之前的同步,這種同步可以是實(shí)時(shí),延時(shí),同步,異步多種形式。Data?Gurad?常用于異地容災(zāi)和小企業(yè)的高可用性方案,雖然可以在Standby?機(jī)器上執(zhí)行只讀查詢,從而分散Primary?蘇菊哭的性能壓力,但是Data?Gurad?決不是性能解決方案。
Stream?是以Oracle?Advanced?Queue為基礎(chǔ)實(shí)現(xiàn)的數(shù)據(jù)同步,提供了多種級(jí)別的靈活配置,并且Oracle?提供了豐富的API等開(kāi)發(fā)支持,Stream?更適用在應(yīng)用層面的數(shù)據(jù)共享。
?
?
在Data?Gurad?環(huán)境中,至少有兩個(gè)數(shù)據(jù)庫(kù),一個(gè)處于Open?狀態(tài)對(duì)外提供服務(wù),這個(gè)數(shù)據(jù)庫(kù)叫作Primary?Database。?第二個(gè)處于恢復(fù)狀態(tài),叫作Standby?Database。?運(yùn)行時(shí)primary?Database?對(duì)外提供服務(wù),用戶在Primary?Database?上進(jìn)行操作,操作被記錄在聯(lián)機(jī)日志和歸檔日志中,這些日志通過(guò)網(wǎng)絡(luò)傳遞給Standby?Database。?這個(gè)日志會(huì)在Standby?Database?上重演,從而實(shí)現(xiàn)Primary?Database?和Standby?Database?的數(shù)據(jù)同步。
Oracle?Data?Gurad?對(duì)這一過(guò)程進(jìn)一步的優(yōu)化設(shè)計(jì),使得日志的傳遞,恢復(fù)工作更加自動(dòng)化,智能化,并且提供一系列參數(shù)和命令簡(jiǎn)化了DBA工作。
如果是可預(yù)見(jiàn)因素需要關(guān)閉Primary?Database,比如軟硬件升級(jí),可以把Standby?Database?切換為Primary?Database?繼續(xù)對(duì)外服務(wù),這樣即減少了服務(wù)停止時(shí)間,并且數(shù)據(jù)不會(huì)丟失。如果異常原因?qū)е?/span>Primary?Database?不可用,也可以把Standby?Database?強(qiáng)制切換為Primary?Database繼續(xù)對(duì)外服務(wù),這時(shí)數(shù)據(jù)損失成都和配置的數(shù)據(jù)保護(hù)級(jí)別有關(guān)系。因此Primary?和Standby?只是一個(gè)角色概念,并不固定在某個(gè)數(shù)據(jù)庫(kù)中。
?
?
?
一.?Data?Guard?架構(gòu)
DG架構(gòu)可以按照功能分成3個(gè)部分:
1)?日志發(fā)送(Redo?Send)
2)?日志接收(Redo?Receive)
3)?日志應(yīng)用(Redo?Apply)
?
1.?日志發(fā)送(Redo?Send)
?Primary?Database?運(yùn)行過(guò)程中,會(huì)源源不斷地產(chǎn)生Redo?日志,這些日志需要發(fā)送到Standy?Database。?這個(gè)發(fā)送動(dòng)作可以由Primary?Database?的LGWR?或者ARCH進(jìn)程完成,?不同的歸檔目的地可以使用不同的方法,但是對(duì)于一個(gè)目的地,只能選用一種方法。?選擇哪個(gè)進(jìn)程對(duì)數(shù)據(jù)保護(hù)能力和系統(tǒng)可用性有很大區(qū)別。?
?
1.1?使用ARCH?進(jìn)程
1)Primary?Database?不斷產(chǎn)生Redo?Log,這些日志被LGWR?進(jìn)程寫(xiě)到聯(lián)機(jī)日志。
2)當(dāng)一組聯(lián)機(jī)日志被寫(xiě)滿后,會(huì)發(fā)生日志切換(Log?Switch),并且會(huì)觸發(fā)本地歸檔,本地歸檔位置是采用?LOG_ARCHIVE_DEST_1='LOCATION=/path'?這種格式定義的。
如:alter?system?set?log_archive_dest_1?=?'LOCATION=/u01/arch'?scope=both;
3)完成本地歸檔后,聯(lián)機(jī)日志就可以被覆蓋重用。
4)ARCH?進(jìn)程通過(guò)Net?把歸檔日志發(fā)送給Standby?Database的RFS(Remote?File?Server)?進(jìn)程。
5)Standby?Database?端的RFS?進(jìn)程把接收的日志寫(xiě)入到歸檔日志。
6)Standby?Database?端的MRP(Managed?Recovery?Process)進(jìn)程(Redo?Apply)或者LSP?進(jìn)程(SQL?Apply)在Standby?Database上應(yīng)用這些日志,進(jìn)而同步數(shù)據(jù)。
?
用ARCH模式傳輸不寫(xiě)Standby?Redologs,直接保存成歸檔文件存放于Standby端。
?
說(shuō)明:
邏輯Standby接收后將其轉(zhuǎn)換成SQL語(yǔ)句,在Standby數(shù)據(jù)庫(kù)上執(zhí)行SQL語(yǔ)句實(shí)現(xiàn)同步,這種方式叫SQL?Apply。
物理Standby接收完Primary數(shù)據(jù)庫(kù)生成的REDO數(shù)據(jù)后,以介質(zhì)恢復(fù)的方式實(shí)現(xiàn)同步,這種方式也叫Redo?Apply。
?
注意:創(chuàng)建邏輯Standby數(shù)據(jù)庫(kù)要先創(chuàng)建一個(gè)物理Standby數(shù)據(jù)庫(kù),然后再將其轉(zhuǎn)換成邏輯Standby數(shù)據(jù)庫(kù)。
?
?
使用ARCH進(jìn)程傳遞最大問(wèn)題在于:?Primary?Database?只有在發(fā)生歸檔時(shí)才會(huì)發(fā)送日志到Standby?Database。?如果Primary?Database?異常宕機(jī),聯(lián)機(jī)日志中的Redo?內(nèi)容就會(huì)丟失,因此使用ARCH?進(jìn)程無(wú)法避免數(shù)據(jù)丟失的問(wèn)題,要想避免數(shù)據(jù)丟失,就必須使用LGWR,而使用LGWR?又分SYNC(同步)和ASYNC(異步)兩種方式。
?
在缺省方式下,Primary?Database使用的是ARCH進(jìn)程,參數(shù)設(shè)置如下:
alter?system?set?log_archive_dest_2?=?'SERVICE=ST'?scope=both;
?
1.2?使用LGWR?進(jìn)程的SYNC?方式
1)Primary?Database?產(chǎn)生的Redo?日志要同時(shí)寫(xiě)道日志文件和網(wǎng)絡(luò)。也就是說(shuō)LGWR進(jìn)程把日志寫(xiě)到本地日志文件的同時(shí)還要發(fā)送給本地的LNSn進(jìn)程(Network?Server?Process),再由LNSn(LGWR?Network?Server?process)進(jìn)程把日志通過(guò)網(wǎng)絡(luò)發(fā)送給遠(yuǎn)程的目的地,每個(gè)遠(yuǎn)程目的地對(duì)應(yīng)一個(gè)LNS進(jìn)程,多個(gè)LNS進(jìn)程能夠并行工作。
2)LGWR?必須等待寫(xiě)入本地日志文件操作和通過(guò)LNSn進(jìn)程的網(wǎng)絡(luò)傳送都成功,Primary?Database?上的事務(wù)才能提交,這也是SYNC的含義所在。
3)Standby?Database的RFS進(jìn)程把接收到的日志寫(xiě)入到Standby?Redo?Log日志中。
4)Primary?Database的日志切換也會(huì)觸發(fā)Standby?Database?上的日志切換,即Standby?Database?對(duì)Standby?Redo?Log的歸檔,然后觸發(fā)Standby?Database?的MRP或者LSP?進(jìn)程恢復(fù)歸檔日志。
?
因?yàn)?span style="font-family:'Times New Roman';">Primary?Database?的Redo?是實(shí)時(shí)傳遞的,于是Standby?Database?端可以使用兩種恢復(fù)方法:?
實(shí)時(shí)恢復(fù)(Real-Time?Apply):?只要RFS把日志寫(xiě)入Standby?Redo?Log?就會(huì)立即進(jìn)行恢復(fù);
歸檔恢復(fù):?在完成對(duì)Standby?Redo?Log?歸檔才觸發(fā)恢復(fù)。
?
??Primary?Database默認(rèn)使用ARCH進(jìn)程,如果使用LGWR進(jìn)程必須明確指定。使用LGWR?SYNC方式時(shí),可以同時(shí)使用NET_TIMEOUT參數(shù),這個(gè)參數(shù)單位是秒,代表如果多長(zhǎng)時(shí)間內(nèi)網(wǎng)絡(luò)發(fā)送沒(méi)有響應(yīng),LGWR?進(jìn)程會(huì)拋出錯(cuò)誤。?示例如下:
alter?system?set?log_archive_dest_2?=?'SERVICE=ST??LGWR??SYNC??NET_TIMEOUT=30'?scope=both;
?
1.3?使用LGWR進(jìn)程的ASYNC?方式
使用LGWR?SYNC方法的可能問(wèn)題在于,如果日志發(fā)送給Standby?Database過(guò)程失敗,LGWR進(jìn)程就會(huì)報(bào)錯(cuò)。也就是說(shuō)Primary?Database的LGWR?進(jìn)程依賴于網(wǎng)絡(luò)狀況,有時(shí)這種要求可能過(guò)于苛刻,這時(shí)就可以使用LGWR?ASYNC方式。?它的工作機(jī)制如下:
1)?Primary?Database?一段產(chǎn)生Redo?日志后,LGWR?把日志同時(shí)提交給日志文件和本地LNS?進(jìn)程,但是LGWR進(jìn)程只需成功寫(xiě)入日志文件就可以,不必等待LNSn進(jìn)程的網(wǎng)絡(luò)傳送成功。
2)?LNSn進(jìn)程異步地把日志內(nèi)容發(fā)送到Standby?Database。多個(gè)LNSn進(jìn)程可以并發(fā)發(fā)送。
3)?Primary?Database的Online?Redo?Log?寫(xiě)滿后發(fā)生Log?Switch,觸發(fā)歸檔操作,也觸發(fā)Standby?Database對(duì)Standby?Database對(duì)Standby?Redo?Log?的歸檔;然后觸發(fā)MRP或者LSP?進(jìn)程恢復(fù)歸檔日志。
?
因?yàn)?span style="font-family:'Times New Roman';">LGWR進(jìn)程不會(huì)等待LNSn進(jìn)程的響應(yīng)結(jié)果,所以配置LGWR?ASYNC方式時(shí)不需要NET_TIMEOUT參數(shù)。示例如下:
alter?system?set?log_archive_dest_2?=?'SERVICE=ST??LGWR??ASYNC?'?scope=both;
?
2.?日志接收(Redo?Receive)
Standby?Database?的RFS(Remote?File?Server)進(jìn)程接收到日志后,就把日志寫(xiě)到Standby?Redo?Log或者Archived?Log文件中,具體寫(xiě)入哪個(gè)文件,取決于Primary?的日志傳送方式和Standby?database的位置。如果寫(xiě)到Standby?Redo?Log文件中,則當(dāng)Primary?Database發(fā)生日志切換時(shí),也會(huì)觸發(fā)Standby?Database上的Standby?Redo?Log?的日志切換,并把這個(gè)Standby?Redo?Log?歸檔。?如果是寫(xiě)到Archived?Log,那么這個(gè)動(dòng)作本省也可以看作是個(gè)歸檔操作。
在日志接收中,需要注意的是歸檔日志會(huì)被放在什么位置:
1)?如果配置了STANDBY_ARCHIVE_DEST?參數(shù),則使用該參數(shù)指定的目錄。
2)?如果某個(gè)LOG_ARCHIVE_DEST_n?參數(shù)明確定義了VALID_FOR=(STANDBY_LOGFILE,*)選項(xiàng),則使用這個(gè)參數(shù)指定的目錄。
3)?如果數(shù)據(jù)庫(kù)的COMPATIBLE參數(shù)大于等于10.0,則選取任意一個(gè)LOG_ARCHIVE_DEST_n的值。
4)?如果STANDBY_ARCHIVE_DEST?和?LOG_ARCHIVE_DEST_n?參數(shù)都沒(méi)有配置,使用缺省的STANDBY_ARCHIVE_DEST參數(shù)值,這個(gè)缺省值是$ORACLE_HOME/dbs/arc.
?
3.?日志應(yīng)用(Redo?Apply)
日志應(yīng)用服務(wù),就是在Standby?Database上重演Primary?Database日志,從而實(shí)現(xiàn)兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步。?根據(jù)Standby?Database重演日志方式的不同,可分為物理Standby(Physical?Standby)?和?邏輯Standby(Logical?Standby)。
Physical?Standby?使用的是Media?Recovery?技術(shù),在數(shù)據(jù)塊級(jí)別進(jìn)行恢復(fù),這種方式?jīng)]有數(shù)據(jù)類型的限制,可以保證兩個(gè)數(shù)據(jù)庫(kù)完全一致。?Physical?Standby數(shù)據(jù)庫(kù)只能在Mount?狀態(tài)下進(jìn)行恢復(fù),也可以是打開(kāi),但只能已只讀方式打開(kāi),并且打開(kāi)時(shí)不能執(zhí)行恢復(fù)操作。
Logical?Standby?使用的是Logminer?技術(shù),通過(guò)把日志內(nèi)容還原成SQL?語(yǔ)句,然后SQL引擎執(zhí)行這些語(yǔ)句,Logminer?Standby不支持所有數(shù)據(jù)類型,可以在視圖DBA_LOGSTDBY_UNSUPPORTED?中查看不支持的數(shù)據(jù)類型,如果使用了這種數(shù)據(jù)類型,則不能保證數(shù)據(jù)庫(kù)完全一致。?Logical?Standby數(shù)據(jù)庫(kù)可以在恢復(fù)的同時(shí)進(jìn)行讀寫(xiě)操作。
?
Standby數(shù)據(jù)庫(kù)的相關(guān)進(jìn)程讀取接收到的REDO數(shù)據(jù)(可能來(lái)自于Standby端的歸檔文件,也可能來(lái)自于Standby?Redologs),再將其寫(xiě)入Standby數(shù)據(jù)庫(kù)。保存之后數(shù)據(jù)又是怎么生成的呢?兩種方式:物理Standby通過(guò)REDO應(yīng)用,邏輯Standby通過(guò)SQL應(yīng)用
?
根據(jù)Redo?Apply發(fā)生的時(shí)間可以分成兩種:?
一種是實(shí)時(shí)應(yīng)用(Real-Time?Apply),?這種方式必須Standby?Redo?Log,每當(dāng)日志被寫(xiě)入Standby?Redo?Log時(shí),就會(huì)觸發(fā)恢復(fù),使用這種方式的好處在與可以減少數(shù)據(jù)庫(kù)切換(Switchover?或者Failover)的時(shí)間,因?yàn)榍袚Q時(shí)間主要用在剩余日志的恢復(fù)上。?
另一種是歸檔時(shí)應(yīng)用,這種方式在Primary?Database發(fā)生日志切換,觸發(fā)Standby?Database?歸檔操作,歸檔完成后觸發(fā)恢復(fù)。?這也是默認(rèn)的恢復(fù)方式。
?
如果是Physical?Standby,可以使用下面命令啟用Real-Time:
Alter?database?recover?managed?standby?database?using?current?logfile;
?
如果是Logical?Standby,可以使用下面命令啟用Real-Time:
Alter?database?start?logical?standby?apply?immediate;
?
查看是否使用Real-Time?apply:
Select?recovery_mode?from?v$archive_dest_status;
?
?
SQL> set wrap off
SQL> select process,status,thread#,sequence#,client_pid from v$managed_standby;
PROCESS?? STATUS????????? THREAD#? SEQUENCE# CLIENT_PID
--------- ------------ ---------- ---------- -----------------------------------
ARCH????? CONNECTED???????????? 0????????? 0 240
ARCH????? CONNECTED???????????? 0????????? 0 196
ARCH????? CONNECTED???????????? 0????????? 0 1944
ARCH????? CONNECTED???????????? 0????????? 0 3956
MRP0????? WAIT_FOR_LOG????????? 1????? 30843 N/A
RFS?????? RECEIVING???????????? 1????? 30838 2620
RFS?????? RECEIVING???????????? 1????? 30837 2612
RFS?????? RECEIVING???????????? 1????? 30833 2652
RFS?????? ATTACHED????????????? 1????? 30841 2628
RFS?????? ATTACHED????????????? 1????? 30835 2604
RFS?????? ATTACHED????????????? 1????? 30842 2608
已選擇11行。?
?
?
二.?數(shù)據(jù)保護(hù)模式
Data?Guard?允許定義3鐘數(shù)據(jù)保護(hù)模式,分別是最大保護(hù)(Maximum?Protection),最大可用(Maximum?Availability)和?最大性能(Maximum?Performance)。
?
1.?最大保護(hù)(Maximum?Protection)
這種模式能夠確保絕無(wú)數(shù)據(jù)丟失。要實(shí)現(xiàn)這一步當(dāng)然是有代價(jià)的,它要求所有的事務(wù)在提交前其REDO不僅被寫(xiě)入到本地的Online?Redologs,還要同時(shí)寫(xiě)入到Standby數(shù)據(jù)庫(kù)的Standby?Redologs,并確認(rèn)REDO數(shù)據(jù)至少在一個(gè)Standby數(shù)據(jù)庫(kù)中可用(如果有多個(gè)的話),然后才會(huì)在Primary數(shù)據(jù)庫(kù)上提交。如果出現(xiàn)了什么故障導(dǎo)致Standby數(shù)據(jù)庫(kù)不可用的話(比如網(wǎng)絡(luò)中斷),Primary數(shù)據(jù)庫(kù)會(huì)被Shutdown,以防止數(shù)據(jù)丟失。
使用這種方式要求Standby?Database?必須配置Standby?Redo?Log,而Primary?Database必須使用LGWR,SYNC,AFFIRM?方式歸檔到Standby?Database.
?
2.?最高可用性(Maximum?availability)
這種模式在不影響Primary數(shù)據(jù)庫(kù)可用前提下,提供最高級(jí)別的數(shù)據(jù)保護(hù)策略。其實(shí)現(xiàn)方式與最大保護(hù)模式類似,也是要求本地事務(wù)在提交前必須至少寫(xiě)入一臺(tái)Standby數(shù)據(jù)庫(kù)的Standby?Redologs中,不過(guò)與最大保護(hù)模式不同的是,如果出現(xiàn)故障導(dǎo)致Standby數(shù)據(jù)庫(kù)無(wú)法訪問(wèn),Primary數(shù)據(jù)庫(kù)并不會(huì)被Shutdown,而是自動(dòng)轉(zhuǎn)為最高性能模式,等Standby數(shù)據(jù)庫(kù)恢復(fù)正常之后,Primary數(shù)據(jù)庫(kù)又會(huì)自動(dòng)轉(zhuǎn)換成最高可用性模式。
這種方式雖然會(huì)盡量避免數(shù)據(jù)丟失,但不能絕對(duì)保證數(shù)據(jù)完全一致。這種方式要求Standby?Database?必須配置Standby?Redo?Log,而Primary?Database必須使用LGWR,SYNC,AFFIRM?方式歸檔到Standby?Database.
?
3.?最高性能(Maximum?performance)
缺省模式。?這種模式在不影響Primary數(shù)據(jù)庫(kù)性能前提下,提供最高級(jí)別的數(shù)據(jù)保護(hù)策略。事務(wù)可以隨時(shí)提交,當(dāng)前Primary數(shù)據(jù)庫(kù)的REDO數(shù)據(jù)至少需要寫(xiě)入一個(gè)Standby數(shù)據(jù)庫(kù),不過(guò)這種寫(xiě)入可以是不同步的。如果網(wǎng)絡(luò)條件理想的話,這種模式能夠提供類似最高可用性的數(shù)據(jù)保護(hù),而僅對(duì)Primary數(shù)據(jù)庫(kù)的性能有輕微影響。這也是創(chuàng)建Standby數(shù)據(jù)庫(kù)時(shí),系統(tǒng)的默認(rèn)保護(hù)模式。
這種方式可以使用LGWR?ASYNC?或者?ARCH?進(jìn)程實(shí)現(xiàn),Standby?Database也不要求使用Standby?Redo?Log。
?
4.?修改數(shù)據(jù)保護(hù)模式步驟
1)關(guān)閉數(shù)據(jù)庫(kù),重啟到Mount?狀態(tài),如果是RAC,需要關(guān)閉所有實(shí)例,然后只啟動(dòng)一個(gè)實(shí)例到mount狀態(tài)。
2)修改模式:
語(yǔ)法:ALTER?DATABASE?SET?STANDBY?DATABASE?TO?MAXIMIZE?{PROTECTION?|?AVAILABILITY?|?PERFORMANCE};?
如:SQL>ALTER?DATABASE?SET?STANDBY?DATABASE?TO?MAXIMIZE?PROTECTION;
3)?打開(kāi)數(shù)據(jù)庫(kù):?alter?database?open;
4)?確認(rèn)修改數(shù)據(jù)保護(hù)模式:
SQL>select?protection_mode,protection_level?from?v$database;?
?
?
?
三.?自動(dòng)裂縫檢測(cè)和解決
?
??????當(dāng)Primary?Database的某些日志沒(méi)有成功發(fā)送到Standby?Database,?這時(shí)候發(fā)生餓了歸檔裂縫(Archive?Gap)。
缺失的這些日志就是裂縫(Gap)。?Data?Guard能夠自動(dòng)檢測(cè),解決歸檔裂縫,不需要DBA的介入。這需要配置FAL_CLIENT,?FAL_SERVER?這兩個(gè)參數(shù)(FAL:?Fetch?Archive?Log)。
從FAL?這個(gè)名字可以看出,這個(gè)過(guò)程是Standby?Database主動(dòng)發(fā)起的“取”日志的過(guò)程,Standby?Database?就是FAL_CLIENT.?它是從FAL_SERVER中取這些Gap,?10g中,這個(gè)FAL_SERVER可以是Primary?Database,?也可以是其他的Standby?Database。
如:FAL_SERVER='PR1,ST1,ST2';
FAL_CLIENT和FAL_SERVER兩個(gè)參數(shù)都是Oracle?Net?Name。?FAL_CLIENT?通過(guò)網(wǎng)絡(luò)向FAL_SERVER發(fā)送請(qǐng)求,FAL_SERVER通過(guò)網(wǎng)絡(luò)向FAL_CLIENT發(fā)送缺失的日志。?但是這兩個(gè)連接不一定是一個(gè)連接。?因此FAL_CLIENT向FAL_SERVER發(fā)送請(qǐng)求時(shí),會(huì)攜帶FAL_CLIENT參數(shù)值,用來(lái)告訴FAL_SERVER應(yīng)該向哪里發(fā)送缺少的日志。?這個(gè)參數(shù)值也是一個(gè)Oracle?Net?Name,這個(gè)Name是在FAL_SERVER上定義的,用來(lái)指向FAL_CLIENT.
?
當(dāng)然,除了自動(dòng)地日志缺失解決,DBA?也可以手工解決。?具體操作步驟如下:
?
1)?查看是否有日志GAP:?
????SQL>?SELECT?UNIQUE?THREAD#,?MAX(SEQUENCE#)?OVER(PARTITION?BY?THREAD#)?LAST?FROM?V$ARCHIVED_LOG;?
?
SQL>?SELECT?THREAD#,?LOW_SEQUENCE#,?HIGH_SEQUENCE#?FROM?V$ARCHIVE_GAP;?
??2)?如果有,則拷貝過(guò)來(lái)
3)?手工的注冊(cè)這些日志:?
SQL>?ALTER?DATABASE?REGISTER?LOGFILE?'路徑';?
?
?
?
?
四.?指定日志發(fā)送對(duì)象
?
1.VALID_FOR屬性指定傳輸及接收對(duì)象
LOG_ARCHIVE_DEST_n參數(shù)中的VALID_FOR屬性,用來(lái)指定傳輸?shù)膬?nèi)容。從字面理解VALID_FOR就是基于那誰(shuí)有效,該屬性有兩個(gè)參數(shù)值需要指定:REDO_LOG_TYPE和DATABASE_ROLE,我們基本上可以將其理解為:發(fā)送指定角色生成的指定類型的日志文件,該參數(shù)的主要目的是為了確保,一旦發(fā)生角色切換操作后數(shù)據(jù)庫(kù)的正常運(yùn)轉(zhuǎn)。
其中,REDO_LOG_TYPE和DATABASE_ROLE兩個(gè)參數(shù)可供選擇的參數(shù)值如下:
REDO_LOG_TYPE:可設(shè)置為ONLINE_LOGFILE、STANDBY_LOGFILE、ALL_LOGFILES。??
DATABASE_ROLE:可設(shè)置為PRIMARY_ROLE、STANDBY_ROLE、ALL_ROLES。?
?
注意:VALID_FOR參數(shù)默認(rèn)值是:VALID_FOR=(ALL_LOGFILES,ALL_ROLES)。?
?
推薦手動(dòng)設(shè)置該參數(shù)而不要使用默認(rèn)值,在某些情況下默認(rèn)的參數(shù)值不一定合適,如邏輯Standby在默認(rèn)情況下就處于OPEN?READ?WRITE模式,不僅有REDO數(shù)據(jù)而且還包含多種日志文件(Online?Redologs、Archived?Redologs及Standby?Redologs)。
默認(rèn)情況下,邏輯Standby數(shù)據(jù)庫(kù)生成的歸檔文件和接收到的歸檔文件在相同的路徑下,這既不便于管理,也極有可能帶來(lái)一些隱患。建議對(duì)每個(gè)LOG_ARCHIVE_DEST_n參數(shù)設(shè)置合適的VALID_FOR屬性。本地生成的歸檔文件和接收到的歸檔文件最好分別保存于不同路徑下。
?
2.通過(guò)DB_UNIQUE_NAME屬性指定數(shù)據(jù)庫(kù)
DB_UNIQUE_NAME屬性是10g版本新增加的一個(gè)關(guān)鍵字,在之前版本并沒(méi)有這一說(shuō)法。該屬性的作用是指定唯一的Oracle數(shù)據(jù)庫(kù)名稱,也正因有了DB_UNIQUE_NAME,REDO數(shù)據(jù)在傳輸過(guò)程中才能確認(rèn)傳輸?shù)?/span>DBA希望被傳輸?shù)降臄?shù)據(jù)庫(kù)上。
當(dāng)然要確保REDO數(shù)據(jù)被傳輸?shù)街付ǚ?wù)器,除了在LOG_ARCHIVE_DEST_n參數(shù)中指定正確DB_UNIQUE_NAME屬性之外,還有一個(gè)初始化參數(shù)LOG_ARCHIVE_CONFIG也需要進(jìn)行正確的配置。該參數(shù)除了指定Data?Guard環(huán)境中的唯一數(shù)據(jù)庫(kù)名外,還包括幾個(gè)屬性,用來(lái)控制REDO數(shù)據(jù)的傳輸和接收:
SEND:允許數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)到遠(yuǎn)端。
RECEIVE:允許Standby接收來(lái)自其他數(shù)據(jù)庫(kù)的數(shù)據(jù)。
NOSEND,NORECEIVE:自然就是禁止嘍。
?
例如,設(shè)置Primary數(shù)據(jù)庫(kù)不接收任何歸檔數(shù)據(jù),可以做如下的設(shè)置:
LOG_ARCHIVE_CONFIG='NORECEIVE,DG_CONFIG=?(PRI,ST)?'?
如果做了如上的設(shè)置,如果該服務(wù)器發(fā)生了角色切換,那它也沒(méi)有接收REDO數(shù)據(jù)的能力。
?
?
?
?
五.?Data?Guard環(huán)境應(yīng)配置的初始化參數(shù)
?
?
| 下列參數(shù)為Primary角色相關(guān)的初始化參數(shù) | |
| DB_NAME | 注意保持同一個(gè)Data?Guard中所有數(shù)據(jù)庫(kù)DB_NAME相同 例如:DB_NAME=Dave |
| DB_UNIQUE_NAME | 為每一個(gè)數(shù)據(jù)庫(kù)指定一個(gè)唯一的名稱,該參數(shù)一經(jīng)指定不會(huì)再發(fā)生變化,除非DBA主動(dòng)修改它 例如:DB_UNIQUE_NAME=DavePre |
| LOG_ARCHIVE_CONFIG | 該參數(shù)用來(lái)控制從遠(yuǎn)端數(shù)據(jù)庫(kù)接收或發(fā)送REDO數(shù)據(jù),通過(guò)DG_CONFIG屬性羅列同一個(gè)Data?Guard中所有DB_UNIQUE_NAME(含Primary數(shù)據(jù)庫(kù)和Standby數(shù)據(jù)庫(kù)),以逗號(hào)分隔,SEND/NOSEND屬性控制是否可以發(fā)送,RECEIVE/NORECEIVE屬性控制是否能夠接收 例如:LOG_ARCHIVE_CONFIG='DG_CONFIG=(DavePre,DaveDG)' |
| LOG_ARCHIVE_DEST_n | 歸檔文件的生成路徑。該參數(shù)非常重要,并且屬性和子參數(shù)也特別多(可以直接查詢Oracle官方文檔。Data?Guard白皮書(shū)第14章專門(mén)介紹了該參數(shù)各屬性及子參數(shù)的功能和設(shè)置)。例如: LOG_ARCHIVE_DEST_1='LOCATION=l:/oracle/oradata/Dave?VALID_FOR=(ALL_LOGFILES,ALL_ROLES)?DB_UNIQUE_NAME=DavePre' |
| LOG_ARCHIVE_DEST_STATE_n | 是否允許REDO傳輸服務(wù)傳輸REDO數(shù)據(jù)到指定的路徑。該參數(shù)共擁有4個(gè)屬性值,功能各不相同。 |
| REMOTE_LOGIN_PASSWORDFILE | 推薦設(shè)置參數(shù)值為EXCLUSIVE或者SHARED,注意保證相同Data?Guard配置中所有DB服務(wù)器SYS密碼相同 |
| 以下參數(shù)為與Standby角色相關(guān)的參數(shù)(建議在Primary數(shù)據(jù)庫(kù)的初始化參數(shù)中也進(jìn)行設(shè)置,這樣即使發(fā)生角色切換,新的Standby也能直接正常運(yùn)行) | |
| FAL_SERVER | 指定一個(gè)Net服務(wù)名,該參數(shù)值對(duì)應(yīng)的數(shù)據(jù)庫(kù)應(yīng)為Primary角色。當(dāng)本地?cái)?shù)據(jù)庫(kù)為Standby角色時(shí),如果發(fā)現(xiàn)存在歸檔中斷的情況,該參數(shù)用來(lái)指定獲取中斷的歸檔文件的服務(wù)器 例如:FAL_SERVER=DavePre 提示:FAL是Fetch?Archived?Log的縮寫(xiě) FAL_SERVER參數(shù)支持多個(gè)參數(shù)值的喲,相互間以逗號(hào)分隔 |
| FAL_CLIENT | 又指定一個(gè)Net服務(wù)名,該參數(shù)對(duì)應(yīng)數(shù)據(jù)庫(kù)應(yīng)為Standby角色。當(dāng)本地?cái)?shù)據(jù)庫(kù)以Primary角色運(yùn)行時(shí),向參數(shù)值中指定的站點(diǎn)發(fā)送中斷的歸檔文件 例如:FAL_CLIENT=DaveDG FAL_CLIENT參數(shù)也支持多個(gè)參數(shù)值,相互間以逗號(hào)分隔。 |
| DB_FILE_NAME_CONVERT | Standby數(shù)據(jù)庫(kù)的數(shù)據(jù)文件路徑與Primary數(shù)據(jù)庫(kù)數(shù)據(jù)文件路徑不一致時(shí),可以通過(guò)設(shè)置DB_FILE_NAME_CONVERT參數(shù)的方式讓其自動(dòng)轉(zhuǎn)換。該參數(shù)值應(yīng)該成對(duì)出現(xiàn),前面的值表示轉(zhuǎn)換前的形式,后面的值表示轉(zhuǎn)換后的形式 例如:DB_FILE_NAME_CONVERT='f:/oradata/DavePre','l:/oradata/DaveDG' |
| LOG_FILE_NAME_CONVERT | ??使用方式與上相同,只不過(guò)LOG_FILE_NAME_CONVERT專用來(lái)轉(zhuǎn)換日志文件路徑 例如: LOG_FILE_NAME_CONVERT='f:/oradata/DavePre','l:/oradata/DaveDG' |
| STANDBY_FILE_MANAGEMENT | 如果Primary數(shù)據(jù)庫(kù)數(shù)據(jù)文件發(fā)生修改(如新建、重命名等)則按照本參數(shù)的設(shè)置在Standby數(shù)據(jù)庫(kù)中作相應(yīng)修改。設(shè)為AUTO表示自動(dòng)管理。設(shè)為MANUAL表示需要手工管理 例如:STANDBY_FILE_MANAGEMENT=AUTO |
?
?
對(duì)于歸檔失敗的處理,LOG_ARCHIVE_DEST_n參數(shù)有幾個(gè)屬性,可以用來(lái)控制歸檔過(guò)程中出現(xiàn)故障時(shí)應(yīng)該采取的措施。
1.REOPEN?指定時(shí)間后再次嘗試歸檔
使用REOPEN=seconds(默認(rèn)為300秒)屬性,在指定時(shí)間重復(fù)嘗試向歸檔目的地進(jìn)行歸檔操作,如果該參數(shù)值設(shè)置為0,則一旦失敗就不會(huì)再嘗試重新連接并發(fā)送,直到下次REDO數(shù)據(jù)再被歸檔時(shí)會(huì)重新嘗試。
例如,設(shè)置REOPEN為100秒:
LOG_ARCHIVE_DEST_2='SERVICE=DavePrimary?LGWR?ASYNC?REOPEN=100'?
2.ALTERNATE?指定替補(bǔ)的歸檔目的地
ALTERNATE屬性定義一個(gè)替補(bǔ)的歸檔目的地,所謂替補(bǔ)就是一旦主歸檔目的地因各種原因無(wú)法使用,則臨時(shí)向ALTERNATE屬性中指定的路徑寫(xiě)。
例如:
LOG_ARCHIVE_DEST_1='LOCATION=/disk1?ALTERNATE=LOG_ARCHIVE_DEST_2'?
LOG_ARCHIVE_DEST_STATE_1=ENABLE??
LOG_ARCHIVE_DEST_2='LOCATION=/disk2'?
LOG_ARCHIVE_DEST_STATE_2=ALTERNATE?
上述參數(shù)設(shè)置歸檔路徑為/disk1,當(dāng)/disk1路徑下無(wú)法成功歸檔時(shí),自動(dòng)嘗試向/disk2路徑下歸檔文件。
從功能上來(lái)看,REOPEN與ALTERNATE是有一定重復(fù)的,不過(guò)需要注意一點(diǎn),REOPEN屬性比ALTERNATE屬性的優(yōu)先級(jí)要高,如果你指定REOPEN屬性的值>0,則LGWR(或ARCn)進(jìn)程會(huì)首先嘗試向主歸檔目的地寫(xiě)入,直到達(dá)到最大重試次數(shù),如果仍然寫(xiě)入失敗,才會(huì)向ALTERNATE屬性指定的路徑寫(xiě)。
?
3.MAX_FAILURE?控制失敗嘗試次數(shù)
用REOPEN指定失敗后重新嘗試的時(shí)間周期,MAX_FAILURE則控制失敗嘗試的次數(shù)。
例如,設(shè)置LOG_ARCHIVE_DEST_1在本地歸檔文件時(shí),如果遇到錯(cuò)誤,則每隔100秒嘗試一次,共嘗試不超過(guò)3次,設(shè)置如下:
LOG_ARCHIVE_DEST_1='LOCATION=E:/ora10g/oradata/jsspdg/?REOPEN=100?MAX_FAILURE=3'??
?
?
?
?
六.?物理Standby?和邏輯Standby?的區(qū)別
Standby數(shù)據(jù)庫(kù)類型分為兩類:物理Standby和邏輯Standby。
?
1.物理Standby
我們知道物理Standby與Primary數(shù)據(jù)庫(kù)完全一模一樣,DG通過(guò)REDO應(yīng)用來(lái)維護(hù)物理Standby數(shù)據(jù)庫(kù)。
通常在物理Standby沒(méi)有執(zhí)行REDO應(yīng)用操作的時(shí)候,可以將物理Standby數(shù)據(jù)庫(kù)以READ?ONLY模式打開(kāi),如果數(shù)據(jù)庫(kù)中指定了Flashback?Area的話,甚至還可以被臨時(shí)性的置為READ?WRITE模式,操作完之后再通過(guò)Flashback?Database特性恢復(fù)回READ?WRITE前的狀態(tài),以便繼續(xù)接收Primary端發(fā)送的REDO并應(yīng)用。
REDO應(yīng)用。物理Standby通過(guò)REDO應(yīng)用來(lái)保持與Primary數(shù)據(jù)庫(kù)的一致性,所謂的REDO應(yīng)用,實(shí)質(zhì)是通過(guò)Oracle的恢復(fù)機(jī)制,應(yīng)用歸檔文件(或Standby?Redologs文件)中的REDO數(shù)據(jù)。恢復(fù)操作屬于塊對(duì)塊的應(yīng)用。如果正在執(zhí)行REDO應(yīng)用的操作,Oracle數(shù)據(jù)庫(kù)就不能被Open。
READ?ONLY模式打開(kāi)。以READ?ONLY模式打開(kāi)后,可以在Standby數(shù)據(jù)庫(kù)執(zhí)行查詢或備份等操作(變相減輕Primary數(shù)據(jù)庫(kù)壓力)。此時(shí)Standby數(shù)據(jù)庫(kù)仍然能夠繼續(xù)接收Primary數(shù)據(jù)庫(kù)發(fā)送的REDO數(shù)據(jù),不過(guò)并不會(huì)應(yīng)用,直到Standby數(shù)據(jù)庫(kù)重新恢復(fù)REDO應(yīng)用。
也就是說(shuō)在READ?ONLY模式下不能執(zhí)行REDO應(yīng)用,REDO應(yīng)用時(shí)數(shù)據(jù)庫(kù)肯定處于未打開(kāi)狀態(tài)。如果需要的話,你可以在兩種狀態(tài)間轉(zhuǎn)換,如先應(yīng)用REDO,然后將數(shù)據(jù)庫(kù)置為READ?ONLY狀態(tài),需要與Primary同步時(shí)再次執(zhí)行REDO應(yīng)用命令,切換回REDO應(yīng)用狀態(tài)。呵呵,人生就是循環(huán),數(shù)據(jù)庫(kù)也是一樣。
?
提?示:?Oracle?11g版本中增強(qiáng)物理Standby的應(yīng)用功能,在11g版本中,物理Standby可以在OPEN?READ?ONLY模式下繼續(xù)應(yīng)用REDO數(shù)據(jù),這就極大地提升了物理Standby數(shù)據(jù)庫(kù)的應(yīng)用場(chǎng)合。
?
READ?WRITE模式打開(kāi)。如果以READ?WRITE模式打開(kāi),那么Standby數(shù)據(jù)庫(kù)將暫停從Primary數(shù)據(jù)庫(kù)接收REDO數(shù)據(jù),并且暫時(shí)失去災(zāi)難保護(hù)的功能。當(dāng)然,以READ?WRITE模式打開(kāi)也并非一無(wú)是處,如你可能需要臨時(shí)調(diào)試一些數(shù)據(jù),但又不方便在正式庫(kù)中操作,那就可以臨時(shí)將Standby數(shù)據(jù)庫(kù)置為READ?WRITE模式,操作完之后將數(shù)據(jù)庫(kù)閃回到操作前的狀態(tài)(閃回之后,Data?Guard會(huì)自動(dòng)同步,不需要重建物理Standby,不過(guò)如果從另一個(gè)方向看,沒(méi)有啟動(dòng)閃回,那就回不到READ?WRITE前的狀態(tài)了)。
?
物理Standby特點(diǎn)如下:
(1)災(zāi)難恢復(fù)及高可用性。物理Standby提供了一個(gè)健全、高效的災(zāi)難恢復(fù),以及高可用性的解決方案。更加易于管理switchover/failover角色轉(zhuǎn)換及在更短的計(jì)劃內(nèi)或計(jì)劃外停機(jī)時(shí)間。
(2)數(shù)據(jù)保護(hù)。使用物理Standby數(shù)據(jù)庫(kù),DG能夠確保即使面對(duì)無(wú)法預(yù)料的災(zāi)害也能夠不丟失數(shù)據(jù)。前面也提到物理Standby是基于塊對(duì)塊的復(fù)制,因此與對(duì)象、語(yǔ)句無(wú)關(guān),Primary數(shù)據(jù)庫(kù)上有什么,物理Standby數(shù)據(jù)庫(kù)端也會(huì)有什么。
(3)分擔(dān)Primary數(shù)據(jù)庫(kù)壓力。通過(guò)將一些備份任務(wù)、僅查詢的需求轉(zhuǎn)移到物理Standby數(shù)據(jù)庫(kù),可以有效節(jié)省Primary數(shù)據(jù)庫(kù)的CPU及I/O資源。
(4)提升性能。物理Standby所使用的REDO應(yīng)用技術(shù)使用最底層的恢復(fù)機(jī)制,這種機(jī)制能夠繞過(guò)SQL級(jí)代碼層,因此效率最高。
?
?
2.邏輯Standby
邏輯Standby也要通過(guò)Primary數(shù)據(jù)庫(kù)(或其備份,或其復(fù)制庫(kù),如物理Standby)創(chuàng)建,因此在創(chuàng)建之初與物理Standby數(shù)據(jù)庫(kù)類似。不過(guò)由于邏輯Standby通過(guò)SQL應(yīng)用的方式應(yīng)用REDO數(shù)據(jù),因此邏輯Standby的物理文件結(jié)構(gòu),甚至數(shù)據(jù)的邏輯結(jié)構(gòu)都可以與Primary不一致。
與物理Standby不同,邏輯Standby正常情況下是以READ?WRITE模式打開(kāi),用戶可以在任何時(shí)候訪問(wèn)邏輯Standby數(shù)據(jù)庫(kù),就是說(shuō)邏輯Standby是在OPEN狀態(tài)執(zhí)行SQL應(yīng)用。同樣有利也有弊,由于SQL應(yīng)用自身特點(diǎn),邏輯Standby對(duì)于某些數(shù)據(jù)類型及一些DDL/DML語(yǔ)句會(huì)有操作上的限制。可以在視圖DBA_LOGSTDBY_UNSUPPORTED?中查看不支持的數(shù)據(jù)類型,如果使用了這種數(shù)據(jù)類型,則不能保證數(shù)據(jù)庫(kù)完全一致。
????邏輯Standby?的讀寫(xiě)打開(kāi)可以使它做報(bào)表系統(tǒng),這樣減輕系統(tǒng)的壓力。
?
除了上述物理Standby中提到的類似災(zāi)難恢復(fù)、高可用性及數(shù)據(jù)保護(hù)等特點(diǎn)之外,邏輯Standby還有下列一些特點(diǎn):
(1)有效地利用備機(jī)的硬件資源。除災(zāi)難恢復(fù)外,邏輯Standby數(shù)據(jù)庫(kù)還可用于其他業(yè)務(wù)需求。如通過(guò)在Standby數(shù)據(jù)庫(kù)創(chuàng)建額外的索引、物化視圖等提高查詢性能并滿足特定業(yè)務(wù)需要;又如創(chuàng)建新的SCHEMA(該SCHEMA在Primary數(shù)據(jù)庫(kù)端并不存在),然后在這些SCHEMA中執(zhí)行那些不適于在Primary數(shù)據(jù)庫(kù)端執(zhí)行的DDL或者DML操作等。
(2)分擔(dān)Primary數(shù)據(jù)庫(kù)壓力。邏輯Standby數(shù)據(jù)庫(kù)可以在保持與Primary同步時(shí)仍然置于打開(kāi)狀態(tài),這使得邏輯Standby數(shù)據(jù)庫(kù)能夠同時(shí)用于數(shù)據(jù)保護(hù)和報(bào)表操作,從而將主數(shù)據(jù)庫(kù)從報(bào)表和查詢?nèi)蝿?wù)中解脫出來(lái),節(jié)約寶貴的?CPU和I/O資源。
(3)平滑升級(jí)。可以通過(guò)邏輯Standby來(lái)實(shí)現(xiàn)如跨版本升級(jí),為數(shù)據(jù)庫(kù)打補(bǔ)丁等操作。應(yīng)該說(shuō)應(yīng)用的空間很大,而帶來(lái)的風(fēng)險(xiǎn)卻很小(前提是如果你擁有足夠的技術(shù)實(shí)力。另外雖然物理Standby也能夠?qū)崿F(xiàn)一些升級(jí)操作,但如果跨平臺(tái)的話恐怕就力不從心了,所以此項(xiàng)沒(méi)有作為物理Standby的特點(diǎn)列出),我個(gè)人認(rèn)為這是一種值得可行的在線的滾動(dòng)的平滑的升級(jí)方式,如果你的應(yīng)用支持創(chuàng)建邏輯Standby的話。
?
?
?
七.?Log應(yīng)用服務(wù)(Log?Apply?Services)
Data?Guard通過(guò)應(yīng)用REDO維持Primary數(shù)據(jù)庫(kù)與各Standby數(shù)據(jù)庫(kù)之間的一致性,在后臺(tái)默默無(wú)聞地支撐著的就是傳說(shuō)中的Log應(yīng)用服務(wù)。Log應(yīng)用服務(wù)又分以下兩種方式:
REDO應(yīng)用:物理Standby數(shù)據(jù)庫(kù)專用,通過(guò)介質(zhì)恢復(fù)的方式保持與Primary數(shù)據(jù)庫(kù)的同步。
SQL應(yīng)用:邏輯Standby數(shù)據(jù)庫(kù)專用,核心是通過(guò)LogMiner分析出SQL語(yǔ)句在Standby端執(zhí)行。
?
因此物理Standby在應(yīng)用REDO數(shù)據(jù)時(shí)必須是MOUNT狀態(tài),而邏輯Standby則是以READ?WRITE模式打開(kāi)并應(yīng)用REDO數(shù)據(jù),不過(guò)被維護(hù)的對(duì)象默認(rèn)處于只讀狀態(tài),無(wú)法在邏輯Standby端直接修改。
?
7.1??Log應(yīng)用服務(wù)配置選項(xiàng)
默認(rèn)情況下,Log應(yīng)用服務(wù)會(huì)等待單個(gè)歸檔文件全部接收之后再啟動(dòng)應(yīng)用,如果Standby數(shù)據(jù)庫(kù)配置了Standby?Redologs,就可以打開(kāi)實(shí)時(shí)應(yīng)用(Real-Time?Apply),這樣Data?Guard就不需要再等待接收完歸檔文件,只要RFS進(jìn)程將REDO數(shù)據(jù)寫(xiě)入Standby?Redologs,即可通過(guò)MRP/LSP實(shí)時(shí)寫(xiě)向Standby數(shù)據(jù)庫(kù)。
?
7.1.1.REDO數(shù)據(jù)實(shí)時(shí)應(yīng)用
啟動(dòng)實(shí)時(shí)應(yīng)用的優(yōu)勢(shì)在于,REDO數(shù)據(jù)不需要等待歸檔完成,接收到即可被應(yīng)用,這樣執(zhí)行角色切換時(shí),操作能夠執(zhí)行得更快,因?yàn)槿罩臼潜患磿r(shí)應(yīng)用的。
要啟動(dòng)實(shí)時(shí)應(yīng)用也簡(jiǎn)單,前提是Standby數(shù)據(jù)庫(kù)端配置了Standby?Redologs。
?
物理Standby要啟用實(shí)時(shí)應(yīng)用,要在啟動(dòng)REDO應(yīng)用的語(yǔ)句后附加USING?CURRENT?LOGFIE子句,例如:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?USING?CURRENT?LOGFILE?;?
?
邏輯Standby要啟用實(shí)時(shí)應(yīng)用,只需要在啟動(dòng)REDO應(yīng)用的語(yǔ)句后附加IMMEDIATE子句即可,例如:
SQL>?ALTER?DATABASE?START?LOGICAL?STANDBY?APPLY?IMMEDIATE;?
?
7.1.2.REDO數(shù)據(jù)延遲應(yīng)用
有實(shí)時(shí)就有延遲,某些情況下你可能不希望Standby數(shù)據(jù)庫(kù)與Primary太過(guò)同步,那就可以在Primary數(shù)據(jù)庫(kù)端發(fā)送REDO數(shù)據(jù)的相應(yīng)LOG_ARCHIVE_DEST_n參數(shù)中指定DELAY屬性(單位為分鐘,如果指定了DELAY屬性,但沒(méi)有指定值,則默認(rèn)是30分鐘)。
?
注意:該屬性并不是說(shuō)延遲發(fā)送REDO數(shù)據(jù)到Standby,而是指明歸檔到Standby后,開(kāi)始應(yīng)用的時(shí)間。
?
例如:設(shè)置LOG_ARCHIVE_DEST_3的DELAY屬性為15分鐘:
SQL>?ALTER?SYSTEM?SET?LOG_ARCHIVE_DEST_3='SERVICE=DavePrimary?ARCH?VALID_?FOR=??
(ONLINE_LOGFILES,?PRIMARY_ROLE)?DB_UNIQUE_NAME=Dave?DELAY=15';?
?
不過(guò),如果DBA在啟動(dòng)REDO應(yīng)用時(shí)指定了實(shí)時(shí)應(yīng)用,那么即使在LOG_?ARCHIVE_DEST_n參數(shù)中指定了DELAY屬性,Standby數(shù)據(jù)庫(kù)也會(huì)忽略DELAY屬性。
?
另外,Standby端還可以在啟動(dòng)REDO應(yīng)用時(shí),通過(guò)附加NODELAY子句的方式,取消延遲應(yīng)用。
?
物理Standby可以通過(guò)下列語(yǔ)句取消延遲應(yīng)用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?NODELAY;?
?
邏輯Standby可以通過(guò)下列語(yǔ)句取消延遲應(yīng)用:
SQL>?ALTER?DATABASE?START?LOGICAL?STANDBY?APPLY?NODELAY;?
?
一般設(shè)置延遲應(yīng)用的需求都是基于容錯(cuò)方面的考慮,如Primary數(shù)據(jù)庫(kù)端由于誤操作,數(shù)據(jù)被意外修改或刪除,只要Standby數(shù)據(jù)庫(kù)尚未應(yīng)用這些修改,你就可以快速?gòu)?/span>Standby數(shù)據(jù)庫(kù)中恢復(fù)這部分?jǐn)?shù)據(jù)。不過(guò)自Oracle從9i版本開(kāi)始提供FLASHBACK特性之后,對(duì)于誤操作使用FLASHBACK特性進(jìn)行恢復(fù),顯然更加方便快捷,因此DELAY方式延遲應(yīng)用已經(jīng)非常少見(jiàn)了。
?
7.2??應(yīng)用REDO數(shù)據(jù)到Standby數(shù)據(jù)庫(kù)
?
7.2.1.物理Standby應(yīng)用REDO數(shù)據(jù)
物理Standby啟動(dòng)REDO應(yīng)用,數(shù)據(jù)庫(kù)要處于MOUNT狀態(tài)或是OPEN?READ?ONLY狀態(tài),啟動(dòng)REDO應(yīng)用的命令相信大家已經(jīng)非常熟悉了。
前臺(tái)應(yīng)用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE;?
語(yǔ)句執(zhí)行完成后,不會(huì)將控制權(quán)返回到命令行窗口,除非你手動(dòng)中止應(yīng)用。在這種情況下如果還需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,只能新開(kāi)一個(gè)命令行連接,在Oracle?8i剛推出Standby特性時(shí)(那時(shí)不叫Data?Guard),只提供了這種方式。
?
后臺(tái)應(yīng)用:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?DISCONNECT;?
這是現(xiàn)在比較通用的方式,語(yǔ)句執(zhí)行完后,控制權(quán)自動(dòng)返回到當(dāng)前的命令行模式,REDO應(yīng)用以后臺(tái)進(jìn)程運(yùn)行。
?
啟動(dòng)實(shí)時(shí)應(yīng)用,附加USING?CURRENT?LOGFILE子句即可:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?USING?CURRENT?LOGFILE;?
?
如果要停止REDO應(yīng)用,執(zhí)行下列語(yǔ)句即可:
SQL>?ALTER?DATABASE?RECOVER?MANAGED?STANDBY?DATABASE?CANCEL;?
?
7.2.2.邏輯Standby應(yīng)用REDO數(shù)據(jù)
SQL應(yīng)用的原理是將接收到的REDO數(shù)據(jù)轉(zhuǎn)換成SQL語(yǔ)句在邏輯Standby數(shù)據(jù)庫(kù)端執(zhí)行,因此邏輯Standby需要啟動(dòng)至OPEN狀態(tài)。
?
(1)啟動(dòng)SQL應(yīng)用。邏輯Standby數(shù)據(jù)庫(kù)啟動(dòng)SQL應(yīng)用沒(méi)有前、后臺(tái)運(yùn)行之說(shuō),語(yǔ)句執(zhí)行完之后,控制權(quán)就會(huì)自動(dòng)返回當(dāng)前命令行窗口。
?
要啟動(dòng)SQL應(yīng)用,直接執(zhí)行下列語(yǔ)句即可:
SQL>?ALTER?DATABASE?START?LOGICAL?STANDBY?APPLY;?
?
如果要啟動(dòng)實(shí)時(shí)應(yīng)用,附加IMMEDIATE子句即可,例如:
SQL>?ALTER?DATABASE?START?LOGICAL?STANDBY?APPLY?IMMEDIATE;?
?
(2)停止SQL應(yīng)用,如:
SQL>?ALTER?DATABASE?STOP?LOGICAL?STANDBY?APPLY;?
?
由于是執(zhí)行SQL語(yǔ)句的方式應(yīng)用REDO數(shù)據(jù),因此上述語(yǔ)句的執(zhí)行需要等待當(dāng)前執(zhí)行的SQL觸發(fā)的事務(wù)結(jié)束,才能真正停止REDO應(yīng)用的狀態(tài)。
?
如果不考慮事務(wù)執(zhí)行情況,馬上停止REDO應(yīng)用,可以通過(guò)下列的語(yǔ)句來(lái)完成:
SQL>?ALTER?DATABASE?ABORT?LOGICAL?STANDBY?APPLY;?
?
?
?
?
?
?
注:?整理自?張曉明《大話Oracle?RAC》和?李丙洋《涂抹Oracle》
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zlja/archive/2010/04/22/2449902.html
總結(jié)
以上是生活随笔為你收集整理的Oracle Data Guard 理论知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 罗布阿特曼剧场版什么时候上映
- 下一篇: 《监控》再起风云,连同创作中的《监控2》