Standby redo log过小会导致ORA-00313/ORA-00312错误及MRP卡住,因主库切日志时新redo超出备库standby log容量而“接不住”;须主备库同步扩容至≥主库最大online log大小,并满足n×thread_count+1组数要求。

为什么 standby redo log 过小会导致问题
备用日志组(V$STANDBY_LOG)大小小于主库 V$LOG 的 online redo log,会直接触发 ORA-00313 或 ORA-00312 错误,MRP(Managed Recovery Process)进程卡住,备库无法持续接收和应用 redo。根本原因不是“慢”,而是“接不住”——主库切日志时,新生成的 redo block 超出 standby log 文件容量,导致归档传输中断或重做丢失。
调整 standby redo log 大小的实操步骤(主备库都要操作)
不能只改备库,也不能只改主库;必须保证主备两端的 standby redo log 组大小 ≥ 主库最大 online redo log 组大小,且组数满足 n×thread_count + 1(n 为每线程 online 日志组数)。
- 先停掉备库的 MRP:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 主备库均设为手动管理:
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT='MANUAL'; - 在备库上新增足够大的 standby log 组(例如 1GB),再删旧小日志组:
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 8 '/path/stdby08.log' SIZE 1024M;(注意:不能删STATUS = 'ACTIVE'或'CURRENT'的组) - 主库也要加对应组(尤其 RAC 环境需指定
THREAD),否则 switchover 后无法立即接收 redo - 完成后恢复自动管理:
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT='AUTO';(可选,但建议保持AUTO以避免后续 DDL 同步异常)
常见错误与绕过陷阱
最常踩的坑是忽略线程对齐和状态校验。
-
ORA-01517:添加 standby log 时路径已存在同名文件,加REUSE参数即可,但要确认该文件未被其他实例占用 - 删 standby log 前没查
V$STANDBY_LOG.STATUS,误删ACTIVE组导致 MRP 启动失败 - RAC 环境下只给 THREAD 1 加日志,忘了 THREAD 2,备库切换后某线程无 standby log 可用
- 主库 online redo log 是 1GB,但 standby log 只扩到 512MB —— 即使当前没报错,只要主库某次写入 burst 超过 512MB,就会断流
验证是否生效
别只看 V$STANDBY_LOG.BYTES,要跑真实日志流。
- 主库强制切日志:
ALTER SYSTEM SWITCH LOGFILE;(RAC 下对每个 thread 都执行) - 查备库
V$ARCHIVED_LOG是否持续归档,APPLIED = 'YES'且无 gap - 查
V$MANAGED_STANDBY中PROCESS = 'MRP0'的STATUS是否为APPLYING_LOG,SEQUENCE#持续递增 - 观察
V$DATAGUARD_STATS的apply_lag和transport_lag是否稳定在秒级,而非分钟级抖动
真正麻烦的不是改大小,而是改完后没验证跨线程、跨角色(switchover)场景下的兼容性 —— 这点容易被跳过,但一出事就是 RPO 不达标。


















