1. 程式人生 > 資料庫 >Oracle 11g Data Guard原理研究--推薦

Oracle 11g Data Guard原理研究--推薦

網路上和官方文件配置Data Guard 的步驟已經非常成熟,個人覺得應該逐漸深入,去理解其原理,挖掘其精髓

這篇文章是個人學習總結的筆記,如果寫的有錯的地方,還望大家留言指正

下圖為一個ADG的模型,那麼這篇文章就來研究圖中的箭頭的原理,也就是日誌是如何傳送的

圖中,主庫在執行時會不斷產生redo log,這些日誌會通過網路傳送到備庫,這個傳送動作,可以由ARCH完成,也可以由LGWR完成,選用哪種程序,對資料庫的可用性和DG的保護能力有著很大的區別。

1.使用ARCH程序傳送日誌

主庫不斷的產生redo log,這些日誌被LGWR寫進聯機日誌,當一組聯機日誌被寫滿,會發生日誌切換,並且ARCH會將其歸檔,本地歸檔是LOG_ARCHIVE_DEST_1='LOCATION=/...'這種引數定義,ARCH程序還會通過網路把歸檔日誌傳送給備庫的一個叫做RFS的程序,備庫接受日誌並寫入到歸檔日誌,然後備庫的MRP程序(redo apply)或者LSP程序(SQL apply)在備庫上應用這些日誌,於是資料就同步了。

使用ARCH傳遞的問題也是很明顯的,只有日誌切換作為前提,才能傳送日誌,如果主庫異常停機,聯機日誌丟失,導致無法歸檔,那麼丟失資料是在所難免!

在預設情況下,主庫就是用ARCH程序傳送日誌,不需要特別的設定。

2.使用LGWR程序傳送日誌

LGWR又分為SYNC(同步)和ASYNC(非同步)兩種方式

2.1LGWR程序的SYNC方式

主庫產生redo log要同時寫入到日誌檔案和網路,即LGWR把日誌寫到本地聯機日誌檔案的同時,還發送給本地的LNSN程序(Network Server Process),然後LNSN程序把日誌內容通過網路傳送到備庫。

LGWR必須等待寫入本地聯機日誌和LNSN程序傳送成功,主庫的事物才能提交,這就是實時同步的原理。

備庫的RFS程序把接收到的日誌立刻寫入standby redo log中,所以在備庫上看,最後一個日誌總是IN-MEMORY,這也是我當初疑惑的一個問題,現在終於清晰!

備庫的恢復方式可以是實時恢復,也可以是完成對standby redo log的歸檔後恢復。

另外NET_TIMEOUT引數單位為秒,作用是該段時間網路無響應,LGWR會丟擲錯誤

LOG_ARCHIVE_DEST_2=‘SERVICE=ST LGWR SYNC NET_TIMEOUT=30'

2.2使用LGWR程序的ASYNC方式

使用LGWR SYNC方式也有弱點,如果在傳送給standby db過程中出錯,LGWR會報錯,主庫事物無法完成,

主庫LGWR過分依賴網路狀態,如果網路不能保證365天高速無懸念和不會被挖掘機挖斷光纖,或者對資料同步不苛刻,也可以採用LGWR ASYNC方式。

主庫產生redo log之後,LGWR-->LNSN,但是LGWR只需要成功寫入日誌檔案,事物即可允許提交,不必等待LNSN程序傳送成功。

主庫聯機日誌寫滿後,歸檔,也會觸發備庫的standby redo log歸檔,然後觸發MRP活LSP程序恢復歸檔。

即備庫的恢復方式,只能是完成對standby redo log的歸檔後恢復。

由於LSWR不會等待LNSN,所以無需配置NET_TIMEOUT引數。

 

 

