RAC, Data Gurad, Stream
是Oracle 高可用性體系中的三種工具,每個工具即可以獨立應用,也可以互相配合。 他們各自的側重點不同,适用場景也不同。
RAC 它的強項在于解決單點故障和負載均衡,是以RAC 方案常用于7*24 的核心系統,但RAC 方案中的資料隻有一份,盡管可以通過RAID等機制可以避免存儲故障,但是資料本身是沒有備援的,容易形成單點故障。
Data Gurad 通過備援資料來提供資料保護,Data Gurad 通過日志同步機制保證備援資料和主資料之前的同步,這種同步可以是實時,延時,同步,異步多種形式。DataGurad常用于異地容災和小企業的高可用性方案,雖然可以在Standby機器上執行隻讀查詢,進而分散Primary 資料庫的性能壓力,但是DataGurad決不是性能解決方案。
Stream 是以Oracle Advanced Queue為基礎實作的資料同步,提供了多種級别的靈活配置,并且Oracle提供了豐富的API等開發支援,Stream更适用在應用層面的資料共享。
在Data Gurad 環境中,至少有兩個資料庫,一個處于Open 狀态對外提供服務,這個資料庫叫作PrimaryDatabase。第二個處于恢複狀态,叫作StandbyDatabase。
運作時primary Database對外提供服務,使用者在PrimaryDatabase 上進行操作,操作被記錄在聯機日志和歸檔日志中,這些日志通過網絡傳遞給StandbyDatabase。
這個日志會在StandbyDatabase上重演,進而實作Primary Database和Standby
Database 的資料同步。
Oracle Data Gurad 對這一過程進一步的優化設計,使得日志的傳遞,恢複工作更加自動化,智能化,并且提供一系列參數和指令簡化了DBA工作。
如果是可預見因素需要關閉Primary Database,比如軟硬體更新,可以把Standby Database
切換為Primary Database 繼續對外服務,這樣即減少了服務停止時間,并且資料不會丢失。如果異常原因導緻Primary Database不可用,也可以把StandbyDatabase強制切換為Primary
Database繼續對外服務,這時資料損失程度和配置的資料保護級别有關系。是以Primary和Standby隻是一個角色概念,并不固定在某個資料庫中。
一. Data Guard 架構
DG架構可以按照功能分成3個部分:
1) 日志發送(Redo Send)
2) 日志接收(Redo Receive)
3) 日志應用(Redo Apply)
1. 日志發送(Redo Send)
Primary Database 運作過程中,會源源不斷地産生Redo 日志,這些日志需要發送到StandyDatabase。這個發送動作可以由PrimaryDatabase
的LGWR 或者ARCH程序完成, 不同的歸檔目的地可以使用不同的方法,但是對于一個目的地,隻能選用一種方法。選擇哪個程序對資料保護能力和系統可用性有很大差別。
1.1 使用ARCH程序
1)Primary Database 不斷産生Redo Log,這些日志被LGWR 程序寫到聯機日志。
2)當一組聯機日志被寫滿後,會發生日志切換(Log Switch),并且會觸發本地歸檔,本地歸檔位置是采用 LOG_ARCHIVE_DEST_1='LOCATION=/path'這種格式定義的。
如:alter system set log_archive_dest_1 = 'LOCATION=/u01/arch'scope=both;
3)完成本地歸檔後,聯機日志就可以被覆寫重用。
4)ARCH 程序通過Net 把歸檔日志發送給Standby Database的RFS(RemoteFileServer)程序。
5)Standby Database 端的RFS 程序把接收的日志寫入到歸檔日志。
6)Standby Database 端的MRP(Managed Recovery Process)程序(RedoApply)或者LSP程序(SQLApply)在StandbyDatabase上應用這些日志,進而同步資料。
用ARCH模式傳輸不寫Standby Redologs,直接儲存成歸檔檔案存放于Standby端。
說明:
邏輯Standby接收後将其轉換成SQL語句,在Standby資料庫上執行SQL語句實作同步,這種方式叫SQLApply。
實體Standby接收完Primary資料庫生成的REDO資料後,以媒體恢複的方式實作同步,這種方式也叫RedoApply。
注意:建立邏輯Standby資料庫要先建立一個實體Standby資料庫,然後再将其轉換成邏輯Standby資料庫。
使用ARCH程序傳遞最大問題在于:
Primary Database隻有在發生歸檔時才會發送日志到StandbyDatabase。 如果Primary
Database 異常當機,聯機日志中的Redo内容就會丢失,是以使用ARCH程序無法避免資料丢失的問題,要想避免資料丢失,就必須使用LGWR,而使用LGWR又分SYNC(同步)和ASYNC(異步)兩種方式。
在預設方式下,Primary Database使用的是ARCH程序,參數設定如下:
alter system set log_archive_dest_2
= 'SERVICE=ST' scope=both;
1.2 使用LGWR 程序的SYNC 方式
1)Primary Database 産生的Redo 日志要同時寫道日志檔案和網絡。也就是說LGWR程序把日志寫到本地日志檔案的同時還要發送給本地的LNSn程序(NetworkServerProcess),再由LNSn(LGWRNetworkServerprocess)程序把日志通過網絡發送給遠端的目的地,每個遠端目的地對應一個LNS程序,多個LNS程序能夠并行工作。 2)LGWR 必須等待寫入本地日志檔案操作和通過LNSn程序的網絡傳送都成功,Primary Database 上的事務才能送出,這也是SYNC的含義所在。 3)Standby Database的RFS程序把接收到的日志寫入到Standby Redo Log日志中。 4)Primary Database的日志切換也會觸發Standby Database 上的日志切換,即Standby Database 對Standby Redo Log的歸檔,然後觸發Standby Database 的MRP或者LSP程序恢複歸檔日志。 因為Primary Database 的Redo 是實時傳遞的,于是Standby Database 端可以使用兩種恢複方法:
實時恢複(Real-Time Apply): 隻要RFS把日志寫入StandbyRedoLog就會立即進行恢複;
歸檔恢複: 在完成對Standby Redo
Log 歸檔才觸發恢複。
Primary Database預設使用ARCH程序,如果使用LGWR程序必須明确指定。使用LGWRSYNC方式時,可以同時使用NET_TIMEOUT參數,這個參數機關是秒,代表如果多長時間内網絡發送沒有響應,LGWR程序會抛出錯誤。示例如下:
alter system set log_archive_dest_2 = 'SERVICE=ST LGWR SYNC NET_TIMEOUT=30' scope=both;
1.3 使用LGWR程序的ASYNC
方式
使用LGWR SYNC方法的可能問題在于,如果日志發送給Standby Database過程失敗,LGWR程序就會報錯。也就是說PrimaryDatabase的LGWR程序依賴于網絡狀況,有時這種要求可能過于苛刻,這時就可以使用LGWRASYNC方式。
它的工作機制如下:
1) Primary Database 一旦産生Redo 日志後,LGWR 把日志同時送出給日志檔案和本地LNS程序,但是LGWR程序隻需成功寫入日志檔案就可以,不必等待LNSn程序的網絡傳送成功。
2) LNSn程序異步地把日志内容發送到Standby Database。多個LNSn程序可以并發發送。
3) Primary Database的Online Redo Log 寫滿後發生Log Switch,觸發歸檔操作,也觸發StandbyDatabase對StandbyDatabase對StandbyRedo
Log 的歸檔;然後觸發MRP或者LSP程序恢複歸檔日志。
因為LGWR程序不會等待LNSn程序的響應結果,是以配置LGWR ASYNC方式時不需要NET_TIMEOUT參數。示例如下:
alter system set log_archive_dest_2 = 'SERVICE=ST LGWR ASYNC ' scope=both;
2. 日志接收(Redo
Receive)
Standby Database 的RFS(RemoteFileServer)程序接收到日志後,就把日志寫到StandbyRedoLog或者ArchivedLog檔案中,具體寫入哪個檔案,取決于Primary
的日志傳送方式和Standby database的位置。如果寫到StandbyRedoLog檔案中,則當Primary
Database發生日志切換時,也會觸發StandbyDatabase上的StandbyRedoLog 的日志切換,并把這個Standby
Redo Log歸檔。 如果是寫到ArchivedLog,那麼這個動作本省也可以看作是個歸檔操作。
在日志接收中,需要注意的是歸檔日志會被放在什麼位置:
1) 如果配置了STANDBY_ARCHIVE_DEST 參數,則使用該參數指定的目錄。
2) 如果某個LOG_ARCHIVE_DEST_n 參數明确定義了VALID_FOR=(STANDBY_LOGFILE,*)選項,則使用這個參數指定的目錄。
3) 如果資料庫的COMPATIBLE參數大于等于10.0,則選取任意一個LOG_ARCHIVE_DEST_n的值。
4) 如果STANDBY_ARCHIVE_DEST 和 LOG_ARCHIVE_DEST_n 參數都沒有配置,使用預設的STANDBY_ARCHIVE_DEST參數值,這個預設值是$ORACLE_HOME/dbs/arc.
3. 日志應用(Redo
Apply)
日志應用服務,就是在Standby Database上重演Primary Database日志,進而實作兩個資料庫的資料同步。
根據Standby Database重演日志方式的不同,可分為實體Standby(PhysicalStandby)和邏輯Standby(Logical
Standby)。
Physical Standby 使用的是MediaRecovery技術,在資料塊級别進行恢複,這種方式沒有資料類型的限制,可以保證兩個資料庫完全一緻。Physical
Standby資料庫隻能在Mount狀态下進行恢複,也可以是打開,但隻能已隻讀方式打開,并且打開時不能執行恢複操作。
Logical Standby 使用的是Logminer技術,通過把日志内容還原成SQL語句,然後SQL引擎執行這些語句,LogminerStandby不支援所有資料類型,可以在視圖DBA_LOGSTDBY_UNSUPPORTED中檢視不支援的資料類型,如果使用了這種資料類型,則不能保證資料庫完全一緻。LogicalStandby資料庫可以在恢複的同時進行讀寫操作。
Standby資料庫的相關程序讀取接收到的REDO資料(可能來自于Standby端的歸檔檔案,也可能來自于Standby Redologs),再将其寫入Standby資料庫。儲存之後資料又是怎麼生成的呢?兩種方式:實體Standby通過REDO應用,邏輯Standby通過SQL應用
根據Redo Apply發生的時間可以分成兩種:
一種是實時應用(Real-Time Apply), 這種方式必須StandbyRedoLog,每當日志被寫入StandbyRedo
Log時,就會觸發恢複,使用這種方式的好處在與可以減少資料庫切換(Switchover或者Failover)的時間,因為切換時間主要用在剩餘日志的恢複上。
另一種是歸檔時應用,這種方式在Primary Database發生日志切換,觸發StandbyDatabase歸檔操作,歸檔完成後觸發恢複。這也是預設的恢複方式。
如果是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 00 240
ARCH CONNECTED 00 196
ARCH CONNECTED 00 1944
ARCH CONNECTED 00 3956
MRP0 WAIT_FOR_LOG 130843 N/A
RFS RECEIVING 130838 2620
RFS RECEIVING 130837 2612
RFS RECEIVING 130833 2652
RFS ATTACHED 130841 2628
RFS ATTACHED 130835 2604
RFS ATTACHED