OPatch版本过低会导致RU应用失败,必须升级至指定版本并用unzip -o覆盖;RAC需停CRS而非仅DB;单机ASM也须按GI流程操作;opatch auto用于GI+DB联合升级,opatch apply仅限纯DB;RU后必须执行datapatch更新数据字典。
OPatch 版本太低会导致 apply RU 失败
oracle 的 ru(release update)补丁对 opatch 版本有硬性要求,低于指定版本时,opatch apply 会直接报错退出,常见错误信息类似:opatch failed with error code 25 或提示 “this patch is not applicable on current oracle home”。不是补丁本身有问题,而是工具不认。
- 查当前 OPatch 版本:
$ORACLE_HOME/OPatch/opatch version - RU 补丁包里一般自带新版
OPatch,路径在./etc/config/inventory.xml或补丁说明文档里明确写了最低要求(比如 RU 23.7 要求 OPatch ≥ 14.1.0.0.0) - 升级 OPatch 必须用
unzip -o覆盖解压,不能只拷文件;解压后执行opatch lsinventory -detail确认版本已更新 - 别跳过
opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir <patch_dir></patch_dir>,它能提前发现冲突,比 apply 中断后回滚省事得多
apply RU 前必须停数据库和监听,但 asm 实例处理方式不同
非 RAC 环境下,停掉数据库实例 + 监听即可;RAC 环境下,srvctl stop database -d <db_name></db_name> 是必须的,但 ASM 实例不能简单停——RU 补丁往往同时更新 Grid Infrastructure,所以得先停 CRS:
- 用
crsctl stop crs(需 root 权限),再确认ps -ef | grep d.bin无残留进程 - 切勿只停 DB 实例而留 CRS 运行,否则
opatch apply可能卡在“waiting for CRS to be down”或报PRCI-1077 - 补丁应用完成后,先启 CRS(
crsctl start crs),再启 DB,顺序反了会导致 OCR 访问失败 - 单机 ASM 用户容易误以为“没开 RAC 就不用管 CRS”,其实只要用了 ASM,就受 GI 管控,必须按 GI 升级流程走
opatch auto 和 opatch apply 的适用边界很关键
opatch auto 是 GI+DB 联合升级的封装命令,自动协调 Grid 和 DB 补丁顺序;opatch apply 是纯手工模式,只作用于当前 $ORACLE_HOME。选错命令会导致补丁只打一半,后续启动失败。
- 如果是 GI 和 DB 在同一台机器(常见于单机 ASM),必须用
opatch auto <patch_dir></patch_dir>,且需 root 执行 - 如果只是纯数据库软件升级(无 ASM、无 GI),才可用普通用户运行
opatch apply -
opatch auto会自动调用opatch prereq和opatch apply,但它不检查 DB 是否 open——必须确保 DB 已 shutdown,否则报ORA-01034: ORACLE not available - 执行
opatch auto后,务必检查日志:$ORACLE_HOME/cfgtoollogs/opatchauto/core/opatchauto.log,里面会有每个子步骤是否成功的标记
RU 应用后必须跑 datapatch,否则新特性不可用
RU 补丁分两层:二进制层(由 OPatch 完成)和数据字典层(由 datapatch 完成)。漏掉后者,视图、包、参数可能仍显示旧版本,比如 v$version 看起来像打了补丁,但 dbms_sqltune 功能异常或 optimizer_features_enable 不生效。
- 启动数据库后,用
sqlplus / as sysdba连上,执行datapatch -verbose - 注意:必须在所有 PDB 都 open 的状态下运行(CDB$ROOT + 每个 PDB),否则只更新了根容器,PDB 字典不一致
-
datapatch日志默认在$ORACLE_HOME/sqlpatch/<patch_id>/<timestamp>/</timestamp></patch_id>,关键看最后是否出现 “Patch X applied successfully” - 如果中途中断,别重跑
datapatch—— 它有幂等性,重复执行不会出错,但要确认之前失败点(比如某个 PDB 没 open)已修复
datapatch 不是可选项,它和 opatch apply 是 RU 完整性的两个轮子,少一个,数据库就处在“半补丁”状态,问题往往延后暴露。










