在 Oracle Data Guard 架構中,主資料庫與備用資料庫之間的角色切換是確保高可用性與災難恢復的核心機制。這兩種切換方式——Switchover(切換)與 Failover(故障轉移)——雖然最終目的相同,但適用場景、操作流程及數據風險截然不同。本文將結合實戰演示,深入剖析物理備用庫的兩種角色切換模式,助您掌握關鍵操作細節與風險控制要點。
Switchover 是人為發起的、有計劃的角色切換,常見於資料庫升級、硬體維護、作業系統補丁等場景。其核心特點是零數據丟失,執行過程分為兩個嚴格階段:
整個過程在雙向同步機制保護下完成,確保雙方數據完全一致。
當 Primary 發生災難性故障且無法在可接受時間內恢復時,必須強制將 Standby 昇級為 Primary。此時若處於「最高效能模式」,由於 Redo 傳輸採用非同步方式,極大概率導致數據丟失。Failover 屬於破壞性操作,原 Primary 恢復後只能重建為新 Standby,無法直接回切。
PRIMARY> SELECT switchover_status FROM v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY
返回 TO STANDBY 表示當前 Primary 狀態正常,可發起切換。
PRIMARY> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
命令完成後,原 Primary 即以 Standby 身份運作,需啟動至 MOUNT 狀態。
STANDBY> SELECT switchover_status FROM v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
返回 TO PRIMARY 確認目標 Standby 已接收完所有 Redo,具備昇級條件。
STANDBY> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
STANDBY> ALTER DATABASE OPEN;
Database altered.
-- 原 Primary (現 Standby)
PRIMARY> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
-- 原 Standby (現 Primary)
STANDBY> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PRIMARY
新 Primary 必須確認 log_archive_dest_2 指向原 Primary,且狀態為 ENABLE:
STANDBY> SHOW PARAMETER log_archive_dest_2
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_2 string SERVICE=O01DMS0 ARCH VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=O01DMS0
STANDBY> SHOW PARAMETER log_archive_dest_state_2
NAME TYPE VALUE
------------------------------------ ----------- ---------------------
log_archive_dest_state_2 string ENABLE
執行日誌切換並比對雙邊歸檔序號:
STANDBY> ALTER SYSTEM SWITCH LOGFILE;
STANDBY> SELECT MAX(sequence#) FROM v$archived_log; -- 479
PRIMARY> SELECT MAX(sequence#) FROM v$archived_log; -- 479
序號一致,Switchover 宣告成功。
檢查 1:歸檔間隙
STANDBY> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
no rows selected
無記錄返回表示無間隙。若有間隙,必須從 Primary 複製缺失歸檔至 Standby,並執行:
STANDBY> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec';
檢查 2:最大序號對齊
STANDBY> SELECT UNIQUE THREAD# AS THREAD, MAX(SEQUENCE#) OVER (PARTITION BY thread#) AS LAST FROM V$ARCHIVED_LOG;
THREAD LAST
---------- ----------
1 479
若 Primary 存在更大序號的歸檔,同樣需補傳並註冊。
-- 1. 完成 Redo 恢復並強制切換
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
-- 2. 提交角色轉換並開啟資料庫
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE OPEN;
-- 3. 驗證角色
SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PRIMARY
> ⚠️ 關鍵提醒:Failover 後原 Primary 無法直接加入,需重建為新 Standby。生產環境務必優先嘗試 Switchover,僅在 Primary 徹底不可用時才執行 Failover。
V$ARCHIVE_GAP 監控告警,確保歸檔傳輸零延遲。掌握 Switchover 與 Failover 的本質差異與操作細節,是 DBA 從「會用」走向「精通」Data Guard 的關鍵一步。願本文能為您的高可用架構保駕護航。