parallel_execution_message_size 设置过小会导致 MRP 进程卡住;建议设为 65536(64KB),需在备库 spfile 中设置并重启生效,且应与 recovery_parallelism 协同配置,后者推荐值为 SRL 组数 × 2,上限通常为 8。

parallel_execution_message_size 设置太小会导致 MRP 进程卡住
Oracle Data Guard 物理备库的 Managed Recovery Process(MRP)默认单线程应用重做日志,但可通过并行恢复加速。关键参数 parallel_execution_message_size 控制并行进程间通信缓冲区大小。若该值过小(如默认 2148 字节),在高吞吐场景下易触发 ORA-04031: unable to allocate shared memory 或 MRP 进程长时间处于 WAITING ON MESSAGE 状态,实际不推进日志应用。
实操建议:
- 将
parallel_execution_message_size设为65536(64KB),这是 Oracle MAA 推荐值,尤其适用于 12c 及以上版本 - 该参数需在备库
spfile中设置并重启实例生效,不能动态修改 - 搭配
recovery_parallelism使用时,注意二者协同:前者管消息通道容量,后者管并发 worker 数量
recovery_parallelism 不等于 CPU 核数,而是取决于 SRL 组数与 I/O 能力
recovery_parallelism 控制 MRP 启动多少个并行恢复工作进程(PR00 ~ PRnn)。但它不是“越多越好”——盲目设高会加剧 buffer busy waits 和 log file sync 等争用,反而拖慢整体恢复速度。
实操建议:
- 物理备库上,
recovery_parallelism建议值 =standby redo log组数 × 2,上限不超过 8(除非 SRL 组 ≥ 6 且存储 I/O 延迟 - 若备库使用 ASM 或高性能 NVMe 存储,可尝试设为 6~8;若为传统 SAN,保持 2~4 更稳妥
- 切勿在未配置足够
standby redo log的情况下启用并行恢复,否则会出现ORA-16433: standby redo log not configured报错
启用并行恢复前必须验证 COMPATIBLE 和归档日志格式
并行恢复功能依赖底层重做日志结构和兼容性支持。Oracle 11gR2 起引入,但 12c R1(12.1.0.1)起才真正稳定。若主备库 COMPATIBLE 参数低于 12.0.0,即使设置了参数,MRP 仍以单线程运行,且无任何告警提示。
实操建议:
- 检查主备库
COMPATIBLE:执行SELECT value FROM v$parameter WHERE name = 'compatible';,确保 ≥12.0.0 - 确认归档日志格式为
LOG_ARCHIVE_FORMAT='%t_%s_%r.dbf'(含 resetlogs ID),否则并行恢复可能跳过部分日志或报ORA-19909: datafile belongs to an orphan incarnation - 备库启动到
MOUNT状态后,运行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 4 DISCONNECT;观察v$managed_standby中process列是否出现多个PRxx进程
并行恢复状态难排查?盯住 v$managed_standby 和 v$session_longops
并行恢复是否真正生效,不能只看 SQL 执行成功与否。常见误区是看到 ALTER DATABASE RECOVER... 返回成功就认为并行已启用,其实 MRP 可能因参数冲突或资源不足自动降级回单线程。
实操建议:
- 持续查询
v$managed_standby:关注process列是否有多个PRxx,以及status是否为APPLYING_LOG;若只有MRP0且process为MRP,说明并行未启用 - 查
v$session_longops:筛选opname LIKE '%Recovery%',观察sofar和totalwork是否持续增长,且sid分布在多个 session 上 - 警惕
log_archive_dest_n中SYNC+NOAFFIRM模式下并行恢复的延迟放大效应——此时网络 RTT 成为瓶颈,调大parallel_execution_message_size效果有限,应优先优化网络或改用ASYNC
standby redo log 组数与 recovery_parallelism 的匹配关系,以及 parallel_execution_message_size 在不同 Oracle 版本下的行为差异——19c 中它影响并行日志解析阶段,而 12c 中主要影响块应用阶段。没对齐这些细节,参数调得再高也白搭。


















