Switchover前须确认主库SWITCHOVER_STATUS为TO STANDBY、备库为TO PRIMARY或SESSIONS ACTIVE;执行时主库用WITH SESSION SHUTDOWN,备库执行切换后启库;切后需验证角色、归档传输与应用、监听服务及LOG_ARCHIVE_CONFIG同步。
确认主库是否处于可切换状态
switchover 前最常踩的坑是没检查 switchover_status,直接执行导致报错 ora-16129: switchover not allowed 或卡在等待日志应用。这个值必须是 to standby(主库)和 sessions active(备库)才安全。
实操建议:
- 在主库查:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;—— 必须返回TO STANDBY - 在备库查同字段 —— 必须是
TO PRIMARY或SESSIONS ACTIVE(后者说明有活跃会话,需加WITH SESSION SHUTDOWN) - 确保
LOG_ARCHIVE_DEST_STATE_2在主库是ENABLE,且备库的ARCHIVE_LAG_TARGET不设过大(否则可能延迟归档) - 避免在大批量 DML 过程中切换;如有长事务,
V$TRANSACTION查USED_UBLK是否为 0 更可靠
执行 Switchover 的最小必要命令序列
不是所有文档里写的步骤都要走,Oracle 12c+ 后核心流程其实就两步,但顺序和参数错一个就回不来。
实操建议:
- 主库执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;—— 注意必须带WITH SESSION SHUTDOWN,否则遇到活跃会话会 hang 住 - 备库执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;—— 此时它还没启动,只是改控制文件角色 - 重启原主库(现新备库):先
SHUTDOWN IMMEDIATE,再STARTUP MOUNT;原备库(现新主库)执行ALTER DATABASE OPEN; - 切完立刻查
V$DATABASE.DATABASE_ROLE和V$ARCHIVE_DEST_STATUS.STATUS,确认新主库归档正常、新备库已开始接收日志
Switchover 后监听与 TNS 连接自动失效问题
角色一换,tnsnames.ora 里原来指向 PRIMARY 的服务名还在连旧地址,应用报 ORA-12514: TNS:listener does not currently know of service requested 是高频现象。
实操建议:
- 不要依赖静态服务名,用
GLOBAL_DBNAME配合SERVICE_NAME动态注册:在listener.ora中确认GLOBAL_DBNAME设置为db_unique_name_DGMGRL(Data Guard Manager 默认注册名) - 切完立即在新主库执行:
ALTER SYSTEM REGISTER;,强制向监听器重推服务 - 应用侧若用 JDBC,把
service_name改成db_unique_name对应值(不是ORACLE_SID),并启用oracle.net.CONNECT_TIMEOUT避免连接卡死 - 别忘了更新 Data Guard Broker 配置(如果用了
DGMGRL):EDIT DATABASE 'xxx' SET PROPERTY 'StaticConnectIdentifier' = '...';
验证日志传输与应用是否真正同步
很多切换后看似成功,但过几小时发现新备库的 APPLIED_SCN 停滞,实际是归档没传过去或 ARCHIVE_LAG_TARGET 被误设为 0 导致不主动归档。
实操建议:
- 查新主库:
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DEST_ID=1 AND ARCHIVED='YES';(本地归档) - 查新备库:
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE APPLIED='YES';—— 两者差值应 ≤ 1,持续 > 3 表示异常 - 盯紧
V$MANAGED_STANDBY.PROCESS:必须有MRP0(日志应用进程)且状态为APPLYING_LOG;若为WAIT_FOR_LOG,说明归档没收到 - 检查新主库的
LOG_ARCHIVE_DEST_2的STATUS是否为VALID,ERROR字段是否为空;常见错误是ORA-16057: DGID not set,需确认DB_UNIQUE_NAME在两端一致
最容易被忽略的是:Switchover 不重置 LOG_ARCHIVE_CONFIG,但如果你手动改过 DB_UNIQUE_NAME 或删过 Broker 配置,这里会静默失效——必须两边都显式执行 ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(a,b)' 同步。










