DGMGRL无缝Switchover成功的关键是前置验证:SHOW CONFIGURATION必须为SUCCESS,主备库SWITCHOVER_STATUS须合规(主库为TO STANDBY或SESSIONS ACTIVE,备库为TO PRIMARY或SESSIONS ACTIVE),切后需立即验证角色、启动MRP、执行ALTER SYSTEM REGISTER并更新客户端连接配置。

能用 DGMGRL 完成无缝 Switchover,前提是 Broker 配置已就绪、状态全绿、且所有检查项都通过——不是命令执行得快,而是前置验证没漏项。一次“无缝”切换,90% 的时间花在查状态上,剩下 10% 才是敲那条 SWITCHOVER TO。
查 SHOW CONFIGURATION 输出是否为 SUCCESS
这是 DGMGRL 切换的“总闸门”,不通过就根本不会往下走。它不是可选步骤,是强制校验入口。
-
SHOW CONFIGURATION最后一行必须是Configuration status: SUCCESS,出现WARNING或ERROR就别继续了 - 常见卡点:
State: UNKNOWN(备库监听没配静态注册)、Transport-Disabled(LOG_ARCHIVE_DEST_STATE_2是DEFERRED)、Apply-Disabled(备库没启 MRP) - 如果失败,立刻用
VALIDATE DATABASE 'standby_db_name'定位具体哪一项不满足,而不是硬试SWITCHOVER
确认主备库 SWITCHOVER_STATUS 值合规
Broker 内部会自动读取 V$DATABASE.SWITCHOVER_STATUS,但你得先自己查一遍——Broker 不会告诉你“为什么报 ORA-16775”,只会拒绝执行。
- 主库查:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;→ 必须返回TO STANDBY或SESSIONS ACTIVE - 备库查:同上 → 必须返回
TO PRIMARY或SESSIONS ACTIVE - 若主库是
SESSIONS ACTIVE,SWITCHOVER TO命令仍可执行,但后续新主库启动时可能因连接池未释放导致ORA-01033 - 若任一端是
NOT ALLOWED或RECOVERY NEEDED,说明归档传输或应用有积压,先查V$ARCHIVE_DEST_STATUS和V$DATAGUARD_STATS
执行 SWITCHOVER TO 'standby_db_unique_name' 后立即验证角色
命令返回成功不等于切换完成。DGMGRL 只保证 Broker 元数据更新和实例启停动作触发,但数据库实际状态要自己确认。
- 切完立刻连新主库(原备库):
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;→ 必须是PRIMARY和READ WRITE - 连新备库(原主库):同样查
DATABASE_ROLE→ 必须是PHYSICAL STANDBY,不是STANDBY(少 “PHYSICAL” 表示角色转换异常) - 新主库上立刻执行
ALTER SYSTEM REGISTER;,否则监听器里服务名还是旧的,JDBC 连不上,报ORA-12514 - 新备库上确认 MRP 已运行:
SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0';→ 状态必须是APPLYING_LOG
切完应用连不上?大概率是 TNS 或连接串没改
数据库秒级切换完成,但客户端完全无感知。这不是 Oracle 的问题,是配置遗漏。
- TNSNAMES.ora 中对应服务名,
HOST和PORT必须指向新主库 IP 和端口;FAILOVER=ON是必需项,不能只靠 VIP - JDBC 连接串中
service_name必须设为新主库的DB_UNIQUE_NAME,不是ORACLE_SID,也不是旧的服务名 - 连接池(如 HikariCP、Tomcat JDBC Pool)必须重启或刷新,缓存的连接句柄仍指向旧地址,
ORA-01033或ORA-12514都是这个原因 - 如果用了 Oracle Wallet,里面存储的连接信息也得同步更新,否则
sqlplus /@wallet_alias依然连错
真正容易被忽略的,是静态监听器配置和 ALTER SYSTEM REGISTER 这两步——它们不报错,但缺一不可。RAC 环境下还要确认每个节点的 SID_LIST 里注册的是本地实例名加 _DGMGRL,否则 Broker 在实例关闭时无法拉起新角色实例。


















