Switchover前必须确认5个检查项:DB_UNIQUE_NAME双向列入LOG_ARCHIVE_CONFIG;备库处于MANAGED RECOVERY状态;主库LOG_ARCHIVE_DEST_STATE_2为ENABLE且无归档积压;主备COMPATIBLE参数一致;FAST_START_FAILOVER未启用。
Switchover前必须确认的5个检查项
switchover不是“一键切换”,失败往往源于前置状态不满足。最常见报错 ora-16139: media recovery required 或 ora-16664: unable to receive the result from a database 都指向这些环节没过。
- 主库和备库的
DB_UNIQUE_NAME必须在LOG_ARCHIVE_CONFIG中双向列出,漏掉任一方向都会导致DGMGRL无法识别角色关系 - 备库必须处于
MANAGED RECOVERY状态(用SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;确认MRP进程为APPLYING_LOG) - 主库
LOG_ARCHIVE_DEST_STATE_2必须为ENABLE,且对应备库的归档目标无积压(查V$ARCHIVE_DEST_STATUS的STATUS和ERROR列) - 主库与备库的
COMPATIBLE参数值需一致,否则DGMGRL连接后执行SHOW DATABASE VERBOSITY会提示版本不兼容 - 确保
FAST_START_FAILOVER未启用(SELECT FS_FAILOVER_STATUS FROM V$DATABASE;返回DISABLED),否则SWITCHOVER命令会被拒绝
DGMGRL中执行Switchover的标准流程
绕过SQL*Plus或EM界面,直接用Data Guard Broker命令行操作更可控。关键在于顺序不能颠倒,且每步都要验证返回状态。
- 先在任意节点连接Broker:
dgmgrl sys/password@primary_db(注意:这里连的是当前主库,不是监听名) - 检查整体配置健康度:
SHOW CONFIGURATION—— 输出末尾必须是Configuration status: SUCCESS - 发起切换:
SWITCHOVER TO 'standby_db_name';(standby_db_name是备库的DB_UNIQUE_NAME,不是服务名) - 切换完成后,原主库会自动关闭并重启为备库;原备库应用完所有日志后自动转为主库。此时立即在新主库上运行:
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;确认角色已变更
Switchover后应用连接中断的修复方式
切换本身秒级完成,但应用层感知滞后常导致连接失败或写入报错 ORA-01033: ORACLE initialization or shutdown in progress。这不是数据库问题,而是客户端缓存或连接池未刷新。
- 如果使用TNSNAMES.ora,确保其中的
(FAILOVER=ON)和(LOAD_BALANCE=OFF)已配置,并更新HOST和PORT指向新主库 - Java应用若用UCP或HikariCP,需设置
oracle.jdbc.replayEnabled=true并配合FastConnectionFailoverEnabled=true(仅限Oracle 12cR2+) - 避免依赖静态IP或单点VIP —— 强烈建议用SCAN IP + SCAN Listener,或在切换后立刻调用
srvctl modify service -d db_unique_name -s service_name -r new_primary_instance更新服务注册
为什么Switchover比Failover更安全但更难成功
Switchover要求两端完全同步、状态可逆,Failover只管“活下来”。这意味着Switchover对网络延迟、归档传输稳定性、甚至时钟偏差都更敏感。
- 当主备间
ARCHIVE_LAG_TARGET设置过大(如 > 300 秒),或网络抖动导致LGWR ASYNC归档有瞬时积压,SWITCHOVER命令会卡在“waiting for log switch”并最终超时 -
LOG_ARCHIVE_DEST_n若配置了VALID_FOR=(STANDBY_LOGFILE,PRIMARY_ROLE)却没配对应的(ONLINE_LOGFILE,STANDBY_ROLE),切换后新主库可能无法生成归档,后续再切回去就失败 - 最容易被忽略的是密码文件同步:切换后新主库仍用原主库的密码文件校验
SYS登录,但若备库密码文件未及时从主库拷贝(orapwd file=orapwnewdb password=xxx entries=10 force=y),DGMGRL就连不上新主库


















