主备库补丁版本不一致(如主库11.2.0.4.200115、备库11.2.0.4.0)会因redo格式不兼容导致mrp进程立即报ora-16778并硬性中断物理dg同步,必须严格对齐所有节点的opatch输出、catbundle.sql执行及密码文件,缺一不可。

主库补丁后备库MRP直接报ORA-16778,不是警告是硬中断
物理DG依赖二进制级redo解析,而Oracle 11g的补丁(尤其是PSU/RU)会修改redo日志结构字段偏移、SCN推进逻辑和SRL校验方式。哪怕主备库都是11.2.0.4,但主库打了PSU 11.2.0.4.200115、备库仍是11.2.0.4.0,MRP读取主库发来的redo块时就会因格式不识别而立即报ORA-16778(Log apply failed due to incompatible redo format),并中止应用进程——这不是可忽略的告警,是强制阻断。
验证方式很简单:在备库执行SELECT process, status, sequence# FROM v$managed_standby WHERE process = 'MRP0',若返回空行或status为WAIT_FOR_LOG,基本就是补丁不一致导致MRP静默退出;再查alert.log末尾,大概率看到control file version mismatch或incompatible database version提示。
不能只比v$version,必须逐行核对opatch lsinventory输出
v$version里显示“Oracle Database 11g Enterprise Edition Release 11.2.0.4.0”远远不够,末尾补丁号(如11.2.0.4.200115 vs 11.2.0.4.0)才是关键。更可靠的方式是运行:
opatch lsinventory -oh $ORACLE_HOME -detail
确认RDBMS和Network组件下所有Patch ID完全一致——官方MOS文档2485457.1明确要求:物理DG主备库必须运行完全相同的Oracle Home补丁集,且opatch lsinventory输出必须逐行一致。
- 常见漏点:主库打了PSU,但备库只装了Base Release;或用了不同下载源的补丁包(MD5不一致)
- RAC环境每个节点都得单独验证:漏掉一个实例节点,该节点的MRP就会持续报
ORA-16778,但错误只出现在那个节点的alert.log里,容易被忽略
补丁同步必须按顺序执行,跳步必失败
典型错误是:主库刚打完补丁就立刻在备库上执行opatch apply,然后重启MRP——结果MRP启动失败。因为主库归档流仍按旧格式发送,而备库已升级,无法解析。
正确顺序是:
- 先确认主库已成功应用目标补丁,并执行过
$ORACLE_HOME/rdbms/admin/catbundle.sql psu apply(否则数据字典不更新) - 停主库归档传输:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER - 在备库执行相同补丁安装(用同一份OPatch和补丁zip)
- 备库升级后,必须运行
catbundle.sql,否则MRP无法初始化 - 最后才启用传输:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE
RAC环境下口令文件和remote_login_passwordfile也得同步
补丁升级常伴随remote_login_passwordfile参数重载或密码文件格式微调。若主库升级后remote_login_passwordfile值变为EXCLUSIVE,而备库仍为SHARED,或备库各节点的orapw$ORACLE_SID文件权限不是-rw-r-----、属主不是oracle:oinstall,就会触发ORA-16191或ORA-01017,导致LGWR静默失败、归档传输中断。
操作要点:
- 主库用
ORAPWD FORCE=Y FORMAT=12.2生成新口令文件(11g兼容) - scp到备库所有节点的
$ORACLE_HOME/dbs/下,文件名必须与备库ORACLE_SID严格一致 - 确保所有节点
remote_login_passwordfile参数值一致且为scope=spfile
复杂点在于:补丁对齐不只是“软件版本”,它牵扯到控制文件结构、redo格式、密码认证链、数据字典一致性——任何一个环节没对齐,物理DG就不是“慢一点”,而是彻底停摆。











