Oracle Active Data Guard如何开启实时查询

作者:袖梨 2026-08-17

备库显示READ ONLY而非READ ONLY WITH APPLY,说明ADG未真正启用,根本原因是日志应用中断:MRP0进程未处于APPLYING_LOG状态、SRL缺失、compatible参数低于11.1.0.0.0、归档传输配置异常或备库未处于MOUNT状态即尝试启动实时恢复。

备库显示 READ ONLY 而不是 READ ONLY WITH APPLY,说明实时查询根本没启用——这不是权限或 SQL 写法问题,而是日志应用链路卡在了底层状态。

检查备库当前打开模式和恢复状态

先确认是不是真开了 ADG,别被“已启动”误导。最直接的方式是查两个视图:

  1. SELECT OPEN_MODE, DATABASE_ROLE, PROTECTION_MODE FROM v$database; —— 正常 ADG 必须返回 READ ONLY WITH APPLY;若仍是 READ ONLY,说明日志没在边应用边开放查询
  2. SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM v$managed_standby; —— 重点看 MRP0 进程是否存在、状态是否为 APPLYING_LOG;若为 WAIT_FOR_LOG 或压根没这行,就是日志流中断了

确认 compatible 参数是否达标

Oracle 11g+ ADG 的硬性门槛: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 也会失败或无效果。

  1. 查当前值:SHOW PARAMETER compatible
  2. 低于要求?必须停库修改:ALTER SYSTEM SET compatible='11.1.0.0.0' SCOPE=SPFILE;,然后 SHUTDOWN IMMEDIATESTARTUP MOUNTALTER DATABASE OPEN
  3. 注意:此操作不可逆,且要求所有数据文件已完成 11g 兼容格式重写(通常升级后执行过 DML 或 DBMS_STATS 即可满足)

启动实时日志应用的三个前提缺一不可

很多人只盯着 SQL 命令,却忽略这三个底层依赖,导致命令执行成功但实际没生效:

  1. 备库必须处于 MOUNT 状态才能执行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE;如果已经 OPEN READ ONLY,得先 SHUTDOWN IMMEDIATESTARTUP MOUNT
  2. 主库归档目标必须启用 CURRENT LOGFILE 传输,例如:LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db'SYNCASYNC 都可以,但不能是 DEFER 或没配 VALID_FOR
  3. 备库必须有可用的 STANDBY REDO LOGS(SRL),且组数、大小 ≥ 主库 ONLINE REDO LOGS;缺少 SRL 会导致 USING CURRENT LOGFILE 实际降级为普通归档应用,无法实现实时

验证实时应用是否真正生效

光看命令执行成功没用,得看状态是否持续稳定:

  1. v$archive_dest_statusSELECT DEST_NAME, STATUS, RECOVERY_MODE FROM v$archive_dest_status WHERE DEST_ID —— 备库上 RECOVERY_MODE 应为 MANAGED REAL TIME APPLY,不是 MANAGEDMANAGED WITH QUERY
  2. MRP0 进程不能间歇性消失或频繁切换为 WAIT_FOR_LOG;一旦出现,立刻查 v$archive_dest_status.ERROR 列,常见错误如 ORA-16057(服务名解析失败)、ORA-12514(监听未注册)
  3. 主备库网络延迟高或抖动,也会导致实时应用不稳定;尤其跨区域部署时,/etc/sysconfig/networkHOSTNAME 配置错误曾多次引发监听注册失败

真正麻烦的不是命令怎么敲,而是 compatibleMOUNT 状态、SRL 这三样东西是否同时就位——漏掉任何一个,备库就永远卡在 READ ONLY,你再怎么改 SQL 权限也没用。

相关文章

精彩推荐