MRP进程自动停止是备库主动中止于不可恢复状态,主因有三:归档损坏、控制文件与物理文件不一致、日志链断裂;须查trace定位根因(如ORA-01111/ORA-19909/ORA-16700等),确认无GAP后按错误类型精准修复,不可盲目重启。

MRP进程自动停止不是偶发故障,而是备库明确检测到不可恢复状态后主动中止——常见原因就三类:归档文件损坏、控制文件与物理文件不一致、日志链断裂。直接重启 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT 通常无效,必须先定位真实根因。
查MRP停止的真实错误来源
别只扫 alert.log,MRP崩溃时写的 trace 文件(路径在告警日志里 Errors in file 行)才含关键线索。重点看最后 20 行的首个非 ORA-00600 错误:
-
ORA-01111+ORA-01110+ORA-01157:控制文件里登记了UNNAMED数据文件,但磁盘上没对应物理文件 -
ORA-19909+ORA-01110:备库尝试应用某个归档时发现其NEXT_CHANGE#异常,大概率是该归档写入不完整(如空间满后被截断) -
ORA-16700或MRP0状态为WAIT_FOR_GAP:主库闪回导致日志序列不连续,备库拒绝继续应用 -
ORA-27040或ORA-19502:RFS 写归档失败,常见于归档路径权限不足、目录不存在、ASM diskgroup 未挂载
确认归档是否已全部应用且无 GAP
这是所有清理和修复操作的前提。误删或跳过未应用归档,MRP 永远起不来,甚至触发重建。
- 查最新已应用归档:
SELECT MAX(SEQUENCE#) FROM v$archived_log WHERE applied = 'YES' AND DEST_ID = 2(DEST_ID先从v$archive_dest确认) - 查 GAP:
SELECT * FROM v$archive_gap,返回空集才安全 - 查 MRP 实时状态:
SELECT process, status, sequence# FROM v$managed_standby WHERE process = 'MRP0',必须是APPLYING_LOG且sequence#持续增长 - 若
applied = 'NO'或v$archive_gap非空,先解决传输卡顿:在主库执行ALTER SYSTEM ARCHIVE LOG CURRENT,再在备库重启 MRP
针对常见错误的实操修复路径
不同错误对应完全不同的处理逻辑,混用会扩大故障面:
- 归档文件损坏(如
ORA-600[2619]):md5sum对比主备库同名归档,不一致就从主库重传;不要删备库文件后再拉取,FAL 不会补这种“已存在但内容错”的归档 -
UNNAMED数据文件(ORA-01111):在备库MOUNT状态下运行SELECT file#, name FROM v$datafile WHERE name LIKE '%UNNAMED%',确认后按需执行ALTER DATABASE CREATE DATAFILE或ALTER DATABASE DATAFILE <file#> OFFLINE DROP - 闪回导致日志链断裂(
ORA-16700):必须手动注册闪回后主库生成的第一个新归档,命令为ALTER DATABASE REGISTER PHYSICAL LOGFILE '<new_archivelog_path>',之后再启动 MRP - 归档路径权限问题(
ORA-27040):用namei -l /path/to/arch检查每级目录对oracle用户是否有x权限;改完后需在主库执行ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER再=ENABLE,强制重连 RFS
最易被忽略的是:RMAN 的 CROSSCHECK 和手动 find ... -delete 必须分两步做,且中间不能跳过检查 v$archive_gap。控制文件元数据和磁盘文件状态一旦脱节,后续任何恢复操作都可能静默失败。


















