Oracle 12c物理备库启动后默认为MOUNTED状态,既非只读也不应用日志;须先执行ALTER DATABASE OPEN READ ONLY才能查询,但此时MRP不可运行;如需同步又可查,必须启用实时应用(USING CURRENT LOGFILE),前提为已配置合格的STANDBY REDO LOG。

备库启动后默认不是只读,必须显式打开
Oracle 12c 物理备库在完成 DUPLICATE 或恢复后,处于 MOUNTED 状态,既不读写也不应用日志。很多人误以为“备库就该只读”,但其实它连只读都没开——得手动执行 ALTER DATABASE OPEN READ ONLY 才能查数据。如果跳过这步直接启日志应用,会报错 ORA-16136: Managed Standby Recovery not active,因为只读模式和 MRP(Managed Recovery Process)互斥。
正确顺序是:先开只读 → 再停只读 → 启日志应用 → (可选)再开只读 + 实时应用。关键点在于:OPEN READ ONLY 和 RECOVER MANAGED STANDBY DATABASE 不能同时存在。
- 仅查询用:执行
ALTER DATABASE OPEN READ ONLY,此时日志应用暂停 - 要同步又想查:必须用实时应用模式,即
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT,之后数据库自动保持只读+持续应用 - 切忌在
READ ONLY状态下运行RECOVER命令,会提示ORA-16138: standby database recovery terminated due to error
启用实时日志应用(USING CURRENT LOGFILE)的硬性前提
想让备库边接收边应用、延迟趋近于零,必须配置 STANDBY REDO LOG 并启用 USING CURRENT LOGFILE。没有 standby redo log,执行该命令会报 ORA-38500: USING CURRENT LOGFILE option not available without standby redo logs。
检查方式:SELECT GROUP#, THREAD#, SEQUENCE#, STATUS FROM V$STANDBY_LOG;若无记录或全为 UNASSIGNED,说明没建或建错位置/大小。常见坑:
- standby redo log 组数至少比 online redo log 多一组(例如主库有 4 组 online,则备库建议建 5–6 组 standby)
- 每组大小必须 ≥ 主库最大 online redo log 的 size(否则 RFS 拒绝写入)
- RAC 环境下必须按 thread 分别建,比如
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 10 ...
RECOVER MANAGED STANDBY DATABASE 的三种常用形态对比
这个命令不是“一劳永逸”的开关,不同参数组合行为差异极大,直接影响可用性与数据保护级别:
-
DISCONNECT:后台运行,session 断开,适合生产环境;不加此参数会卡住当前会话 -
USING CURRENT LOGFILE:启用实时应用(Active Data Guard 核心),要求已建 standby redo log;应用延迟通常 - 不带
USING CURRENT LOGFILE(即传统归档应用):等 RFS 把归档日志写完再应用,延迟可能达分钟级,且无法在只读状态下运行 - 错误组合如
OPEN READ ONLY+USING CURRENT LOGFILE会直接报错退出,必须先ALTER DATABASE RECOVER ... CANCEL再切换模式
验证只读状态与日志应用是否真正在跑
光看命令没报错不等于生效。两个最易忽略却关键的检查点:
- 确认只读:查
V$DATABASE.OPEN_MODE应为READ ONLY WITH APPLY(12c+ 特有值),不是READ ONLY或MOUNTED - 确认应用中:查
V$MANAGED_STANDBY.PROCESS,需看到MRP0进程状态为APPLYING_LOG;若只有RFS和ARCH,说明日志收到但没应用 - 延迟判断:用
SELECT ROUND((SYSDATE - LAST_APPLIED_TIME) * 24 * 60, 2) AS MIN_DELAY FROM V$DATAGUARD_STATS WHERE NAME = 'apply lag',单位是分钟;LAST_APPLIED_TIME为空说明 MRP 没起来
真正难的不是敲命令,而是理解“只读”和“应用”在 Oracle DG 里是两种独立状态,靠 RECOVER 命令的参数组合动态切换——漏掉一个条件,比如 standby redo log 缺失或 STANDBY_FILE_MANAGEMENT 没设成 AUTO,整个链路就静默失败。


















