如果备库当前显示的是READ ONLY,而不是READ ONLY WITH APPLY,这通常说明 Oracle Active Data Guard(ADG)并没有真正启用。问题根源大多出在日志应用链路被中断:例如 MRP0 进程没有处于 APPLYING_LOG 状态、SRL(Standby Redo Log)未正确配置、compatible 参数低于 11.1.0.0.0、归档日志传输配置异常,或者备库尚未处于 MOUNT 状态时就提前启动了实时恢复。

备库显示 READ ONLY 而不是 READ ONLY WITH APPLY,就意味着实时查询功能并未开启——这不是权限设置或 SQL 语句写法的问题,而是日志应用链路在底层状态上没有跑通。
检查备库当前打开模式和恢复状态
第一步要确认 ADG 是否真的已经启用,不要被“服务已启动”这样的表象误导。最直接、最有效的方式就是检查以下两个视图:
SELECT OPEN_MODE, DATABASE_ROLE, PROTECTION_MODE FROM v$database;—— 正常情况下,启用 Oracle ADG 后必须返回READ ONLY WITH APPLY;如果仍然是READ ONLY,说明备库只是只读打开,并没有一边应用日志一边提供查询SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM v$managed_standby;—— 重点查看MRP0进程是否存在,以及状态是否为APPLYING_LOG;如果显示为WAIT_FOR_LOG,或者根本没有这条记录,就说明日志传输或应用流程已经中断
确认 compatible 参数是否达标
对于 Oracle 11g 及以上版本,Active Data Guard 有一个必须满足的前提条件:compatible 参数不能低于 '11.1.0.0.0'。很多环境里虽然数据库版本已经升级到 11.2.0.4,但如果这个参数仍停留在 10.2.0.0.0(这种情况在升级后未手动调整时非常常见),那么 ADG 实际上会退化为普通只读备库。此时执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE 往往不是直接报错,就是表面执行成功但实际上没有启用实时应用。
- 查看当前参数值:
SHOW PARAMETER compatible - 如果低于要求,就必须停库修改:
ALTER SYSTEM SET compatible='11.1.0.0.0' SCOPE=SPFILE;,然后执行SHUTDOWN IMMEDIATE→STARTUP MOUNT→ALTER DATABASE OPEN - 注意:该操作不可逆,并且要求所有数据文件已经完成 11g 兼容格式重写(通常在升级后执行过 DML 或
DBMS_STATS后即可满足)
启动实时日志应用的三个前提缺一不可
很多人在排查 Oracle ADG 实时查询问题时,只关注 SQL 命令本身,却忽略了下面这三个关键的底层条件,结果就是命令看起来执行成功,实际上并没有生效:
- 备库必须处于
MOUNT状态,才能执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;如果当前已经是OPEN READ ONLY,则需要先执行SHUTDOWN IMMEDIATE,再STARTUP MOUNT - 主库归档目标必须启用 CURRENT LOGFILE 传输,例如:
LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';这里无论使用SYNC还是ASYNC都可以,但不能是DEFER,也不能缺少VALID_FOR配置 - 备库必须配置可用的
STANDBY REDO LOGS(SRL),并且组数和大小要大于或等于主库的ONLINE REDO LOGS;如果没有 SRL,USING CURRENT LOGFILE实际上会退化为普通归档应用,无法实现真正的实时应用与实时查询
验证实时应用是否真正生效
不要只看命令是否返回成功,更重要的是观察实时应用状态是否持续稳定,这才是判断 Active Data Guard 是否真正开启的关键:
- 检查
v$archive_dest_status:SELECT DEST_NAME, STATUS, RECOVERY_MODE FROM v$archive_dest_status WHERE DEST_ID <= 2;—— 在备库上,RECOVERY_MODE应显示为MANAGED REAL TIME APPLY,而不应该是MANAGED或MANAGED WITH QUERY MRP0进程不能间歇性消失,也不能频繁切换到WAIT_FOR_LOG;一旦出现这种情况,应立即检查v$archive_dest_status.ERROR列,常见错误包括ORA-16057(服务名解析失败)和ORA-12514(监听未注册)- 主备库之间如果存在较高网络延迟或链路抖动,也会导致实时日志应用不稳定;尤其在跨区域部署场景下,
/etc/sysconfig/network中HOSTNAME配置错误,曾多次导致监听注册失败,进而影响 ADG 实时同步
真正棘手的并不是命令怎么执行,而是 compatible、MOUNT 状态和 SRL 这三个关键条件是否同时满足——只要漏掉其中任何一项,备库就会一直停留在 READ ONLY,这时无论怎么调整 SQL 或权限,都无法开启 Oracle Active Data Guard 的实时查询能力。