1.關於Data Guard日誌接收的總結:

 備庫的RFS程序接收到日誌後,就把日誌寫到standby redo log或者archived log file檔案中。
 而歸檔日誌會被放在什麼位置取決於standby database歸檔路徑的選擇,

 如果配置了standby_archive_dest,則使用這個引數指定的目錄;
 如果配置了log_archive_dest_n,該引數明確定義了VALID_FOR=(STANDBY_LOGFILE,*),則使用這個引數指定的目錄;
 如果資料庫的COMPATIBLE引數大於等於10,則選取任意一個LOG_ARCHIVE_DEST_n的值;
 如果standby_archive_dest和log_archive_dest_n引數都沒有配置,使用預設的standby_archive_dest引數,這個預設值是$Oracle_HOME/dbs/arch。


2.關於Data Guard日誌應用的總結:

 日誌應用服務,就是在備庫上重演主庫的日誌,從而實現兩個資料庫的資料同步。
 根據備庫重演日誌的方式不同,可分為物理和邏輯兩種型別。

 物理使用的media recovery技術,在資料塊級別進行恢復。這種方式沒有資料型別的限制,可以保證兩個資料庫完全一致。
 而邏輯使用的logminer技術,通過把日誌內容還原成SQL語句,然後SQL引擎執行這些語句。

 根據redo apply發生的時間可以分為2種:
 一種是實時應用,這種方式必須有standby redo log,每當日誌被寫入standby redo log時,就會觸發恢復,
 使用這種方式的好處就在於可以減少資料庫切換的時間,因為切換時間主要用在剩餘日誌的內容恢復上。

 另一種是歸檔時應用,這種方式在主庫發生日誌切換之後,才觸發備庫的歸檔,歸檔完成後再觸發恢復,這也是預設的方式。

 如果是物理備庫,可以使用下面命令啟用real-time
 alter database recover managed standby database using current logfile;

如果是邏輯備庫,可以使用下面命令啟用real-time
 alter database start logical standby apply immediate;

檢視是否使用了real-time
 select recovery_mode from v$archive_dest_status;

3.關於Data Guard環境中的重要程序的總結:

 主庫:
LGWR:在主庫上,這個程序負責吧redo buffer中的內容寫入online redo log。

LNS(logwriter network service):LNS程序讀取日誌,並通過網路傳送給備庫,這個程序的目的是為了給LGWR減輕負擔,LGWR程序不用再參與到網路日誌的傳送中。

ARCH:歸檔程序,在主庫中可有30個歸檔程序,其中有一個是專門負責本地歸檔的,不參與Gap Resolution,
而其他的arch程序都可以進行Gap Resolution。

 備庫
RFS(remote file server):這個程序負責接收網路上傳來的redo日誌,並把這些日誌寫到standby redo log檔案中。

ARCH:同樣是歸檔程序,只是在備庫上,需要歸檔的是standby redo log檔案的內容。

MRP(magaged recovery process):這個程序負責協調介質恢復管理工作,整個物理備庫就是建立在介質恢復技術上的。

PR0x(Parallel Recover Process):這是進行具體恢復工作的程序,如果是real-time apply模式下,這些程序會從standby redo log檔案中讀日誌;而在其他模式下,是從歸檔日誌中讀取日誌然後再進行日誌應用。

LSP(logical standby process):這個程序在logical standby中才有,功能和物理備庫的MRP程序類似,負責協調SQL APPLY過程。

 

 

