由於Standby停機造成主備歸檔不一致,從而產生GAP的解決方案_20100128

gdutllf2006發表於2010-01-28

由於Standby停機造成主備歸檔不一致,從而產生GAP的解決方案

環境:
Oracle9i + Suse9 + DataGuard + 預設的最大效能模式

Primary引數檔案:
*.log_archive_dest_1='LOCATION=/u01/arch'
*.log_archive_dest_2='SERVICE=standby LGWR'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'


Standby引數檔案:
*.fal_server='primary'
*.fal_client='standby'
DB_FILE_NAME_CONVERT=('/u01/oracle/oradata/dzzds20','/u01/oracle/oradata/dzzds20')
LOG_FILE_NAME_CONVERT=('/u01/oracle/oradata/dzzds20','/u01/oracle/oradata/dzzds20')
*.standby_file_management=auto
*.standby_archive_dest='/u01/arch'
LOG_ARCHIVE_DEST_1='LOCATION=/u01/arch'
LOG_ARCHIVE_DEST_STATE_1=ENABLE


由於停機造成主備不一致,歸檔#Sequence = 538 到541的歸檔日誌未應用到備庫

備庫中Alert.log
Mon Jan 25 16:23:51 2010
Failed to request gap sequence. Thread #: 1, gap sequence: 538-541
All FAL server has been attempted.

SQL>  select * from V$ARCHIVE_GAP;

   THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------
         1           538            541

               
主庫有備份,但本地磁碟上的歸檔已透過RMAN delete archivelog 刪除,必須從磁帶上恢復.
現要求重新達到主備的一致性狀態.

解決方案:
1 將歸檔538 -- 541 從磁帶中恢復到Primary的歸檔路徑.觀察是否能夠主動傳送到Standby? 可以透過切換日誌的方法來觸發日誌傳輸?

分析:
控制檔案和Catalog 中記錄 Sequence 538-541的資訊已刪除,無法恢復Archivelog. 只能先恢復控制檔案.
這樣必須做Resetlogs,會丟失主庫之前所有的備份,且要重啟Primay,影響正常業務不合適

2 重做Standby (the last restore)

分析:在Primary不down的情況下利用RMAN做Standby ,這種方案是比較徹底的,但不夠理想.

參考<< RMAN學習筆記_ Duplicate重做DataGuard>>

5 最終解決方案DBMS_backup_retore 包

解決過程:
查詢538-541這些歸檔檔案在哪個Backup piece裡面.

SQL>  select * from v_$backup_redolog where sequence# in (538,539,540,541);

     RECID      STAMP  SET_STAMP  SET_COUNT    THREAD#  SEQUENCE# RESETLOGS_CHANGE# RESETLOGS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME         BLOCKS BLOCK_SIZE
---------- ---------- ---------- ---------- ---------- ---------- ----------------- --------- ------------- --------- ------------ --------- ---------- ----------
       408  709002012  709002011         65          1        539                 1 01-JUL-09    2.6961E+12 22-JAN-10   2.6961E+12 23-JAN-10            558        512
       410  709002012  709002011         65          1        538                 1 01-JUL-09    2.6961E+12 22-JAN-10   2.6961E+12 22-JAN-10              1        512
       411  709002595  709002594         68          1        540                 1 01-JUL-09    2.6961E+12 23-JAN-10   2.6961E+12 23-JAN-10             10        512
       412  709088404  709088403         70          1        541                 1 01-JUL-09    2.6961E+12 23-JAN-10   2.6961E+12 24-JAN-10           1203        512
       413  709088404  709088403         70          1        540                 1 01-JUL-09    2.6961E+12 23-JAN-10   2.6961E+12 23-JAN-10             10        512

540歸檔出現在兩個Backup Piece中,說明,540是重複備份的.

由此注意:備份過程中,Backup piece的Format 一定要標記backup set id, and backup piece ID;

declare
  devtype varchar2(256);
  done boolean;
begin
  devtype := sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t1');
  sys.dbms_backup_restore.restoreSetArchivedLog(destination=>'/u01/arch/');
  sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>538);
  sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>539);
  sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'/u01/backup/dzzd/DZZDS20x_65_1.log',params=>null);
  sys.dbms_backup_restore.devicedeallocate;
end;
/


declare
  devtype varchar2(256);
  done boolean;
begin
  devtype := sys.dbms_backup_restore.deviceAllocate(type=>'',ident=>'t2');
  sys.dbms_backup_restore.restoreSetArchivedLog(destination=>'/u01/arch/');
  sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>540);
  sys.dbms_backup_restore.restoreArchivedlog(thread=>1,sequence=>541);
  sys.dbms_backup_restore.restorebackuppiece(done=>done,handle=>'/u01/backup/dzzd/DZZDS20x_70_1.log',params=>null);
  sys.dbms_backup_restore.devicedeallocate;
end;
/

歸檔恢復後,Oracle會自動傳遞迴檔到備端,備端會自動應用歸檔.可透過檢視兩邊Log來觀察.

應用完成後,檢視GAP
SQL> select * from V$ARCHIVE_GAP;

no rows selected

至此問題解決


相關問題
1 Primary上的歸檔538-- 541為什麼會被刪掉,之前不是測試過如沒用應用到Standby是不會刪除本地歸檔的嗎?
可能的原因是,當Standby被停機後,不再遵循這個規則?
進一步學習DataGuard相關文件,什麼情況下會產生Gap.

2 這證明目前的備份與歸檔的處理策略在Dataguard環境下不夠完善,
在GoldenGate環境下也同樣存在問題

要改進,確保刪除歸檔之前,歸檔已傳輸應用到了備庫或遠端.


3 如何手動觸發FAL去取Gap 歸檔?

 

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

相關文章