Oracle10g Data Guard (Standby) 理論與實踐

tolywang發表於2011-09-20

Oracle10g Data Guard (Standby) 理論與實踐 
1. ARCH網路傳輸模式
Primary DB中一旦ARC0完成redo log的歸檔,ARC1程式即開始傳輸該歸檔到Standby庫
指定的路徑,在Standby上的RFS(Remote File Server) 程式輪流將redo資料寫入standby
redo log,  再由standby上的ARCn程式將其寫入Standby歸檔日誌,然後透過redo應用
(物理備庫) 或 SQL應用(邏輯備庫)將資料應用到Standby庫 (物理備庫採用MRP程式-
Media Recovery process , 邏輯備庫採用LSP-Logical Standby Process) . 
備註: 如果是Real Time Apply,  直接從Standby redo log透過MRP或LSP應用到standby庫。
如果不存在Standby redo log檔案,那麼ARC1程式透過Net將歸檔傳送給Standby的RFS, RFS
把接收到的日誌寫入歸檔日誌,由MRP程式對歸檔進行應用。 
 

2. LGWR 網路傳輸模式
Standby資料庫的LGWR程式會先選擇一個standby redo log檔案對映primary資料庫當前
redo log的sequence(以及檔案大小),一旦primary資料庫有redo資料產生,會以同步(SYNC)
或非同步(ASYNC)方式傳輸到standby資料庫。

SYNC屬性(預設是SYNC):  primary資料庫任何時候產生redo操作都會同步觸發網路I/O,
並且等到網路I/O全部完成才會繼續下面的提交; 即  LGWR必須等待寫入本地日誌檔案
操作和透過LNSn程式的網路傳送都成功,Primary Database 上的事務才能提交 。
ASYNC屬性 : LGWR 把日誌同時提交給日誌檔案和本地LNS 程式,但是LGWR程式只需成功
寫入日誌檔案就可以,不必等待LNSn程式的網路傳送成功。

如果使用LGWR程式必須明確指定。使用LGWR SYNC方式時,可以同時使用NET_TIMEOUT參
數,這個引數單位是秒,代表如果多長時間內網路傳送沒有響應,LGWR 程式會丟擲錯誤。
示例如下:
alter system set log_archive_dest_2 = 'SERVICE=ST LGWR  SYNC NET_TIMEOUT=30'scope=both;
 
 

3. LGWR 網路傳輸工作流程
在primary資料庫,LGWR提交redo資料到LNSn  (LGWR Network Server process, 存在的
目的就是減輕LGWR程式的負擔)程式(n>0),LNSn啟動網路傳輸(傳輸給standby上的RFS)。
standby的RFS(Remote File Server)將接收到的redo資料寫入standby redo log。
一旦primary資料庫執行日誌切換,就會級聯觸發standby的ARCn將standby redo寫入
歸檔,然後透過redo應用(MRP程式)或sql應用(LSP程式)讀取歸檔檔案將資料應用至
standby資料庫。預設情況下,LGWR網路傳輸模式使用的是這種讀取歸檔檔案應用的
方式,即
SQL> alter database recover managed standby database disconnect from session;
這種不是實時應用的方式,如果需要修改為Real Time Apply ,需要:
SQL> alter database recover managed standby database using current
 logfile disconnect from session ;
如果啟用了實時應用的話,MRP/LSP會直接讀取standby redo log並應用到standby
資料庫,無須再等待歸檔 。
 
 
4. Redo 接收 .
Standby Database 的RFS(Remote File Server)程式接收到日誌後,就把日誌寫
到Standby Redo Log或者Archived Log檔案中,具體寫入哪個檔案,取決於Primary
的日誌傳送方式和Standby database的位置。如果寫到Standby Redo Log檔案中,
則當Primary Database發生日誌切換時,也會觸發Standby Database上的Standby
Redo Log 的日誌切換,並把這個Standby Redo Log 歸檔。 如果是寫到Archived
Log,那麼這個動作本身也可以看作是個歸檔操作。
 
 

