??? 很多人看電影或者電視劇時往往都以為,影響劇情發展的關鍵是主角的命運,那么,我不得不又說,你只看到了問題的表面,真正影響劇情發展的...............是導演。對于data guard 的數據應用而言,幕后的導演是LOG_ARCHIVE_DEST_n。本章節我們要學習的內容會很多,這一次,希望你能理清要學習的重點。
??? 在primary 數據庫,DataGuard 可以使用歸檔進程(ARCn)或者日志寫進程(LGWR)收集redo 數據并傳輸到standby,不過不管你選擇歸檔進程也好,日志寫進程也好,都由一個核心參數來控制,它就是:LOG_ARCHIVE_DEST_n,所以,我們先來:
??? 提示:
??? 對于每一個LOG_ARCHIVE_DEST_n 參數,還有一個對應的LOG_ARCHIVE_DEST_STATE_n 參數。LOG_ARCHIVE_DEST_STATE_n 參數用來指定對應的LOG_ARCHIVE_DEST_n 參數是否生效,擁有4 個屬性值:
????● ENABLE:默認值,表示允許傳輸服務。
??? ● DEFER:該屬性指定對應的log_archive_dest_n 參數有效,但暫不使用。
??? ● ALTERNATE:禁止傳輸,但是如果其它相關的目的地的連接通通失敗,則它將變成enable。
??? ● RESET:功能與DEFER 屬性類似,不過如果傳輸目的地之前有過錯誤,它會清除其所有錯誤信息。
??? LOG_ARCHIVE_DEST_1='LOCATION=/arch1/chicago/'
??? LOG_ARCHIVE_DEST_STATE_1=ENABLE
??? LOG_ARCHIVE_DEST_2='SERVICE=jsspdg'
??? LOG_ARCHIVE_DEST_STATE_2=ENABLE
??? SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=jsspdgVALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)';
??? 默認情況下,redo 傳輸服務使用ARCn 進程歸檔redo 日志。不過ARCn 歸檔進程只支持最高性能的保護模式。如果standby 數據庫處于其它類型的保護模式,那你必須使用LGWR 傳輸redo 數據(為什么會這樣呢,三思再來白話幾句,我們知道對于最大保護和最高可用性兩種模式而言,其實強調的都是一點,redo數據必須實時應用于standby 數據庫,我們再看來歸檔,歸檔是做什么呢?是備份已完成切換的redolog,完成切換的redolog 代表著什么呢?說明該redo 中所有數據均已提交至數據文件,那好我們再回過頭來看,數據已完成提交的redo 并且完成了切換還被復制了一份做為歸檔,這個時候才準備開始傳輸到standby 數據庫,這與最大保護和最高可用所要求的實時應用差的簡直不是一點半點,現在,你是不是明白了為什么ARCn 歸檔進程只能支持最高性能的保護模式)。
??? LOG_ARCHIVE_DEST_n 及LOG_ARCHIVE_MAX_PROCESSES。
??? ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES = n;
??? 注:n>0 and n<=30??? ● 在standby 數據庫,RFS 進程輪流將redo 數據寫入standby redo log,再由standby 數據庫中的ARCn 進程將其寫入歸檔,然后通過REDO 應用或SQL 應用將數據應用到standby 數據庫。
??? 另外,因為本地的歸檔進程與遠程歸檔進程間并無聯系,注意如果本地存在刪除完成備份的歸檔的策略,需要在刪除之前首先確認這些歸檔已經被傳輸到standby 數據庫。
??? 使用LGWR 進程與使用ARCn 進程有明顯不同,LGWR 無須等待日志切換及完成歸檔。
??? Standby 數據庫的LGWR 進程會先選擇一個standby redo log 文件映射primary 數據庫當前redolog 的sequence(以及文件大小),一旦primary 數據庫有redo 數據產生,視LOG_ARCHIVE_DEST_n 初始化參數中sync 或async 屬性設置,以同步或非同步方式傳輸到standby 數據庫。
??? 要繼續下面的內容,我們必須先了解與LGWR 歸檔進程密切相關的幾個LOG_ARCHIVE_DEST_n 參數的屬性,如果選擇LGWR 歸檔redo 數據,那么在LOG_ARCHIVE_DEST_n中必須指定SERVICE 和LGWR屬性以允許日志傳輸服務使用LGWR 進程來傳送redo 數據到遠程歸檔目的地。我們還需要指定SYNC(同步)還是ASYNC(異步)的傳輸方式,如果指定SYNC 屬性(如果不明確指定的話,默認是SYNC),則primary數據庫任何會產生redo 操作都會同步觸發網絡I/O,并且等到網絡I/O 全部完成才會繼續下面的提交,而如果指定了ASYNC 屬性,則會primary 數據庫的操作會先記錄online redologs,然后再傳輸到standby。下面詳細看看其流程:
??? LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jssweb\'
??? LOG_ARCHIVE_DEST_2='SERVICE=jsspdg LGWR SYNC NET_TIMEOUT=30'
??? LOG_ARCHIVE_DEST_STATE_1=ENABLE
??? LOG_ARCHIVE_DEST_STATE_2=ENABLE
??? 如果設置LOG_ARCHIVE_DEST_n 初始化參數SYNC 屬性,建議同時設置NET_TIMEOUT 屬性,該屬性控制網絡連接的超時時間,如果超時仍無響應,則會返回錯誤信息。
??? 如圖:
??? 展示了primary 數據庫LGWR 寫online redologs 的同時,同步傳輸redo 數據到standby 數據庫的過程。
??? ● standby 數據庫的RFS(Remote File Server)將接收到的redo 數據寫入standby redolog。特別注意, 在此期間, primary 數據庫的事務會一直保持, 直到所有所有含LGWR SYNC 屬性的LOG_ARCHIVE_DEST_n 指定路徑均已完成接收。
??? LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jssweb\ '
??? LOG_ARCHIVE_DEST_2='SERVICE=jsspdg LGWR ASYNC'
??? LOG_ARCHIVE_DEST_STATE_1=ENABLE
??? LOG_ARCHIVE_DEST_STATE_2=ENABLE
??? ASYNC 方式歸檔就不需要再指定NET_TIMEOUT 了,因為LGWR 與LNSn 之間已無關聯,所以指定不指定NET_TIMEOUT 就都沒任何影響了,因此對于異步傳輸而言,即使網絡出現故障造成primary 與standby 之間通信中斷,也并不會影響到primary 數據庫的提交。
??? 展示了LNSn 進程異步傳輸redo 數據到standby 數據庫RFS 進程的過程。
??? database_role 可設置為:PRIMARY_ROLE,STANDBY_ROLE,ALL_ROLES
??? 注意valid_for 參數是有默認值的,如果不設置的話,其默認值等同于:valid_for=(ALL_LOGFILES,ALL_ROLES)
??? ● SEND 允許數據庫發送數據到遠端
??? ● RECEIVE 則允許standby 接收來自其它數據庫的數據
??? ● NOSEND,NORECEIVE 自然就是禁止嘍。
??? LOG_ARCHIVE_CONFIG='NORECEIVE,DG_CONFIG=(jssweb,jsspdg)'
??? 對于歸檔失敗的處理,LOG_ARCHIVE_DEST_n 參數有幾個屬性可以用來控制一旦向歸檔過程中出現故障時應該采取什么措施,它們是:
??? 使用REOPEN=seconds(默認=300)屬性,在指定時間重復嘗試向歸檔目的地進行歸檔操作,如果該參數值設置為0,則一旦失敗就不會再嘗試重新連接并發送,直到下次redo 數據再被歸檔時會重新嘗試,不過并不會歸檔到已經失敗的歸檔目的地,而是向替補的歸檔目的地發送。
??? alternate 屬性定義一個替補的歸檔目的地,所謂替補就是一旦主歸檔目的地因各種原因無法使用,則臨時向alternate 屬性中指定的路徑寫。
??? 需要注意一點,reopen 的屬性會比alternate屬性優先級要高,如果你指定reopen 屬性的值>0,則lgwr/arch會首先嘗試向主歸檔目的地寫入,直到達到最大重試次數,如果仍然寫入失敗,才會向alternate 屬性指定的路徑寫。
??? LOG_ARCHIVE_DEST_1='LOCATION=E:\ora10g\oradata\jsspdg\ REOPEN=60 MAX_FAILURE=3'
??? 如果primary 數據庫中的歸檔日志沒能成功發送至standby 數據庫,就會出現歸檔中斷。當然通常情況下你不需要擔心這一點,因為dg 會自動檢測并嘗試復制丟失的歸檔以解決中斷問題,通過什么解決呢? FAL(FetchArchive Log)。
??? ● 當創建物理或邏輯的standby 數據庫,FAL 機制會自動獲取primary 數據庫熱備時產生的歸檔文件。
??? ● 當接收的歸檔文件出現下列的問題時,FAL 機會會自動獲取歸檔文件解決:
????????※ 當接收到的歸檔在應用之后被刪除時;
????????※ 當接收到的歸檔所在磁盤損壞時;
??? ● 當存在多個物理standby 時,FAL 機制會自動嘗試從其它standby 服務器獲取丟失的歸檔文件。
??? SQL> select *from v$archive_gap;
?
??? SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 ANDSEQUENCE# BETWEEN 7 AND 10;
??? 然后通過alter database register logfile 命令將這些文件重新注冊一下,例如:
??? SQL> ALTER DATABASE REGISTER LOGFILE 'e:\ora10g\jsspdg\xxxx.arc';
??? SQL> select thread#,sequence#,file_name from dba_logstdby_log l
??? ?? 2 where next_change# not in (
?? ??? 3 select first_change# from dba_logstdby_log where l.thread# = thread#)
??? ?? 4 order by thread#,sequence#;