當備庫不能接受到一個或多個主庫的歸檔日誌文件時候,就發生了archive gap。丟失的歸檔日誌文件就是gap,如果有gap,如果發生gap,dg會自動檢測和處理通過拷貝丟失的日誌到備庫。
gap什麼時候被發現
當主庫在本地歸檔一個日誌,但是備庫沒有收到,每分鐘,主庫就會看下他的備庫是否在規定日誌文件序號上有gap。
gap怎麼被解決
gap 恢復通過投票機制處理,對物理和邏輯備庫,dg檢查gap及通過在主庫上面獲取丟失的redo日誌文件來解決。
自動gap恢復依賴主庫的可用性,如果主庫不可樣,你配置了多個物理備庫,那麼你可以配置額外的參數,這樣redo apply就可以在別的備庫上來解決gap。
使用fetch archive log(fal)來解決歸檔gap
fal 客戶端自動要求歸檔日誌文件的傳輸。
fal服務端處理客戶端發過來的請求。
fal機制處理下面類型的gap和問題:
1當創建了一個物理或邏輯的備庫,fal機制自動的獲取在主庫熱備時候產生的歸檔日誌文件
2當備庫已經接受了歸檔日誌文件,但是出問題了,fal機制能自動重新獲取歸檔日誌文件來解決下面問題:
1當歸檔日誌文件在被應用到備庫之前被刪除了
2因爲磁盤損壞導致的歸檔日誌文件不能被應用
3當歸檔日誌文件被別的文件替換了
當你有多個物理備庫的時候,fal機制能自動獲取丟失的歸檔日誌文件在別的物理備庫上面。
手工檢測和解決archive gap
在物理備庫上,爲了檢測是否有gap,執行下面的語句
SQL> SELECT * FROM V$ARCHIVE_GAP;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 7 10
上面的例子說明你的物理備庫當前缺少線程1的序號7到10文件。
然後在主庫上定位這些丟失的文件
SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND 2> SEQUENCE# BETWEEN 7 AND 10;
拷貝這些日誌文件到物理備庫,然後註冊到物理備庫上
ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_7.arc';
註冊完這些日之後,可以重新啓動redo apply
邏輯備庫
SQL> COLUMN FILE_NAME FORMAT a55
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#;
THREAD# SEQUENCE# FILE_NAME
---------- ---------- -----------------------------------------------
1 6 /disk1/oracle/dbs/log-1292880008_6.arc
1 10 /disk1/oracle/dbs/log-1292880008_10.arc
這個例子中說明有gap,因爲在邏輯備庫上對線程1有2個文件顯示,如果是沒有gap的話,這個查詢會對每個線程顯示一個文件,這個結果輸出顯示註冊的最高的文件時序列號10,但是缺少了序列號6的文件
拷貝丟失的日誌文件,然後註冊
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/disk1/oracle/dbs/log-1292880008_10.arc';
註冊後重啓sql apply
原文地址:http://blog.csdn.net/aoerqileng/article/details/39323359