Switchover前必须确认4个检查点:主备库SWITCHOVER_STATUS分别为TO PRIMARY/TO STANDBY;归档已传输并应用(V$ARCHIVE_DEST_STATUS和V$MANAGED_STANDBY验证);无活跃长事务;备库LOG_ARCHIVE_DEST_n禁用DELAY且网络无积压。
Switchover 前必须确认的 4 个检查点
oracle data guard 的 switchover 不是“一键切换”,耗时差异极大,取决于底层状态是否就绪。跳过检查直接执行,常导致卡在 alter database commit to switchover to physical standby wait 或超时失败。
实操中需逐项验证:
-
SELECT SWITCHOVER_STATUS FROM V$DATABASE必须返回TO PRIMARY(主库)和TO STANDBY(备库),任一为SESSIONS ACTIVE或SWITCHOVER PENDING都要先处理 - 确认所有归档已传输且应用:查
V$ARCHIVE_DEST_STATUS中STATUS = 'VALID'且ERROR为空;再查V$MANAGED_STANDBY中PROCESS = 'MRP0'的STATUS为APPLYING_LOG - 关闭主库上的任何长事务或未提交会话:
SELECT SID, SERIAL#, SQL_ID, EVENT FROM V$SESSION WHERE STATUS = 'ACTIVE' AND TYPE != 'BACKGROUND',尤其注意未提交的 DML - 确保备库
LOG_ARCHIVE_DEST_n配置中启用了SYNC或ASYNC但无网络延迟积压;若使用DELAY参数,必须临时禁用(ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=... NODELAY' SCOPE=BOTH)
如何真实测量 Switchover 端到端耗时
不能只看 ALTER DATABASE COMMIT TO SWITCHOVER 命令返回时间——它只代表控制流完成,不包含客户端重连、监听器重定向、应用层恢复连接等实际感知延迟。
建议用脚本串联关键阶段并打点计时:
- 在主库执行前,用
date +%s.%N记录起始时间戳 T0 - 执行
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY(主库)和ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY(原备库),捕获每条语句返回时间 T1、T2 - 立即在新主库上运行
SELECT OPEN_MODE FROM V$DATABASE,轮询直到返回READ WRITE,记下该时刻 T3 - 用
tnsping+ 应用级健康检查(如简单SELECT 1 FROM DUAL)确认业务连接可用,记为 T4
真正有意义的指标是 T4 − T0。典型生产环境(千兆网络、中等负载)下,T1−T0 通常
影响 Switchover 时长的三个隐藏因素
很多团队测出“15 秒完成”却在线上翻车,问题往往不在 Oracle 层本身。
-
Redo 传输模式:若主库用
SYNC且网络 RTT > 5ms,COMMIT TO SWITCHOVER会等待最后一次心跳 redo 写入备库磁盘,可能阻塞数秒;改用ASYNC可显著缩短,但需接受极小 RPO 风险 -
备库实例启动方式:若备库是
MOUNT状态(推荐),切换快;若误配为OPEN READ ONLY,则需先SHUTDOWN IMMEDIATE再STARTUP MOUNT,额外增加 20+ 秒 -
监听器与 TNS 配置:未启用
FAILOVER=ON和RETRY_DELAY=1的 JDBC URL,应用重连可能默认等待 30 秒才尝试备库;tnsnames.ora中缺少(FAILOVER_MODE = (TYPE = SESSION)(METHOD = BASIC))也会拖慢客户端感知
要不要在测试中开启 Active Data Guard
如果备库启用了 ADG(即 OPEN READ ONLY + RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT),switchover 流程不变,但实测耗时通常比纯 MOUNT 状态多 3–8 秒。
原因在于 ADG 模式下,Oracle 需额外清理查询进程、释放 shared pool 中的只读对象句柄,并重建 log apply services 上下文。这不是 bug,是设计使然。
因此性能测试必须与生产一致:生产用 ADG,测试就必须开;生产用 MOUNT,测试就不能开。混用会导致时长预估严重偏差,尤其对 SLA 敏感的系统。



















