| 維度 | Switchover (計劃內切換) | Failover (災難切換) |
|---|---|---|
| 觸發場景 | 維護升級、遷移、測試 | 主庫故障、掉電、災難 |
| 角色變化 | Primary ↔ Standby 雙向 | Standby → Primary 單向 |
| 數據損失 | **零數據損失** (同步模式) | 通常有數據損失 (取決於保護模式) |
| DG 環境狀態 | 切換後 DG 架構完好,角色互換 | 原 Primary 需重建為新 Standby |
| 前提條件 | 雙方可用、同步正常 | 主庫不可用、Standby 擁有盡可能多 Redo |
-- 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
-- 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
-- 新主庫切換日志 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;。
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;
前提:主庫已不可用,備庫盡可能應用所有已接收 Redo。
SELECT thread#, low_sequence#, high_sequence# FROM v$archive_gap;
若有記錄,必須從主庫 (若可訪問) 或備份中補齊缺失歸檔,並執行:
ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec';
SELECT DISTINCT thread#, MAX(sequence#) OVER (PARTITION BY thread#) FROM v$archived_log;
若主庫序號更高且主庫可訪問,補傳差異歸檔。若主庫已失聯,**只能接受潛在數據損失**。
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
FORCE 強制停止活動 RFS 進程,立即完成應用。
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; -- 檢查模式 SELECT open_mode, database_role FROM v$database; -- 若 MOUNT: ALTER DATABASE OPEN; -- 若 READ ONLY: SHUTDOWN IMMEDIATE; STARTUP;
Failover 破壞 DG 拓撲,原 Primary 必須重建。兩條路徑:
LOG_ARCHIVE_DEST_n 雙向配置正確,DB_UNIQUE_NAME 匹配對端LOG_ARCHIVE_DEST_STATE_n=ENABLEFAL_SERVER/FAL_CLIENT 正確指向對端 TNSSTANDBY_FILE_MANAGEMENT=AUTOSwitchover 是「有備無患」的演練與維護窗口利器,**零數據損失、架構完好、可逆**;Failover 是「亡羊補牢」的最後防線,**接受數據損失、破壞架構、不可逆、需重建**。生產環境務必**定期演練 Switchover**,熟練 Failover 流程,並在監控系統中接入 V$ARCHIVE_GAP、V$DATAGUARD_STATS 告警,做到心中有數。