Oracle DataGuard日志傳輸


1. 日志傳輸方式

有兩種日志傳輸方式(ARC和LGWR),第一種是采用ARC進程傳輸日志,其示意圖如下:

 

                                                   注:上圖來自《大話Oracle RAC》

其大致過程如下:

1)主庫:日志先寫入在線重做日志,當在線重做日志滿后(或人為切換), ARC0進程歸檔該日志至主庫本地歸檔目錄,歸檔完成后,ARC1馬上將該歸檔日志傳輸到備庫;

2)備庫:RFS進程接收日志,如果備庫有Standby重做日志,則把日志復制到Standby重做日志,接着把Standby重做日志歸檔至備庫本地歸檔目錄,最后應用歸檔日志;如果沒有配置Standby重做日志,RFS進程接收日志后,直接把它放到備庫的歸檔目錄下,再應用該日志。 

另外一種是使用LGWR進程傳輸日志,它又分為兩種方式,分別是ASYNC和SYNC,下面是ASYNC的示意圖:

 

 下面是SYNC的示意圖如下:

 

 

                                                                  注:上圖來自《大話Oracle RAC》

用LGWR傳輸大致如下:

1)主庫:只要有新的重做日志產生,LGWR進程將觸發LNSn進程把新生成的日志傳輸到備庫(注意:這里不能由LGWR直接傳輸,因為整個數據庫實例只有一個LGWR,為了保證它的主要業務性能不受影響,不能由它直接傳輸);

2)備庫:RFS進程接收到日志后,將其寫入Standby重做日志,如果備庫開啟了實時應用,就立即做日志應用,如果沒有開啟,則等Standby重做日志歸檔后再應用。

3)其中,ASYNC和SYNC的區別在於:SYNC是在redo還在內存時,LNSn進程就開始傳輸,而ASYNC是在redo緩沖到online redo log后,LNSn才開始傳輸。

從上面可以得出,從同步的實時性來看,LGWR(SYNC) > LGWR(ASYNC)> ARCH

 2. 日志發送的配置
 主庫的日志發送是由log_archive_dest_n參數設置(注意:同時還有一個和它相對應的開關參數log_archive_dest_state_n,用於指定該參數是否有效),下面簡單介紹下該參數各個屬性的含義。
 SERVICE(必須):指定備庫的網絡連接名;

SYNC/ASYNC(默認為ASYNC):指定日志的傳輸模式(同步/異步);

NET_TIMEOUT:指定當采用SYNC傳輸模式時,超過多少秒則表示網路超時(默認為30s),在使用SNYC模式時,強烈建議設置改參數;

AFFIRM/NOAFFIRM:AFFIRM表示只有當日志寫入Standby重做日志后才算日志傳輸成功,NOAFFIRM則沒有這個要求;

DB_UNIQUE_NAME:指定備庫的DB_UNIQUE_NAME;

VALID_FOR:格式為(redo_log_type,database_role),只有這兩個條件全部符合,才會發送日志;

   其中redo_log_type有如下取值:ONLINE_LOGFILE, STANDBY_LOGFILE, ALL_LOGFILES

       database_role有如下取值:PRIMARY_ROLE, STANDBY_ROLE, ALL_ROLES

REOPEN:指定當連接錯誤發生時,多少秒之后重試;

COMPRESSION:指定是否對日志進行壓縮,已提高網絡傳輸性能。

下面是log_archive_dest_n的一個例子:

 DB_UNIQUE_NAME=BOSTONLOG_ARCHIVE_CONFIG=\'DG_CONFIG=(BOSTON,CHICAGO,HARTFORD)\' LOG_ARCHIVE_DEST_2=\'SERVICE=CHICAGO ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILE, PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE  DB_UNIQUE_NAME=CHICAGO\' LOG_ARCHIVE_DEST_STATE_2=\'ENABLE\' LOG_ARCHIVE_DEST_3=\'SERVICE=HARTFORD SYNC AFFIRM NET_TIMEOUT=30 VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE   DB_UNIQUE_NAME=HARTFORD\' LOG_ARCHIVE_DEST_STATE_3=\'ENABLE\'
 3. 日志接受的配置
 在備庫,當RFS進程接受到日志后,就將其寫入Standby日志文件里,備庫的Standby日志文件可以看做是主庫在線日志文件的一個鏡像,當主庫做日志切換時,備庫的Standby日志也做相應的切換,切換后的Standby日志由備庫的ARCH進程歸檔。 

Oracle規定備庫的Standby日志文件大小不能小於主庫在線日志文件最大的一個,一般情況下,為了管理方便,最好把所有的在線日志和Standby日志大小設為一樣。 

Oracle還規定備庫的Standby日志文件至少要比主庫的在線日志文件多一組。

通過下面語句可以查詢主庫在線日志的大小和組數: 

SQL> SELECT GROUP#, BYTES FROM V$LOG;通過下面的語句可以查詢備庫Standby日志的大小和組數: 

SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;假設主庫有兩組在線日志,每個日志文件大小為500M,那么我們至少需要3組Standby,且每個日志文件大小不少於500M: 

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog1.rdo') SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog2.rdo') SIZE 500M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog3.rdo') SIZE 500M; 

上面提到過,備庫的Standby日志也會被歸檔,它的歸檔路徑由備庫的log_archive_dest_n參數的location屬性設置,如下所示: 

LOG_ARCHIVE_DEST_1 = \'LOCATION = /disk2/archiveVALID_FOR=(STANDBY_LOGFILE,STANDBY_ROLE)\'LOG_ARCHIVE_DEST_STATE_2=ENABLE 

4. 日志傳輸狀態的監控 

第一步:在主庫執行如下語句獲得最新歸檔序列號: 

SQL> SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG GROUP BY THREAD#; 

第二步:在主庫執行如下語句確認最新歸檔的日志是否已經傳輸至備庫: 

SQL> SELECT DESTINATION, STATUS, ARCHIVED_THREAD#, ARCHIVED_SEQ# FROM V$ARCHIVE_DEST_STATUS   WHERE STATUS <> 'DEFERRED' AND STATUS <> 'INACTIVE';
DESTINATION         STATUS  ARCHIVED_THREAD#  ARCHIVED_SEQ#
------------------  ------  ----------------  -------------
/private1/prmy/lad   VALID                 1            947           standby                                                  ## 947如果狀態不是VALID,則說明日志傳輸失敗。 

5. 手動解決日志傳輸GAP 

Oracle DG會自動檢測日志傳輸GAP並自動解決,但有時候GAP無法自動解決,必須DBA人工干預,下面我們講講手動解決的步驟:

首先,在備庫執行下列語句查詢是否有GAP: 

SQL> SELECT * FROM V$ARCHIVE_GAP;    
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
-----------  -------------  --------------          
1              7              10                                                 ##HIGH_SEQUENCE   #減去LOW_SEQUENCE#就是當前的GAP數,上例顯示備庫缺少從7到10(不包含10)的歸檔日志。 

接着,在主庫查詢這些歸檔日志的目錄位置: 

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc /primary/thread1_dest/arcr_1_8.arc /primary/thread1_dest/arcr_1_9.arc 

把這些歸檔日志從主庫拷貝至備庫,並在備庫上注冊: 

SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_7.arc';
SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_8.arc';
SQL> ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_9.arc‘’;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM