备库SWITCHOVER_STATUS为SESSIONS ACTIVE表示存在活跃用户会话,Oracle拒绝切换以防状态不一致;必须执行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN终止会话并回滚事务,否则命令挂起或报错。
备库 SWITCHOVER_STATUS 返回 SESSIONS ACTIVE 是什么信号
这不是警告,而是明确指令:当前有活跃会话连在备库上(哪怕只是 sql*plus 或 oem 的空闲连接),oracle 拒绝切换,防止角色变更过程中出现状态不一致。它和主库的 sessions active 本质一样,但容易被忽略——因为很多人默认备库是只读的、没人连,其实监控工具、定时脚本、甚至 dba 自己开着的未退出会话都会触发这个状态。
为什么 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY 会卡住或报错
执行该命令时若存在活跃会话,Oracle 不会自动 kill,而是挂起等待(尤其在 11g 中表现明显),最终可能超时或报 ORA-16139: media recovery required(误判为日志没追齐)。根本原因不是归档延迟,而是会话阻塞了角色切换所需的内部锁和控制文件更新流程。
- 查活跃会话:
SELECT sid, serial#, username, program FROM v$session WHERE type = 'USER' AND status = 'ACTIVE'; - 强制清理(切前执行):
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; - 更稳妥的做法:先停掉所有应用连接池、关闭监控 agent、断开所有 SQL*Plus / SQL Developer 连接,再查
v$session确认为空
备库执行 Switchover 前必须满足的三个硬条件
缺一不可,否则 SWITCHOVER_STATUS 永远不会变成 TO PRIMARY:
- 归档日志已全部接收并应用:
SELECT MAX(sequence#) FROM v$archived_log WHERE applied = 'YES';和主库v$log_history最新 sequence 对齐 -
RECOVER MANAGED STANDBY DATABASE进程必须在运行中;如果之前手动停过,得先重启:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; -
LOG_ARCHIVE_DEST_STATE_2在原主库必须是ENABLE,否则最后一批日志(End-Of-REDO)发不过来,备库就永远等不到“可以切换”的信号
执行时带 WITH SESSION SHUTDOWN 的真实作用
这个子句不是“建议加上”,而是 11g 下的强制要求。它让 Oracle 在提交切换前主动终止所有用户会话,并回滚未提交事务,避免手工 kill 时遗漏后台进程(比如 PMON、MMNL 触发的隐式连接)。不加的话,命令会 hang 住,且 SWITCHOVER_STATUS 保持 SESSIONS ACTIVE 不变。
正确写法只有这一种:ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;。注意:这条语句执行后,备库仍处于 MOUNT 状态,需后续 ALTER DATABASE OPEN; 才真正对外提供服务——这一步漏掉,应用连上去就是 ORA-01034。
最常被跳过的细节是:切换完成后,新主库不会自动注册原 service_names,客户端用旧 TNS 连接必然失败。必须立刻执行 ALTER SYSTEM SET service_names='xxx' SCOPE=BOTH; 和 ALTER SYSTEM REGISTER;,否则一切切换都白做。











