oracle物理dg gap解決
gap較多,在primary 做基於scn的backup,同時創建一個新的standbycontrolfile,將備份好的backupset ,standbycontrolfile 拷貝的備庫的相應目錄下,進行restore、recover的操作即可因為這個案例中,standby丟失的歸檔太多,推薦用第二種方法
(1) standby 取消recover
SQL> select * from v$archive_gap ;
SQL> alter database recover managed standby database cancel;
(2) 在主庫v$archived_log查詢gap中LOW_SEQUENCE#-1對應的scn(即:first_change#)
SQL>select THREAD#,SEQUENCE#,FIRST_CHANGE#,NEXT_CHANGE#from v$archived_log where SEQUENCE#=98;
THREAD# SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- ------------- ------------
1 481 542543 551725
(3) 在primary做基於該scn的增量備份
RMAN> run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup incremental from scn 542543 database format '/oradata/bak/ora_scn_%U.bak'; #incremental單詞不要寫錯
release channel c1;
}
###################帶壓縮的語法
RUN {
ALLOCATE CHANNEL D1 TYPE DISK;
ALLOCATE CHANNEL D2 TYPE DISK;
ALLOCATE CHANNEL D3 TYPE DISK;
ALLOCATE CHANNEL D4 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL FROM SCN 750983 DATABASE FORMAT '/ARCHIVE/STANDBY_NEW_%D_%T_%U.BAK' INCLUDE CURRENT CONTROLFILE FOR STANDBY FILESPERSET=5 TAG 'FOR STANDBY NEW';
RELEASE CHANNEL D1;
RELEASE CHANNEL D2;
RELEASE CHANNEL D3;
RELEASE CHANNEL D4;
}
list backupset of controlfile;--找到控制文件的備份集文件名
(4) 在primary創建新的standby controlfile
SQL> alter database create standby controlfile as '/oradata/bak/control.ctl';
(5) 將增量的備份集和創建好的standby controlfile 拷貝的備庫
(6) 使用新的standby controlfile 啟動備庫到mount
在使用RMAN恢復備庫的控制文件之前,需要將原來的控制文件進行手工的冷備並且記錄下原來的控制文件中記錄的數據文件的名稱
SELECT ''''||NAME||''' ;' FROM V$DATAFILE; --記錄備庫數據文件原名稱及路徑
cp +DATA/oranlhr/controlfile/control01.ctl +DATA/oranlhr/controlfile/control01.ctl_bk
(7) 備庫shutdown,恢復控制文件
SQL> shutdown immediate
startup force nomountrestore standby controlfile from '/home/oracle/bak/standby_TESTDG_20180525_19t3q9sb_1_1.bak';
select 'alter database rename file '''||NAME ||''' TO ' FROM V$datafile; --查詢恢復控制文件后備庫數據文件的名稱,如果不對的話需要更改
(8)啟動備庫到mount狀態注冊歸檔進來
ALTER DATABASE MOUNT;
CATALOG START WITH '/ARCHIVE/';
若備庫是rac,或者asm存儲,則在還原控制文件后需要把控制文件中的數據文件重命名為備庫的原數據文件名稱才可以執行恢復操作。
--重命名備庫的數據文件
alter system set standby_file_management=manual sid='*';
alter database rename file '+DATADG/testdg/datafile/system.274.976812987' TO '+DATADG/testdgphy/datafile/system.261.976877439';
......
alter database rename file '+DATADG/testdg/datafile/undotbs2.286.976813901' TO '+DATADG/testdgphy/datafile/undotbs2.257.976877619';
......
alter system set standby_file_management=auto sid='*';
在執行RECOVER DATABASE NOREDO前,應該讓備庫和主庫都處於同一個incarnation,否則會報錯
list incarnation of database;
reset database to incarnation 1;--應該和主庫保持一致
--最后執行恢復操作
RECOVER DATABASE NOREDO;
(9) 驗證結果
Standby 執行接收並恢復日志操作
SQL> alter atabase recover managed standby database disconnect from session;
SQL> select * fromv$archive_gap;
no rows selected
SQL> select THREAD#,max(SEQUENCE#) from v$archived_log group by THREAD#;
THREAD# MAX(SEQUENCE#)
---------- --------------
1 3729
Primary端驗證結果
SQL> select THREAD# ,max(SEQUENCE#) from v$archived_log group by THREAD#;
THREAD# MAX(SEQUENCE#)
--------- --------------
1 3729
Primary進行日志切換,查看standby告警日志。
在整個恢復過程中需要注意的幾點:
① 若備庫是rac,或者asm存儲,則在還原控制文件后需要把控制文件中的數據文件重命名為備庫的原數據文件名稱才可以執行恢復操作。
② 在執行RECOVER DATABASE NOREDO前,應該讓備庫和主庫都處於同一個incarnation,否則會報如下的錯誤,並且不能啟用備庫的實時日志應用功能:

邏輯DG手動解決GAP
在邏輯備庫上查詢DBA_LOGSTDBY_LOG視圖可以確定是否有歸檔中斷。例如,下面的查詢指出斷檔號為16至18:
SYS@orclasm > COLUMN FILE_NAME FORMAT a60 SYS@orclasm > SELECT THREAD#, SEQUENCE#, FILE_NAME 2 FROM DBA_LOGSTDBY_LOG L 3 WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#) 4 ORDER BY THREAD#, SEQUENCE#; THREAD# SEQUENCE# FILE_NAME --------- ---------- --------------------------------------------- 1 16 /arch/oracle/arch_1_16.arc 1 18 /arch/oracle/arch_1_18.arc
接下來復制丟失的日志文件到邏輯備庫,並在邏輯備庫上使用“ALTER DATABASE REGISTER LOGICAL LOGFILE”來注冊這些日志文件。例如:
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/arch/oracle/arch_1_16.arc';
在邏輯備庫上注冊這些日志文件之后,重啟SQL應用。和物理DG一樣,在邏輯備庫上的DBA_LOGSTDBY_LOG視圖只返回當前妨礙SQL應用繼續的下一個中斷。在解決指定的中斷並重啟SQL應用之后,再次在邏輯備庫上查詢DBA_LOGSTDBY_LOG視圖,以確定下一個中斷序號,如果有的話,重復這個過程直到沒有更多的中斷。
需要注意的是,如果需要的歸檔日志已經不在主庫上了,但是有歸檔日志的RMAN備份,那么可以通過RMAN恢復把缺少的歸檔日志進行還原,如下所示:
SET ARCHIVELOG DESTINATION TO '/arch'; RESTORE ARCHIVELOG FROM LOGSEQ 7;
如果斷檔的歸檔日志已經丟失,且RMAN又沒有備份,那么在Oracle 10g之前沒有辦法修復了,只能重建DG,但是從Oracle 10g開始可以采用主庫基於SCN的增量備份來恢復DG,詳見【3.2.12.8 主庫丟失歸檔,物理DG如何恢復?】。