oracle data guard切换“平滑”取决于5个硬性状态是否全部满足:log_archive_config双向包含、mrp0进程正在应用日志、log_archive_dest_state_2为enable且无积压、主备compatible参数一致、fast_start_failover已禁用;任一不满足将导致ora-16475等错误并中断业务。
能,但“平滑”取决于你是否在切换前把所有状态钉死——漏掉一个log_archive_dest_state_2为disable,或者备库mrp进程没跑起来,切换就会卡在ora-16475或ora-16139,业务直接中断。
Switchover前必须验证的5个硬性状态
这些不是“建议检查”,是DGMGRL或ALTER DATABASE SWITCHOVER TO命令执行时会直接校验的开关。任一不满足,命令要么报错,要么静默失败。
-
LOG_ARCHIVE_CONFIG里主备DB_UNIQUE_NAME必须双向包含,例如'DG_CONFIG=(orcl,orcl_stdy)',少一个就找不到对端 - 备库
V$MANAGED_STANDBY.PROCESS = 'MRP0'且STATUS = 'APPLYING_LOG',用SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;直查 - 主库
LOG_ARCHIVE_DEST_STATE_2必须是ENABLE,且V$ARCHIVE_DEST_STATUS.STATUS为VALID,积压归档数为0 - 主备
COMPATIBLE参数值必须完全一致(如都是19.0.0),否则SHOW DATABASE VERBOSITY会提示不兼容 -
FAST_START_FAILOVER必须禁用:SELECT FS_FAILOVER_STATUS FROM V$DATABASE;返回DISABLED
用DGMGRL执行切换时最易踩的三步陷阱
DGMGRL看似简单,但每步返回值和后续动作必须人工确认,Broker不会替你兜底。
- 连接时必须连当前主库实例:
dgmgrl sys/password@orcl,连错实例(比如连了备库)会导致SWITCHOVER TO命令被拒绝 -
SHOW CONFIGURATION输出末尾必须是Configuration status: SUCCESS,出现WARNING或ERROR不能跳过 -
SWITCHOVER TO 'orcl_stdy'执行后,原主库会自动shutdown,但新主库(原备库)仍处于MOUNT状态,必须立刻手工执行ALTER DATABASE OPEN;,否则应用连不上
不用Broker、纯SQL方式切换的关键控制点
当Broker不可用或RAC节点监听配置异常时,只能走传统SQL路径。此时顺序和状态判断比Broker更敏感。
动态切换AI模型以优化成本与性能。当用户发出“eco mode”、“balanced mode”、“smart mode”或“max mode”等模式指令,或使用“/modes status”查询状态及“/modes setup”配置模式时触发。
- 主库先发
ALTER DATABASE SWITCHOVER TO orcl_stdy VERIFY;,成功才继续;若报ORA-16475,立刻查alert.log里SWITCHOVER VERIFY段落,常见原因是备库没配STANDBY_FILE_MANAGEMENT=AUTO或FAL_SERVER指向错误 - 主库执行
ALTER DATABASE SWITCHOVER TO orcl_stdy;后,实例自动关闭,启动时必须用STARTUP MOUNT,再运行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;,不能直接OPEN - 新主库(原备库)切完角色后仍是
MOUNT,SWITCHOVER_STATUS显示FAILED DESTINATION大概率是LOG_ARCHIVE_DEST_2还指向旧主库,需立刻ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=...重配并ALTER SYSTEM ARCHIVE LOG CURRENT;
切换后应用层连不上?别急着重启数据库
90%的“切换后连不上”问题出在客户端缓存或TNS配置,数据库本身早已就绪。
- TNSNAMES.ora里必须含
(FAILOVER=ON)且(LOAD_BALANCE=OFF),HOST/PORT要指向新主库,静态IP绑定是最大雷区 - Java应用用UCP或HikariCP时,仅设
oracle.jdbc.replayEnabled=true不够,必须同时开FastConnectionFailoverEnabled=true(Oracle 12cR2+才支持) - 如果应用使用JDBC URL直连,例如
jdbc:oracle:thin:@192.168.32.172:1521/orcl,必须立刻更新IP和Service Name,DNS缓存要清,nslookup验证解析结果
真正难的从来不是命令怎么敲,而是切换前那五分钟——盯着V$DATAGUARD_STATS里transport lag和apply lag是否都为0,盯着alert.log最后一行有没有Media Recovery Complete。这些地方一旦忽略,再快的SWITCHOVER也救不回业务中断的三十秒。