5. Redo Apply .
根據Redo Apply發生的時間可以分成兩種:
 
一種是實時應用(Real-Time Apply), 這種方式必須Standby Redo Log,每當日誌被寫
入Standby RedoLog時,就會觸發恢復,使用這種方式的好處在與可以減少資料庫切換
(Switchover 或者Failover)的時間,因為切換時間主要用在剩餘日誌的恢復上。
 
另一種是歸檔時應用,這種方式在Primary Database發生日誌切換,觸發Standby
Database 歸檔操作,歸檔完成後觸發恢復。 這也是預設的恢復方式。
 
歸檔時應用:
Alter database recover managed standby database disconnect from session ;
 
Real-Time應用(物理):
Alter database recover managed standby database using current logfile
 disconnect from session ;
Real-Time應用(邏輯):
Alter database start logical standby apply immediate;
 
 

5. 檢視相關檢視  .
檢視是否使用Real-Time apply:
Select recovery_mode from v$archive_dest_status;
select process,status,thread#,sequence#,client_pid from v$managed_standby;
 
 
 
6. Primary DB及Standby上的相關程式
在Primary DB中,相關的主要程式有:
 
LGWR:寫log程式, 用於將SGA中log buffer的內容寫入redo log檔案。
 
LNS(Logwriter Network Service):用於讀取LGWR程式flush的redo,並將其
傳輸到Standby。其存在的目的就是減輕LGWR程式的負擔。
 
ARCH:依然是將已經寫滿的ORL檔案進行歸檔。但是會有一個比較特殊的ARCH會
用於redo log gap的定位與恢復。

在Standby中,相關的程式有:
RFS(Remote File Server):接收PDB傳送的redo data,並將這些放入
network buffer中的內容寫入standby redo log(SRL)。
ARCH:同Primary上的ARCH程式作用類似,為standby redo log檔案產生相應的歸檔檔案。
MRP(Managed Recovery Process):用於協調介質恢復管理,喚起物理standby為
永久的恢復模式。它還負責將redo data從相應的SRLs或歸檔檔案中讀入到用於恢復的共享空間結構。
LSP(Logical Standby Process):該程式主要是在邏輯standby中協調SQL Apply的。
       
PR0x(recovery server Process):讀取SRL或歸檔日誌檔案中的redo,並將其應用於SDB上。
 
 
 

7. 資料保護模式
 
Data Guard 允許定義3鍾資料保護模式,分別是最大保護(Maximum Protection),最大可用(Maximum
Availability)和 最大效能(Maximum Performance)。
 
 
 
a. 最大保護(Maximum Protection)
 
這種模式能夠確保絕無資料丟失。要實現這一步當然是有代價的,它要求所有的事務在提交前其REDO不僅被
寫入到本地的Online Redologs,還要同時寫入到Standby資料庫的Standby Redologs,並確認REDO資料至少
在一個Standby資料庫中可用(如果有多個的話),然後才會在Primary資料庫上提交。如果出現了什麼故障
導致Standby資料庫不可用的話(比如網路中斷),Primary資料庫會被Shutdown,以防止資料丟失。
 
使用這種方式要求Standby Database 必須配置Standby Redo Log,而Primary Database必須使用LGWR,SYNC
,AFFIRM 方式歸檔到Standby Database.
 
最大保護:   
程式LGWR  
網路傳輸模式LGWR SYNC 
Standby Redo Log:   需要
磁碟寫操作:  AFFIRM
 
 
b. 最高可用性(Maximum availability)
 
這種模式在不影響Primary資料庫可用前提下,提供最高階別的資料保護策略。其實現方式與最大保護模式類
似,也是要求本地事務在提交前必須至少寫入一臺Standby資料庫的Standby Redologs中,不過與最大保護模
式不同的是,如果出現故障導致Standby資料庫無法訪問,Primary資料庫並不會被Shutdown,而是自動轉為
最高效能模式,等Standby資料庫恢復正常之後,Primary資料庫又會自動轉換成最高可用性模式。
 
