實驗環境:OEL+Oracle11.2.0.3+physical standby
衆所周知,Data Guard已經是現今标準的主流容災方案,由于日志傳遞對于網絡适應程度強,且可以采用同步實時的傳遞方式和異步延遲的傳遞方式,甚至可以成為遠端的異地容災方案。不管用于何種用途,DG都免不了要進行角色轉換,即将standby 資料庫切換為primary資料庫,角色轉換分為:switchover和failover兩種;兩種差別從三個角度來對比:
(1)、使用場合不同:Switchover 用于有準備的、計劃之中的切換,通常是系統更新、資料遷移等常态任務;Failover用于意料之外的突發情況,比如異常掉電、自然災難等等。
(2)、資料丢失程度不同:Switchover不會丢失資料,Failover通常意味着有部分資料丢失。
(3)、善後處理的不同:Switchover之後Dataguard環境不會被破壞,任然有Primary、Standby兩種角色的系統存在。但是Failover之後,Dataguard環境就會被破壞,必須需要重建。
因為Switchover這種轉化是有DBA主動、人為觸發的,是以Switchover的步驟都是标準化的。Switchover流程是從Primary Database開始,終止于Standby Database。
Switchover步驟如下:
1 在主庫端檢查資料庫可切換狀态
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS:TO STANDBY 表示可以正常切換.
如果SWITCHOVER_STATUS 的值為SESSIONS ACTIVE,表示目前有會話處于ACTIVE狀态
2 開始主庫正常切換
如果SWITCHOVER_STATUS 的值為TO STANDBY:
SQL>alter database commit to switchover to physical standby;
Database altered.
如果SWITCHOVER_STATUS 的值為SESSIONS ACTIVE:
SQL>alter database commit to switchover to physical standby with session shutdown;
當 Primary Database 收到這條指令後,會發生這幾件事情:
(1)、這條指令執行完畢之後,主庫上就不會産生Redo,所有DML相關的Cursor都會失效,使用者也将不能再執行事務。
(2)、每個日志線程的目前日志被歸檔,并在接下來的每個Thread新的日志頭記錄一個特殊的切換标準EOR(End of Redo),然後再次歸檔,其結果就是把EOR發送給所有Standby Database,Primary Database 轉換成了Standby。
(3)、在這個舊的Primary Database 上,MRP(Managed Recovery Process)程序會自動啟動,并應用最後一個歸檔日志,也就是EOR這個日志,一旦這個EOR應用完成,資料庫就會Dismounted,并必須啟動成一個Standby Database。
3 重新開機先前的主庫
SQL> SHUTDOWN IMMEDIATE;(11g有時候要shutdown abort才行,不然報錯)
SQL> startup mount;
4 這時候到備份庫 在備庫驗證可切換狀态
SQL>select switchover_status from v$database;
SWITCHOVER_STATUS
-----------------
TO_PRIMARY
1 row selected
5 将目标備庫轉換為主庫
如果SWITCHOVER_STATUS 的值為TO STANDBY 則:
SQL> alter database commit to switchover to primary;
如果SWITCHOVER_STATUS 的值為SESSIONS ACTIVE 則:
SQL>alter database commit to switchover to primary with session shutdown;
執行完這個指令後,Standby Database 的控制檔案也從Standby 控制檔案轉換成标準的控制檔案了,接下來資料庫就可以open database,打開成業務資料庫了。
6 重新開機目标備庫
SQL> shutdown immediate;
SQL> startup;
7 先前主庫啟動日志傳送程序
SQL> alter database recover managed standby database disconnect;
8 檢查主備庫角色狀态:
select switchover_status,database_role from v$database;
至此,一個完整的Switchover 完成角色互換,可以正常使用了。
二、Failover
一旦主資料庫發生Crash(比如異常掉電、硬體故障),短時間内無法恢複運作,這時為了盡快的把業務恢複正常,通常需要執行failover操作,将Standby資料庫強制打開。Failover 通常意味着有一定的資料丢失,而資料丢失問題在Primary Database 是 RAC 時表現的尤為突出,需要重點關注。
Failover步驟如下:
1 停止應用日志:
SQL> recover managed standby database cancel;
Media recovery complete.
2 強制結束日志應用,執行下面指令:
SQL> alter database recover managed standby database finish [force];
這個force是可選項,這個指令是告訴Standby Database的MRP,不要再等待Redo了,并盡可能多的應用現有的Redo記錄,并要模拟一個Switchover指令。force參數的作用是關閉PFS程序,否則MRP程序看到RFS程序還存在,就會認為對應的Primary Database還是正常的,就不會允許程序failover,11g中,force參數成了預設的參數,同時force參數也被取消了。
一旦finish指令完成,DG的資料保護模式就會降級到Maximun Performance,不論原來是什麼保護級别。
3 進行正常的switchover:
SQL> alter database commit to switchover to primary with session shutdown;
4 open資料庫。
SQL>alter database open;
在打開資料庫時,這個新的Primary Database 會嘗試去連接配接Standby Database(也就是那個出了故障的Primary Database),是以打開過程會挂起一段時間,當嘗試幾次後,最終會打開資料庫,這時資料庫的保護級别就是Maximun Performance的,以後需要手工将其提升為其他級别。