Switchover是唯一保证零数据丢失的主备切换方式,需主备库状态正常、Redo传输与应用无延迟;执行前必须验证主库SWITCHOVER_STATUS为TO STANDBY或SESSIONS ACTIVE、备库为TO PRIMARY或SESSIONS ACTIVE,否则将因NOT ALLOWED等状态导致ORA-16129等错误;主库执行ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN后自动关闭,须STARTUP MOUNT;备库执行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY后需显式ALTER DATABASE OPEN;切换后须立即启动新备库的MRP进程并验证transport lag与apply lag均为+00 00:00:00。
Switchover 是唯一能保证零数据丢失的主备角色切换方式,前提是主备库状态正常、Redo 传输与应用无延迟。别等故障时才试,演练必须在业务低峰期做,且每一步都要验证返回值,不能跳过检查。
确认 switchover_status 是否允许切换
这是最关键的前置判断,直接决定能否执行下一步。在主库和备库分别查:
SELECT switchover_status FROM v$database;
主库期望结果必须是 TO STANDBY 或 SESSIONS ACTIVE;备库必须是 TO PRIMARY 或 SESSIONS ACTIVE。
常见卡点:
-
NOT ALLOWED:说明有未传输的 Redo,先查v$archive_dest_status的status和error字段 -
SWITCHOVER PENDING:主库已切但备库没跟上,需在备库执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;后重试 -
RECOVERY NEEDED:备库刚完成切换但还没启动应用,需先STARTUP MOUNT再启日志应用
主库执行 COMMIT TO SWITCHOVER TO PHYSICAL STANDBY
这条命令不是简单“发个指令”,它会触发事务一致性校验和 Redo 强制归档。执行后主库立即关闭,不能用 SHUTDOWN IMMEDIATE 替代。
注意版本差异:
- Oracle 12c 及以上:直接
STARTUP MOUNT即可,无需SHUTDOWN ABORT - 11.2.0.4 及更早:必须先
SHUTDOWN ABORT,否则STARTUP MOUNT会报ORA-01507 - 如果返回
SESSIONS ACTIVE,必须加WITH SESSION SHUTDOWN,否则会卡住
执行完立刻查角色:SELECT database_role FROM v$database; 应为 PHYSICAL STANDBY,不是 STANDBY(少“PHYSICAL”说明配置异常)。
备库执行 COMMIT TO SWITCHOVER TO PRIMARY 并打开
这步必须在主库已成功转为 PHYSICAL STANDBY 之后进行。先确认备库当前 switchover_status 确实变成 TO PRIMARY,再执行:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
随后必须显式打开:
ALTER DATABASE OPEN;
容易被忽略的坑:
- 执行完
SWITCHOVER TO PRIMARY后,数据库处于MOUNT状态,不OPEN就无法提供服务 - 如果备库之前是
READ ONLY WITH APPLY,切换前要先停应用:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - Open 后立刻查
v$dataguard_stats,transport lag和apply lag应仍为+00 00:00:00,否则说明切换后日志传输链路断了
原主库恢复为新备库并启动日志应用
角色互换后,原来的主库现在是物理备库,但它默认是 MOUNT 状态,且未启用日志应用。必须手动启动:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
关键细节:
- 别用
MANAGED STANDBY DATABASE DISCONNECT(缺USING CURRENT LOGFILE),否则会卡在旧归档序列,导致后续日志无法实时应用 - 启动后查
v$managed_standby,确认PROCESS列有MRP0且STATUS为APPLYING_LOG - 切完立刻在新主库插入测试数据,在新备库查是否同步,不能只看命令返回就认为成功
整个流程里最易被跳过的其实是网络连通性验证和监听器配置——尤其在 RAC + DG Broker 场景下,listener.ora 里 SID_LIST 必须静态注册对应实例名,否则 Broker 无法接管切换。