1.關於standby redo log的理解
Data Guard在備庫中,建議配置一種額外的日誌檔案,叫做standby redo log(SRL),和傳統的online redo log(ORL)相比,SRL有著特殊的要求和作用。兩者的關係可以從下面的幾點來對比:
1.SRL和ORL兩種檔案是完全相同的,只是兩者發揮的作用和場景不同。
2.SRL只在備庫上起作用,(雖然主庫也可以配置SRL),但是當資料庫處於主庫角色的時候,SRL是不活動的,只有經過了角色切換,變成了備庫角色時,SRL日誌才會變成活動的。
3.對於處於備庫角色的資料庫來說,ORL不是必須的,也不會起作用,(在很多時候,備庫雖然顯示有ORL,但是並沒有真正的作業系統檔案存在,只有當角色切換,變成主庫角色時,才真正在作業系統上建立ORL檔案)!
4.對於處於備庫角色的資料庫來說,他從主庫接收到的日誌可以記錄在SRL檔案中,也可以記錄在歸檔日誌檔案中,具體寫在哪個檔案中取決於具體配置,但是不會寫在ORL中。
5.SRL必須和ORL大小完全一致,否則SRL也不會被用到。其次,從數量上,應該按照每個例項或日誌執行緒N+1的數量關係來配置,例如2個例項的RAC,如果每個例項3組日誌,則SRL應該是(3+1)*2=8組。

 是否使用SRL,關鍵區別在於RFS把接收到的日誌,是寫在歸檔日誌裡,還是寫在SRL裡。
 使用SRL可以帶來2大好處:
1.效能
 如果不使用SRL,則備庫的RFS會把接收到的日誌記錄到歸檔日誌檔案中,每當主庫做日誌切換時,才會觸發備庫對當前歸檔日誌的歸檔操作,因此他必須等待備庫的RFS程序建立並且初始化下一個歸檔日誌檔案,用來容納以後傳遞的REDO內容。因此這個過程會影響主庫日誌的切換進度,當然對於非同步傳送來說不影響主庫效能,但是仍然會導致備庫日誌落後的情況。
 然而使用了SRL,因為SRL預先建好,因此日誌切換時,無需額外的檔案初始化工作,因此效能要更好一些。

2.支援Real-Time Apply(RTA)
 前面介紹了實時同步,備庫最後一個日誌總是IN-MEMORY狀態。


2.關於Data Guard保護模式的學習和總結
 資料保護模式是指備庫和主庫之間資料同步程度。
Data Guard允許定義3種資料庫保護模式,分別是最大保護、最大可用、最大效能模式。
 這3種模式的區別在於,當主庫發生故障時,備庫的資料會和主庫有多大的差距。

1.最大保護模式 Maximum Protection
顧名思義,這是最高的資料保護級別,這個模式的規則是即便犧牲主庫的可用性,也要保證不出現資料丟失!
 這個級別保證備庫和主庫的資料是完全同步的,即使主庫突然夯機,在備庫上也不會出現任何資料丟失。

 這種方式要求備庫必須配置SRL,而主庫必須使用LGWR、SYNC、AFFIRM方式歸檔到備庫,並且用命令定義為最大保護模式。
 在這種模式下,主庫上的每個事務的REDO日誌必須在和本地和備庫上都寫入日誌檔案後才允許提交。如果不能寫入到備庫,
 主庫就會自動關閉以方式資料丟失。但也不是立刻shutdown abort,而是不再生成任何REDO,並且不斷地嘗試連線備庫,
 這個嘗試大約最多會有10分鐘,因為這一段時間內LGWR不再生成任何REDO,因此整個資料庫表現為掛起。

 在這種模式下,至少要有一個備庫是正常的,主庫才能正常開啟,否則主庫都無法開啟。

 如果主庫是RAC環境,如果一個例項和備庫之間網路發生了問題,那麼在最大保護模式下,這個例項是crash,繼而觸發其他例項的crash recovery,
 完成這個recovery之後,Data Guard會忽略這個例項,而主庫其他例項也能繼續處理業務,併發送日誌進行同步。除非所有例項連線備庫都出現了問題,
 才會出現所有例項crash,最終導致整個資料庫的crash。