這種方式雖然會盡量避免資料丟失,但不能絕對保證資料完全一致。這種方式要求Standby Database 必須配
置Standby Redo Log,而Primary Database必須使用LGWR,SYNC,AFFIRM 方式歸檔到Standby Database.
 
最大可用 :   
程式LGWR 
網路傳輸模式LGWR SYNC 
Standby Redo Log:   需要
磁碟寫操作:   AFFIRM
 
 
 
c. 最高效能(Maximum performance)
 
預設模式。 這種模式在不影響Primary資料庫效能前提下,提供最高階別的資料保護策略。事務可以隨時提
交,當前Primary資料庫的REDO資料至少需要寫入一個Standby資料庫,不過這種寫入可以是不同步的。如果
網路條件理想的話,這種模式能夠提供類似最高可用性的資料保護,而僅對Primary資料庫的效能有輕微影響
。這也是建立Standby資料庫時,系統的預設保護模式。
 
這種方式可以使用LGWR ASYNC 或者 ARCH 程式實現,Standby Database也不要求使用Standby Redo Log。
最大效能:
程式LGWR/ARCH    
網路傳輸模式LGWR SYNC/LGWR ASYNC/ARCH
Standby Redo Log:  LGWR時需要, ARCH傳輸時建議有.
磁碟寫操作:  NOAFFIRM
 
 
d. 修改資料保護模式步驟
 
1)關閉資料庫,重啟到Mount 狀態,如果是RAC,需要關閉所有例項,然後只啟動一個例項到mount狀態。
2)修改模式:
語法:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY |
PERFORMANCE};
如:SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
3) 開啟資料庫: alter database open;
4) 確認修改資料保護模式:
SQL>select protection_mode,protection_level from v$database;
 

 
8. 自動Archive GAP檢測和解決
 
 
當Primary Database的某些日誌沒有成功傳送到Standby Database, 這時候發生了歸檔裂
縫(Archive Gap)。
 
缺失的這些日誌就是裂縫(Gap)。 Data Guard能夠自動檢測,解決歸檔裂縫,不需要DBA
的介入。這需要配置FAL_CLIENT, FAL_SERVER 這兩個引數(FAL: Fetch Archive Log)。
這兩個引數都是在Standby上設定的。
 
從FAL 這個名字可以看出,這個過程是Standby Database主動發起的“取”日誌的過程,
Standby Database 就是FAL_CLIENT. 它是從FAL_SERVER中取這些Gap, 10g中,這個
FAL_SERVER可以是Primary Database, 也可以是其他的Standby Database。
 
如:FAL_SERVER='PR1,ST1,ST2';
 
FAL_CLIENT和FAL_SERVER兩個引數都是Tnsnames Name。 FAL_CLIENT 透過網路向
FAL_SERVER傳送請求,FAL_SERVER透過網路向FAL_CLIENT傳送缺失的日誌。 但是這
兩個連線不一定是一個連線。 因此FAL_CLIENT向FAL_SERVER傳送請求時,會攜帶
FAL_CLIENT引數值,用來告訴FAL_SERVER應該向哪裡傳送缺少的日誌。 這個引數
值也是一個Oracle Net Name,這個Name是在FAL_SERVER上定義的,用來指向
FAL_CLIENT.
 
當然,除了自動地日誌缺失解決,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) 如果有,則複製過來
 
3) 手工的註冊這些日誌:
SQL> ALTER DATABASE REGISTER LOGFILE '路徑';
 
 
 
9. VALID_FOR

VALID_FOR=(ALL_LOGFILES, ALL_ROLES)
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-707981/,如需轉載,請註明出處,否則將追究法律責任。

相關文章