Data Guard高階玩法:通過閃回恢復failover備庫 (r10筆記第7天)
今天看到有一個網友提了一個問題,描述很簡短 測試DG時,主庫不能宕機,如何測試failover? 其實這個需求從業務層面來說是合理的,一個數據量很大的核心資料庫,如果需要做災難演練,就希望在備庫上做一下演練工作,而這個演練其實又不想影響到目前的主庫,而且又希望能夠儘可能模擬真實的情況,我想這樣對於運維部門來說是最具有考核力度,而對於開發業務部門來說是最受歡迎的,因為他們什麼都不需要改動。 而從技術角度來看,似乎有一些地方需要考量,如果備庫Failover為主庫,那麼這個主庫肯定是可以進行讀寫操作的,如果把它再切回備庫,資料一致性怎麼保證,怎麼能保證是從上次的斷電開始恢復。如果可以做,那真是一大福利。 我們來看看Oracle提供的方式方法,兩大法寶,switchover和Failover Switchover切換的核心指令碼如下,
我們不動原來的主庫,把備庫Failover為主庫。
然後這個時候Failover的主庫可讀可寫,當然最後還是要切換回備庫接收歸檔,可以使用閃回,同時還需要切換角色,這個地方需要好好琢磨一番改怎麼處理。
假設我們的資料庫主庫為newtest2,備庫為snewtest2
在備庫snewtest2上開啟閃回,在備庫上MRP可以實時接受資料變化。
SQL> alter database open;
Database altered.
SQL> SQL> alter database flashback on;
Database altered.
得到一個參考的SCN
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1765837
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------------------------
YES
然後我們在備庫上開始failover
DGMGRL> DGMGRL> failover to snewtest2;
Performing failover NOW, please wait...
Failover succeeded, new primary is "snewtest2"
DGMGRL>
操作很快完成,我們檢視備庫此時的狀態和角色
SQL> select open_mode,database_role from v$database;
OPEN_MODE DATABASE_ROLE
---------------------------------------- --------------------------------
READ WRITE PRIMARY
當然這個步驟可以做一些讀寫操作之類的。
然後我們開始計劃切回備庫。
SQL> shutdown immediate
SQL> startup mount
然後開啟閃回資料庫,恢復到指定的SCN,這個時候要注意,此時還是主庫。
SQL> flashback database to scn 1765837;
Flashback complete.
我們需要切換為備庫,這個時候切換的命令就是關鍵,不是使用switchover的方式。
SQL> alter database convert to physical standby;
Database altered.
當然這個時候資料庫在nomount階段,我們需要重啟備庫。
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00750: database has been previously mounted and dismounted
SQL> shutdown immediate
SQL> startup mount
重新配置一下DG Broker即可,可以設定dg_broker_start=false,停掉dmon,然後刪掉$ORACLE_HOME/dbs下的dr*newtest2.dat的配置檔案,重新配置DG Broker即可。
配置起來都是老套路。
簡單配置後,DG Broker的檢查就正常了。
DGMGRL> DGMGRL> show configuration;
Configuration - dg_newtest2
Protection Mode: MaxPerformance
Databases:
newtest2 - Primary database
snewtest2 - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL>
對應的資料庫日誌中可以看到後臺已經開始應用日誌了。
RFS[2]: Assigned to RFS process 44981
RFS[2]: Selected log 5 for thread 1 sequence 48 dbid 795252212 branch 921251959
Tue Aug 30 21:32:01 2016
Archived Log entry 5 added for thread 1 sequence 48 ID 0x2f7352f8 dest 1:
Tue Aug 30 21:32:01 2016
Media Recovery Log /U01/app/oracle/fast_recovery_area/SNEWTEST2/archivelog/2016_08_30/o1_mf_1_48_cwc2pk57_.arc
Media Recovery Waiting for thread 1 sequence 49 (in transit)
Recovery of Online Redo Log: Thread 1 Group 4 Seq 49 Reading mem 0
Mem# 0: /U01/app/oracle/fast_recovery_area/SNEWTEST2/onlinelog/o1_mf_4_cwc0lmr7_.log
當實現這個看起來有些特殊的需求的時候,我真心內心充滿了喜悅,也著實驚歎Oracle的閃回給備庫帶來了如此多的改進。