首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 11g Data Guard 角色轉換全攻略:Switchover 與 Failover 操作詳解與故障排查

     編輯:Oracle 教學

核心概念:Switchover vs Failover

維度Switchover (計劃內切換)Failover (災難切換)
觸發場景維護升級、遷移、測試主庫故障、掉電、災難
角色變化Primary ↔ Standby 雙向Standby → Primary 單向
數據損失**零數據損失** (同步模式)通常有數據損失 (取決於保護模式)
DG 環境狀態切換後 DG 架構完好,角色互換原 Primary 需重建為新 Standby
前提條件雙方可用、同步正常主庫不可用、Standby 擁有盡可能多 Redo

Switchover 完整操作流程 (Physical Standby)

Phase 1:主庫端操作

-- 1. 檢查是否支持 Switchover
SELECT switchover_status FROM v$database;  -- 應返回 'TO STANDBY'

-- 2. 提交轉換為 Physical Standby
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;

-- 3. 關閉並以 Mount 模式啟動
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;

-- 4. 驗證新角色
SELECT switchover_status, database_role, open_mode FROM v$database;
-- 應顯示: TO PRIMARY / PHYSICAL STANDBY / MOUNTED

Phase 2:備庫端操作

-- 1. 檢查狀態
SELECT switchover_status FROM v$database;  -- 應返回 'TO PRIMARY'

-- 2. 提交轉換為 Primary
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

-- 3. 打開新主庫
-- 若當前 MOUNT: ALTER DATABASE OPEN;
-- 若當前 READ ONLY: SHUTDOWN IMMEDIATE; STARTUP;

-- 4. 最終驗證
SELECT open_mode, database_role FROM v$database;  -- READ WRITE / PRIMARY

Phase 3:驗證 Redo 傳遞恢復正常

-- 新主庫切換日志
ALTER SYSTEM SWITCH LOGFILE;
SELECT MAX(sequence#) FROM v$archived_log;

-- 新備庫確認接收
SELECT MAX(sequence#) FROM v$archived_log;

若序號不一致,檢查 LOG_ARCHIVE_DEST_n 中的 DB_UNIQUE_NAME 是否與新備庫一致,修正後 ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_n=ENABLE; ALTER SYSTEM SWITCH LOGFILE;。

常見故障排查:ORA-12154 TNS 解析失敗

Switchover 後原主庫 (現備庫) 的 LOG_ARCHIVE_DEST_2 仍指向舊 DB_UNIQUE_NAME,導致 Redo 無法發送。

-- 查看當前參數
SHOW PARAMETER LOG_ARCHIVE_DEST_2;

-- 修正 DB_UNIQUE_NAME 為新備庫的值
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=new_std_tns LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=new_std_dbunq';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
ALTER SYSTEM SWITCH LOGFILE;

Failover 完整操作流程 (Physical Standby)

前提:主庫已不可用,備庫盡可能應用所有已接收 Redo。

步驟 1:檢查歸檔間隙 (關鍵)

SELECT thread#, low_sequence#, high_sequence# FROM v$archive_gap;

若有記錄,必須從主庫 (若可訪問) 或備份中補齊缺失歸檔,並執行:

ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec';

步驟 2:對比雙端最大序號

SELECT DISTINCT thread#, MAX(sequence#) OVER (PARTITION BY thread#) FROM v$archived_log;

若主庫序號更高且主庫可訪問,補傳差異歸檔。若主庫已失聯,**只能接受潛在數據損失**。

步驟 3:啟動 Failover 完成 Redo 應用

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;

FORCE 強制停止活動 RFS 進程,立即完成應用。

步驟 4:轉換為 Primary 並打開

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
-- 檢查模式
SELECT open_mode, database_role FROM v$database;
-- 若 MOUNT: ALTER DATABASE OPEN;
-- 若 READ ONLY: SHUTDOWN IMMEDIATE; STARTUP;

步驟 5:善後 — 重建原 Primary 為新 Standby

Failover 破壞 DG 拓撲,原 Primary 必須重建。兩條路徑:

  1. RMAN 從新 Primary 還原 (推薦,數據一致性最好)
  2. 增量備份恢復 (若原 Primary 存儲完好)

關鍵參數檢查清單 (Switchover 前必驗)

  • LOG_ARCHIVE_DEST_n 雙向配置正確,DB_UNIQUE_NAME 匹配對端
  • LOG_ARCHIVE_DEST_STATE_n=ENABLE
  • FAL_SERVER/FAL_CLIENT 正確指向對端 TNS
  • STANDBY_FILE_MANAGEMENT=AUTO
  • 保護模式:Max Protection 需先降為 Max Performance 才能 Switchover
  • 備庫不在 READ WRITE 模式

總結

Switchover 是「有備無患」的演練與維護窗口利器,**零數據損失、架構完好、可逆**;Failover 是「亡羊補牢」的最後防線,**接受數據損失、破壞架構、不可逆、需重建**。生產環境務必**定期演練 Switchover**,熟練 Failover 流程,並在監控系統中接入 V$ARCHIVE_GAP、V$DATAGUARD_STATS 告警,做到心中有數。

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