切换测试数据不丢的核心是确保备库已应用主库最新日志,即v$archived_log中最新几条applied为yes或in-memory,且switchover_status为to standby,再经dgmgrl verify校验后执行。

切换测试中数据不丢,核心就一条:别让备库应用滞后于主库最新日志——不是“有没有归档”,而是“最新那条有没有被APPLIED”。
查 v$archived_log 的 applied 字段,不是只看 sequence# 最大值
常见错误是只比对主备 MAX(sequence#) 是否一致,但备库上最新几条记录的 applied 是 NO,说明归档已接收但没应用。此时切过去,这几条事务就丢了。
- 必须在备库执行:
SELECT sequence#, applied FROM v$archived_log WHERE sequence# >= (SELECT MAX(sequence#)-5 FROM v$archived_log) ORDER BY sequence# DESC,确认主库刚切的那几条applied是YES或IN-MEMORY -
IN-MEMORY表示正在实时应用(RECOVERY_MODE = MANAGED REAL TIME APPLY),可接受;NO就必须停手 - 如果返回里有
applied = NO且sequence#接近主库最新值,大概率是MRP0进程没跑起来,或ALTER DATABASE RECOVER MANAGED STANDBY DATABASE没执行
切换前必须确认 SWITCHOVER_STATUS 是 TO STANDBY,不是 SWITCHOVER LATENT
SWITCHOVER LATENT 不是“稍等一下就好”,而是明确告诉你:备库还没追平,强行切=丢事务。这个状态不会自动变,得你手动查、手动干预。
- 主库查:
SELECT database_role, switchover_status FROM v$database,必须是PRIMARY / TO STANDBY或SESSIONS ACTIVE(后者需加WITH SESSION SHUTDOWN) - 备库查:
SELECT database_role, switchover_status FROM v$database,必须是PHYSICAL STANDBY / TO PRIMARY - 如果备库是
SWITCHOVER LATENT,先查V$ARCHIVE_GAP补日志,再查V$MANAGED_STANDBY确认MRP0在APPLYING_LOG状态且SEQ#持续增长
用 DGMGRL 的 VERIFY 而不是直接 COMMIT
VERIFY 不会真正改角色,但它会走完全部校验链路:网络连通性、密码文件同步、Broker元数据一致性、监听器响应、归档目标状态。跳过这步等于闭眼开车。
- 主库执行:
SWITCHOVER TO orcl_stdy VERIFY(orcl_stdy是备库DB_UNIQUE_NAME) - 如果报错
ORA-16664: unable to receive the result from a database,通常是备库监听没起来,或LOG_ARCHIVE_DEST_2指向了错误的服务名 - 成功后才执行:
SWITCHOVER TO orcl_stdy;失败则根据 DGMGRL 输出定位具体哪一环断了,比如V$ARCHIVE_DEST_STATUS显示ERROR或DEFERRED
SSL 加密传输下,切换测试前必须验证 TCPS 连通性
主库配了 SSL,备库没配或配错,归档会静默降级为明文 TCP,而 LOG_ARCHIVE_DEST_2 状态仍显示 VALID,根本看不出问题。直到切换时发现日志卡住,才意识到加密链路早断了。
- 手动测试 TCPS 连通:
sqlplus /@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=standby-host)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=orcl_stdy)))' - 确认两端
lsnrctl status都输出tcps://:1522且状态为READY - 检查
sqlnet.ora中WALLET_LOCATION是绝对路径、大小写完全一致,且 wallet 文件里证书的CN匹配各自主机名(hostname -f输出)
最容易被忽略的是:切换完成后,原主库(现备库)的 LOG_ARCHIVE_DEST_2 没自动重定向回新主库,导致归档中断。必须立刻在新主库上查 V$ARCHIVE_DEST_STATUS,确认 STATUS 是 VALID 且 TRANSMIT_MODE 是 ASYNC 或 SYNC,否则下一次切换又得从头救火。











