回切前必须确认主备角色已真实互换,即当前主库为primary且read write、当前备库为physical standby且protection_mode非maximum protection;需检查并补齐归档缺口、确保srl组数充足、rac环境下须通过data guard broker统一调度,并验证同步延迟与fal参数更新。

回切前必须确认主备角色已真实互换
回切不是“倒着执行一遍切换命令”,而是以新主库为起点重建同步链路。常见错误是直接在原主库(现备库)上执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY,结果报 ORA-16139: media recovery required 或卡在 MOUNT 状态——因为此时它仍是逻辑上的备库,没真正接管控制权。
- 先在当前主库(原备库)查角色:
SELECT database_role, open_mode FROM v$database;必须是PRIMARY且READ WRITE - 再在当前备库(原主库)查:
SELECT database_role, protection_mode FROM v$database;必须是PHYSICAL STANDBY,且protection_mode不能是MAXIMUM PROTECTION(否则无法降级) - 若当前备库仍处于
MOUNTED状态但未启动 MRP,需先执行:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
回切时日志传输必须重新对齐 SCN
切换后主库产生的新归档日志,原主库(现备库)可能因网络延迟、FAL gap 或 SRL 不足而缺失部分重做流。直接启动 MRP 会报 ORA-00308: cannot open archived log 或反复应用失败。
- 检查当前备库缺失日志范围:
SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP; - 若存在 gap,在当前主库手动传输缺失归档:
COPY ARCHIVELOG FROM '<code>LOG_ARCHIVE_DEST_1' WHERE SEQUENCE BETWEEN x AND y;(路径需替换为实际归档位置) - 确认 SRL 数量足够:物理备库的 standby redo log 组数至少比 online redo log 多 1 组,否则
ALTER DATABASE RECOVER会因无可用 SRL 报ORA-00344
RAC 环境下回切必须通过 Data Guard Broker 统一调度
手动在 RAC 单节点执行 switchover 命令,其他实例仍维持旧角色,导致 ORA-16664 和 ORA-16789 错误,MRP 进程无法启动。
- 回切前确保 Broker 配置启用:
SHOW CONFIGURATION VERBOSE;中所有实例状态必须为SUCCESS - 使用
dgmgrl执行统一操作:SWITCHOVER TO '<code>original_primary_db_unique_name'; - Broker 会自动协调所有 RAC 实例:关闭非当前主库节点、同步参数、重启实例并 OPEN,避免手动干预引发状态分裂
回切后验证不能只看 OPEN 状态
数据库成功 OPEN 只说明实例启动,不代表数据已同步完成。业务连接后写入新数据,若底层日志未追平,后续再次切换会丢数据。
- 查同步延迟:
SELECT (SYSDATE - APPLIED_TIME) * 24 * 60 FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;(单位:分钟) - 查应用进度:
SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG WHERE FIRST_TIME > SYSDATE - 1/24 ORDER BY SEQUENCE# DESC;最新一条必须是YES - 跑测试 DML 并验证回滚段一致性:
INSERT INTO test_dr VALUES (SYSDATE); COMMIT;,然后在原主库查该记录是否存在
回切最易被忽略的是 FAL client/server 参数残留。原主库(现备库)若仍指向旧主库地址,FAL 进程会持续尝试拉取不存在的日志,占用资源并掩盖真实同步问题。务必检查 fal_client 和 fal_server 是否已更新为当前主库的 db_unique_name。











