Recover standby database after primary resetlogs
一般在主庫需要恢復並open resetlogs 方式開啟的情況下,備庫需要重做來構建主備同步架構,但有些情況其實不必大費周章,只需要備庫開啟flashback功能,就可以在較短的時間內恢復主備同步程序。
(一)
在當主庫resetlogs 之後,查詢當時的RESETLOGS_CHANGE#(SCN),若小於備庫SCN ,可以通過閃回備庫到RESETLOGS_CHANGE#(SCN),直接修復備庫
(二)
主庫狀態查詢
SQL>select dbid,current_scn,RESETLOGS_CHANGE#,flashback_on from v$database; DBID CURRENT_SCN RESETLOGS_CHANGE# FLASHBACK_ON ---------- ----------- ----------------- ------------------ 152040368421096832108651 YES
備庫狀態查詢
# 同步中 SQL> select max(sequence#),applied,archived from v$archived_log group by applied,archived; MAX(SEQUENCE#) APPLIEDARC -------------- --------- --- 6 IN-MEMORY YES 5 YESYES SQL>select dbid,current_scn,RESETLOGS_CHANGE#,flashback_on from v$database; DBID CURRENT_SCN RESETLOGS_CHANGE# FLASHBACK_ON ---------- ----------- ----------------- ------------------ 152040368421102962108651 YES
(三)
主庫
# 備份資料庫 RMAN> backup database; #建立還原點 SQL> create restore point BEFORE_UPDATE; #執行更新操作 SQL>deletefrombaiyang.t where id = 99; 6 rows deleted. SQL> commit; # 查詢當前資料庫狀態 SQL> select dbid,current_scn,RESETLOGS_CHANGE#,flashback_on from v$database; DBID CURRENT_SCN RESETLOGS_CHANGE# FLASHBACK_ON ---------- ----------- ----------------- ------------------ 152040368421104402108651 YES # 關閉資料庫 SQL> shutdown immediate # 恢復資料庫 SQL> startup mount RMAN> run { restore database; recover database until restore point BEFORE_UPDATE; } # 開啟資料庫 SQL> alter database open RESETLOGS; # 檢視資料庫狀態 SQL> select dbid,current_scn,RESETLOGS_CHANGE#,flashback_on from v$database; DBID CURRENT_SCN RESETLOGS_CHANGE# FLASHBACK_ON ---------- ----------- ----------------- ------------------ 15204036842110715***2110399*** YES # 查詢表資料 SQL> select count(*) frombaiyang.t where id = 99; COUNT(*) ---------- 6
在進行一系列令人窒息的操作之後,主庫表baiyang.t 被刪除的資料重新回來了
(四)
備庫
#檢視當前備庫狀態,SCN大於主庫RESETLOGS_CHANGE#,可以通過閃回來恢復備庫同步 SQL> select dbid,current_scn,RESETLOGS_CHANGE#,flashback_on from v$database; DBID CURRENT_SCN RESETLOGS_CHANGE# FLASHBACK_ON ---------- ----------- ----------------- ------------------ 1520403684***2110533***2108651 YES # 實時應用日誌程序已經停止,在告警日誌中可以看到MRP0程序已經停止的資訊 SQL> select max(sequence#),applied,archived from v$archived_log group by applied,archived; MAX(SEQUENCE#) APPLIEDARC -------------- --------- --- 7 YESYES 2 NOYES
(五)
備庫,現在閃回資料庫
SQL> shutdown immediate SQL> startup mount # 閃回資料庫 RMAN> flashback database until scn 1922219; SQL> alter database open; # 開始實時應用 SQL> select max(sequence#),applied,archived from v$archived_log group by applied,archived; MAX(SEQUENCE#) APPLIEDARC -------------- --------- --- 3 IN-MEMORY YES 7 YESYES
(六)
如果備庫SCN小於主庫resetlogs 之後的情況,是不是需要閃回呢?