Oracle官方不提供真正“一键”RU补丁工具,所谓一键实为opatch apply、datapatch -verbose、catbundle.sql三步组合;必须先升级OPatch至12.2.0.1.31+,RAC需严格按GI→DB顺序打补丁,datapatch须在OPEN状态下执行且不可跳过-verbose,最后手动运行utlrp.sql编译无效对象。

opatch apply 不是“一键”,而是三步动作的组合:校验、打补丁、加载SQL。Oracle 官方从不提供真正意义上的一键安装工具,所有封装脚本本质都是对 opatch、datapatch 和 catbundle.sql 的调用包装——省的是敲命令的手,不是读 README.html 的脑。
先升级 OPatch 到最低兼容版本(19.24 要求 OPatch 12.2.0.1.31+)
很多失败卡在第一步:opatch apply 直接报错 OPatch failed with error code 73 或静默跳过组件注册,原因就是 OPatch 太旧。19.24 RU 明确要求 OPatch ≥ 12.2.0.1.31,低于此版本会跳过 $ORACLE_HOME/inventory/ContentsXML/comps.xml 校验,导致后续 datapatch 找不到已应用补丁记录。
实操建议:
- 下载最新 OPatch(MOS Patch 6880880),解压覆盖
$ORACLE_HOME/OPatch,不要仅替换opatch文件 - 执行
$ORACLE_HOME/OPatch/opatch version确认输出含12.2.0.1.31或更高 - 运行
$ORACLE_HOME/OPatch/opatch lsinventory -detail,检查输出中是否含Oracle Interim Patch Installer字样——没有说明替换未生效
RAC 环境必须先打 GI Home,再打 RDBMS Home
顺序错 = 集群不可用。常见错误现象是 srvctl start database 报 ORA-27123: unable to attach to shared memory segment,或 CRS 启动后数据库实例始终为 OFFLINE 状态。这是因为 19.24 RU 中 GI 和 DB 补丁存在跨层依赖:ASM 实例启动逻辑被 GI 补丁修改,而 DB 补丁依赖该新逻辑初始化 SGA。
关键动作:
- 停所有 DB 实例和监听:
srvctl stop home -o $ORACLE_HOME -s /tmp/status - 以
grid用户进入 GI Home,执行opatch apply -oh $GI_HOME -local - 等 GI 补丁完成并确认
crsctl check crs正常后,再切回oracle用户打 DB Home - RAC 下严禁在单节点打完 DB 补丁就启库——必须所有节点 GI 补丁完成,再统一打 DB 补丁
datapatch 必须在数据库 OPEN 状态下执行,且不能跳过 -verbose
datapatch -verbose 不是可选项,是诊断刚需。很多人图快加 -skip_upgrade_check 或漏掉 -verbose,结果 datapatch 声称成功,但查询 dba_registry_sqlpatch 发现 STATUS = 'LOADING' 或 ERRORS = 'YES',归档日志开始堆积,ORA-00600 [ktbdchk1] 随后爆发。
正确姿势:
- 确保数据库已
OPEN(非MOUNT),且所有 PDB 已OPEN - 用
sqlplus / as sysdba连入 CDB$ROOT,执行datapatch -verbose(不加-skip_upgrade_check) - 检查输出末尾是否有
Successfully completed,而非Completed successfully(后者是假成功) - 验证:
SELECT PATCH_ID, STATUS, ACTION FROM dba_registry_sqlpatch WHERE BUNDLE_SERIES = 'RU';,全部应为APPLIED
补丁后必须手动编译无效对象,别信“自动完成”
19.24 RU 修改了若干数据字典视图定义(如 v$asm_diskgroup_stat),导致大量系统包失效。现象是 RMAN 备份超时、DBMS_SCHEDULER job 报 PLS-00905: object SYS.DBMS_SCHEDULER is invalid,但 datapatch 日志里完全不提这事。
收尾动作:
- 执行
ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=BOTH;(避免purge dba_recyclebin触发编译风暴) - 运行
$ORACLE_HOME/rdbms/admin/utlrp.sql(不是utlirp.sql) - 检查
SELECT COUNT(*) FROM dba_objects WHERE status != 'VALID';,结果应为 0;若仍有,重点查OWNER = 'SYS'的PACKAGE BODY
opatch apply 会静默截断路径导致部分子补丁未安装——务必用 ls -l 确认解压后目录名是纯 ASCII,且 opatch lsinventory -detail 输出中的 Patch description 字段能完整显示 RU 版本号(如 Database Release Update : 19.24.0.0.240716)。


















