首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle Data Guard 深度解析:Switchover 與 Failover 角色切換實戰指南

     編輯:Oracle 資料庫相關知識

在 Oracle Data Guard 架構中,主資料庫與備用資料庫之間的角色切換是確保高可用性與災難恢復的核心機制。這兩種切換方式——Switchover(切換)與 Failover(故障轉移)——雖然最終目的相同,但適用場景、操作流程及數據風險截然不同。本文將結合實戰演示,深入剖析物理備用庫的兩種角色切換模式,助您掌握關鍵操作細節與風險控制要點。

一、核心概念辨析:Switchover vs Failover

1. Switchover:有計劃的無損角色互換

Switchover 是人為發起的、有計劃的角色切換,常見於資料庫升級、硬體維護、作業系統補丁等場景。其核心特點是零數據丟失,執行過程分為兩個嚴格階段:

  • 階段一:Primary 轉為 Standby
  • 階段二:目標 Standby 轉為 Primary

整個過程在雙向同步機制保護下完成,確保雙方數據完全一致。

2. Failover:緊急故障下的無奈之舉

當 Primary 發生災難性故障且無法在可接受時間內恢復時,必須強制將 Standby 昇級為 Primary。此時若處於「最高效能模式」,由於 Redo 傳輸採用非同步方式,極大概率導致數據丟失。Failover 屬於破壞性操作,原 Primary 恢復後只能重建為新 Standby,無法直接回切。

二、物理 Standby Switchover 完整實操流程

步驟 1:驗證 Primary 可切換為 Standby

PRIMARY> SELECT switchover_status FROM v$database;
SWITCHOVER_STATUS
--------------------
TO STANDBY

返回 TO STANDBY 表示當前 Primary 狀態正常,可發起切換。

步驟 2:執行 Primary 轉 Standby

PRIMARY> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

命令完成後,原 Primary 即以 Standby 身份運作,需啟動至 MOUNT 狀態。

步驟 3:驗證 Standby 可切換為 Primary

STANDBY> SELECT switchover_status FROM v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY

返回 TO PRIMARY 確認目標 Standby 已接收完所有 Redo,具備昇級條件。

步驟 4:執行 Standby 轉 Primary 並開啟

STANDBY> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Database altered.
STANDBY> ALTER DATABASE OPEN;
Database altered.

步驟 5:雙向驗證角色互換結果

-- 原 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

步驟 6:檢驗 Redo 傳輸配置與同步狀態

新 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 宣告成功。

三、物理 Standby Failover 關鍵操作與風險控制

前置檢查:確保歸檔日誌連續性與完整性

檢查 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 存在更大序號的歸檔,同樣需補傳並註冊。

執行 Failover 核心命令

-- 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。

四、最佳實踐建議

  1. 常態演練:每季度至少演練一次 Switchover,驗證腳本與流程有效性。
  2. 監控間隙:部署 V$ARCHIVE_GAP 監控告警,確保歸檔傳輸零延遲。
  3. 保護模式選型:核心業務建議「最高可用性模式」,平衡數據零丟失與 Primary 可用性。
  4. 密碼檔同步:Switchover/Failover 前後務必同步雙端密碼檔,避免 ORA-16191 錯誤。

掌握 Switchover 與 Failover 的本質差異與操作細節,是 DBA 從「會用」走向「精通」Data Guard 的關鍵一步。願本文能為您的高可用架構保駕護航。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved