一、確認情況:
1、mrp進程等待gap:
2、確認日志應用情況:
select thread#,first_time,SEQUENCE#,block_size*blocks/1024/1024,archived,applied,statu from v$archived_log where first_time>sysdate-10 order by 2 |
3、確認gap:
確認產生了gap,且在源端確認,確實的歸檔已經不存在,且nub沒有備份。
基於如上結論,得知歸檔產生了gap,備端db需要恢復。
二、進行恢復
1、 備份數據文件信息:
col name for a70 set lines 200 pages 200 Select file#,name from v$datafile; |
主庫:
備庫:
2、 備份standby db 當前控制文件:
SQL> alter database backup controlfile to '/tmp/control.bak20200813';
3、 獲取備庫最后的scn,以下面最小的scn
col current_scn format 99999999999999999 select current_scn from v$database;SQL>
CURRENT_SCN ------------------ 226206611
SQL> Select min(fhscn) from x$kcvfh;
MIN(FHSCN) -------------------- 226206612 |
4、 確認主庫是否添加了新的數據文件:
set linesize 300 col name for a70 select file#,name from v$datafile where creation_change#>=226206611;SQL> SQL>
FILE# NAME ---------- ---------------------------------------------------------------------- 26 +DATA1DG/ORAxxxxAGR/DATAFILE/xxxxtbs.311.1048346417
|
5、主庫基於scn備份,並傳輸到備庫1節點:
rman target / run{ allocate channel c1 device type disk; allocate channel c2 device type disk; allocate channel c3 device type disk; allocate channel c4 device type disk; backup as compressed backupset INCREMENTAL FROM SCN 226206611 database format '/oracle/backup/db_inc_%U.bak'; backup current controlfile for standby format '/oracle/backup/standby_controlfile.ctl'; release channel c1; release channel c2; release channel c3; release channel c4; }
cd /oracle/backup scp * 22.XX.XX.99:/nocopy/oracle_backup/backup |
400多G的主庫備份出來只有不到100M
(增量全備雖然量比較小,但是也要將所有數據文件都掃描一遍,所以如果主庫較大,會占用較多的物理IO,且速度不會太快)
6、關閉備庫2節點。
7、備庫1節點停止mrp,更改standby_file_management為manual,啟動到no
mount狀態:
alter database recover managed standby database cancel; alter system set standby_file_management=manual; shutdown immediate; startup nomount; |
8、備庫1節點恢復控制文件並注冊備份集:
rman target /
restore standby controlfile from '/nocopy/oracle_backup/backup/standby_controlfile.ctl';
alter database mount;
catalog start with '/nocopy/oracle_backup/backup';
|
9、使用增量備份恢復備庫與主庫差別的數據文件(主庫未新建文件可跳過):
run { allocate channel c0 type disk; set newname for datafile 26 to '+DATA1DG'; restore datafile 26; release channel c0; } |
10、向新控制文件中注冊datafile:
在使用omf時,重建備庫控制文件之后,記錄的數據文件路徑和名字會變為 MUST_RENAME_THIS_DATAFILE,此時無法使用alter database rename file 'AAAA' to 'BBBB'; 無論將AAAA寫成源端的數據文件路徑,還是當前備庫轉換的數據文件路徑,都不會識別會報ORA-01516。需要將備庫的數據文件路徑,catalog進控制文件,注冊所有數據文件,並進行switch to copy操作
查看當前控制文件中記錄的datafile信息:
(當前控制文件中顯示的路徑為MUST_RENAME_THIS_DATAFILE,且alert中報錯)
向新控制文件中注冊datafile:
catalog start with '+DATA1DG/ORAIPPSAGRS/DATAFILE'; |
進行switch:
Switch database to copy; |
11、恢復數據庫:
recover database noredo; |
12、重新格式化所有log:
(1)查看log file
Select * from v$logfile order by 1; |
(2)格式化所有online log(格式化時會重新創建日志文件,因此你會發現磁盤組中的日志文件變多了,原來的不需要,直接rm掉即可):
Alter database clear logfile group 1; Alter database clear logfile group 2; Alter database clear logfile group 3; Alter database clear logfile group 4; Alter database clear logfile group 5; Alter database clear logfile group 6; |
(3) 格式化所有standby log
Alter database clear logfile group 7; Alter database clear logfile group 8; Alter database clear logfile group 9; Alter database clear logfile group 10; Alter database clear logfile group 11; Alter database clear logfile group 12; Alter database clear logfile group 13; Alter database clear logfile group 14; |
(4)再次查看log file:
13、啟動mrp:
alter database recover managed standby database using current logfile disconnect from session; |
14、檢查ADG狀態:
SELECT thread#,PROCESS,PID,CLIENT_PROCESS, SEQUENCE#, block#,STATUS FROM V$MANAGED_STANDBY order by 1; |
select thread#,first_time,SEQUENCE#,block_size*blocks/1024/1024,archived,applied,status from v$archived_log where first_time>sysdate-1 order by 2 |
select * from v$dataguard_stats; |
15、在lag日志追平以后,更改standby_file_management為auto:
alter system set standby_file_management=AUTO; |
16、停掉1節點mrp,啟動備庫1節點和2節點到open,再在1節點啟動mrp:
17、最后一次檢查數據庫和ADG同步狀態:
select database_role,protection_mode,protection_level from v$database; |
set linesize 300 |
SELECT thread#,PROCESS,PID,CLIENT_PROCESS, SEQUENCE#, block#,STATUS FROM V$MANAGED_STANDBY order by 1; |
select thread#,first_time,SEQUENCE#,block_size*blocks/1024/1024,archived,applied,status from v$archived_log where first_time>sysdate-1 order by 2; |
select * from v$dataguard_stats; |
至此,所有恢復工作完成。