必须手动创建Standby Redo Log(SRL),因Oracle不自动创建且不复用Online Redo Log;RFS需将主库重做流写入SRL,MRP才能读取应用,否则卡在WAIT_FOR_LOG。

没配 Standby Redo Log,MRP 进程就起不来——哪怕归档日志已传到备库,SELECT * FROM V$MANAGED_STANDBY 里 MRP0 状态永远是 WAIT_FOR_LOG 或 NOT APPLYING。
为什么备库必须手动建 SRL,且不能复用 Online Redo Log
Oracle 不会自动创建 Standby Redo Log,也不会把主库传来的重做流写进 Online Redo Log。RFS 进程收到日志后,必须有地方可写,这个“地方”就是 SRL;MRP 进程才能从中读、解析、应用。如果误用 ALTER DATABASE ADD LOGFILE(不是 ADD STANDBY LOGFILE),建出来的是 Online Redo Log,组号还可能和现有 Online 组冲突,导致后续 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 报错或静默失败。
- 查当前 Online Redo Log:运行
SELECT GROUP#, BYTES FROM V$LOG,记下大小(单位字节)和组号范围 - 查已用组号:运行
SELECT GROUP# FROM V$LOGFILE UNION SELECT GROUP# FROM V$STANDBY_LOG,避免重复 - 确认备库处于
MOUNTED状态:SELECT OPEN_MODE FROM V$DATABASE必须返回MOUNTED,否则建 SRL 会报ORA-01156
建多少组?大小怎么定?路径怎么写
单实例主库有 n 组 Online Redo Log,备库至少建 n+1 组 SRL;RAC 主库则按 (每线程日志组数 + 1) × 线程数 计算。大小必须和主库 V$LOG.BYTES 完全一致,差 1 字节都不行。路径要真实存在、Oracle 用户有写权限,且不能照抄主库路径(比如主库是 +DATA/orcl/,备库得改成 +DATA/stby/),否则 LOG_FILE_NAME_CONVERT 映射失效,MRP 启动时重命名失败却不报错。
- 标准命令示例(ASM):
ALTER DATABASE ADD STANDBY LOGFILE GROUP 101 ('+DATA/stby/srl101a.log', '+DATA/stby/srl101b.log') SIZE 200M - 文件系统示例:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 102 ('/u02/oradata/stby/srl102a.log', '/u02/oradata/stby/srl102b.log') SIZE 200M - 建完立刻验证:
SELECT GROUP#, SEQUENCE#, STATUS, BYTES/1024/1024 FROM V$STANDBY_LOG,STATUS应为UNASSIGNED
建完 SRL 还是起不来 MRP?三个关键检查点
SRL 存在 ≠ MRP 能跑。常见卡在 WAIT_FOR_LOG 的根本原因往往不在 SRL 本身,而在配套参数或状态。
- 确认
STANDBY_FILE_MANAGEMENT是AUTO:SHOW PARAMETER standby_file_management,否则新增数据文件时 MRP 会中断 - 确认
LOG_FILE_NAME_CONVERT已正确设置并重启过备库实例(不是只改 spfile):SHOW PARAMETER log_file_name_convert,输出应包含主库路径 → 备库路径的映射对 - 确认备库没有被意外打开:
SELECT OPEN_MODE FROM V$DATABASE必须是MOUNTED,不是READ ONLY或READ WRITE
最容易被忽略的是 LOG_FILE_NAME_CONVERT 配置后未重启实例,以及 SRL 路径用了主库 ASM 磁盘组名但没在该参数里做映射——这时 MRP 启动会尝试用主库路径去 open 文件,失败后直接退出,v$managed_standby 里看不到错误,只有 trace 文件里有 ORA-27037 或 ORA-17502。


