2.最大可用模式 Maximum Availability
這是另外一種能實現零資料丟失的資料保護方案。這種模式需要至少有一個備庫是通過SYNC和AFFIRM方式傳送資料,並且要使用SRL檔案才行。
 在這種模式下,主庫傳送redo日誌、並等待備庫確認,備庫收到redo日誌,記錄到SRL中,並返回確認給主庫,這時,主庫上的事務才能結束。
 這是和最大保護模式一樣的地方。因此,網路狀態、備庫的狀態都會影響主庫的事務效能。等待確認的時間用一個引數NET_TIMEOUT定義。
 如果主庫在該段時間(預設30秒)沒有收到任何反饋資訊,這個備庫就會被標記成failed,LGWR會繼續寫日誌,但是會忽略掉這個failed的備庫。
 如果在NET_TIMEOUT內收到了standby failed的訊息,LGWR和LNS還會繼續嘗試重新連線,直到最終放棄這個備庫為止。

 一旦備庫被認為是failed,那麼主庫就會強制進行一次日誌切換,以明確的標識出發生failed的時間點,也就是達到零資料丟失的時間點,
 而在這以後產生的redo日誌就不再向備庫傳送了。

 在這以後的時刻,Data Guard的保護模式就降到了Unprotected了,如果是一主多備環境,會有其他備庫保持同步。一致到解決了日誌Gap,
 主庫才會繼續傳送REDO,Data Guard才會恢復到Maximum Availability模式。

 在RAC環境下,如果一個例項認為備庫是failed,則自動觸發的日誌切換會導致所有的例項都停止傳送REDO,即便其他例項能夠連線到備庫。
 接下來,例項的ARCH程序還繼續利用ping機制檢測到備庫的連通性,一旦恢復連線,則所有的例項會自動去解決gap,
 接著所有的例項會進行日誌切換,以啟動LNS程序,繼續傳送REDO。

 這種模式只是儘量避免資料丟失,也並不能保證資料完全一致。這種模式要求備庫必須配置SRL,而主庫必須使用LGWR、SYNC、AFFIRM方式歸檔。

3.最大效能模式 Maximum Performance
這個模式是預設的模式,它更加側重對主庫可用性不造成任何影響,即“在不影響主庫效能的情況下,儘可能少的資料丟失。”

主庫上的事務的REDO日誌只要寫到本地日誌檔案就可以提交,不必等待到備庫傳遞完成。主庫的REDO可以非同步傳送到備庫。
 備庫的任何故障,以及兩者之間的網路故障都不會影響主庫的活動,即便網路出現問題,主庫也只不過暫時停止REDO傳送,
 並等待ARCH程序通過PING機制發現連線恢復之後,繼續重傳。

 這種模式可以使用LGWR ASYNC或者ARCH實現,備庫也不要求使用SRL。

 如果主庫是RAC,並且工作在最大效能模式下,如果只是RAC的某個例項和備庫的日誌傳遞發生故障,那麼也只有該例項的日誌傳遞被中止。
 而其他例項的日誌傳遞仍然繼續。發生中斷的例項上的ARCH程序會不斷地通過ping機制來檢查連通性,一旦發現連線恢復,這個例項上的gap會自動傳送給備庫,
 但是LGWR程序卻並不會立即啟動LNS程序去傳送當前的redo資料,而是直到下一次日誌切換時,LGWR才會啟動LNS,開始傳遞REDO資料。


3.定義資料保護模式
 保護模式是針對主庫進行設定的,這個設定是告訴主庫必須要遵守的規則。對備庫沒有作用。
 資料保護模式在定義資料保護級別的同時,捎帶著也同時定義了兩個重要資訊:

 主庫如何向備庫傳送redo;
 當備庫發生故障或網路出現故障,主庫應該怎麼做。

 以下命令都是在主庫下執行:
ALTER DATABASE SET STANDBY TO MAXIMIZE PERFORMANCE;
 ALTER DATABASE SET STANDBY TO MAXIMIZE AVAILABILITY;
 ALTER DATABASE SET STANDBY TO MAXIMIZE PROTECTION;


切換模式的過程,先嚐試能夠在open狀態下切換,不能的話,就在mount下切換。
shutdown immeidate
 startup
 alter database set standby to maximize availability;
 alter database open;
 select protection_mode,protection_level from v$database;