opatch apply是核心命令,但必须先升级opatch至≥12.2.0.1.28、执行opatch prereq检查冲突、停监听和实例,否则90%失败源于这三步疏漏。

直接上结论:opatch apply 是核心命令,但跳过 opatch prereq 检查、忽略 OPatch 版本升级、不关监听和实例就硬跑,90% 的失败都出在这三步。
必须先升级 OPatch 到 12.2.0.1.28 或更高
Oracle 19c 官方明确要求 RU/PSU 补丁(如 19.21、19.24)需搭配 OPatch ≥ 12.2.0.1.28。低于此版本的 opatch version 输出会直接被拒绝执行补丁,报错类似 OPatch failed with error code 254。
- 下载对应平台的
p6880880_190000_Linux-x86-64.zip(Linux)或p6880880_190000_Windows.zip(Windows) - 以
oracle用户(单实例)或分别以grid和oracle用户(RAC)解压覆盖$ORACLE_HOME/OPatch - 执行
$ORACLE_HOME/OPatch/opatch version确认输出为OPatch Version: 12.2.0.1.28或更新 - 权限必须正确:
chown -R oracle:oinstall $ORACLE_HOME/OPatch(Linux),Windows 下需管理员身份运行命令提示符
补丁前必做:prereq 检查 + 服务停用
opatch prereq CheckConflictAgainstOHWithDetail -ph <patch_dir></patch_dir> 不是可选项,是防止补丁覆盖冲突文件的唯一前置防线。跳过它,可能把 libclntsh.so 或 libnnz19.so 覆盖成不兼容版本,导致后续 sqlplus 连不上、ORA-28547 直接炸开。
- 先停监听:
lsnrctl stop(单实例)或srvctl stop listener -l <listener_name></listener_name>(RAC) - 再停数据库实例:
srvctl stop database -d <db_name></db_name>(RAC)或sqlplus / as sysdba→shutdown immediate(单实例) - GI Home(RAC)必须先于 RDBMS Home 打补丁;顺序反了,
crsctl start crs会卡在ora.cssd启动失败 - 检查磁盘空间:
$ORACLE_HOME所在文件系统剩余空间建议 ≥ 5GB,否则opatch apply中途报错 73(空间不足)
opatch apply 执行时的关键细节
命令本身简单,但路径、用户、上下文稍错就失败。常见错误不是语法错,而是环境错。
- 进入
$ORACLE_HOME/OPatch目录后执行,不要用绝对路径调用opatch,否则inventory注册可能错位 - 补丁目录必须指向包含
etc/config/inventory.xml的子目录(通常是解压后的一级数字目录,如/tmp/patch/32545013),不是 ZIP 文件所在路径 - Windows 下注意路径分隔符:
opatch apply C:\temp\patch\32545013,别写成斜杠 - 遇到交互提示
Do you want to proceed? [y|n],输y回车即可;静默模式可用-silent参数,但不推荐首次生产使用 - 日志默认生成在
$ORACLE_HOME/cfgtoollogs/opatch/apply_*.log,出错第一反应看这个,不是看屏幕输出
打完不能直接启库:datapatch 必须跟上
opatch apply 只更新二进制和配置文件,数据库字典变更由 datapatch 驱动。漏掉这步,V$VERSION 显示仍是旧版,DBA_REGISTRY_HISTORY 里没有补丁记录,某些 CVE(如 CVE-2024-1086)实际未修复。
- 启动数据库后,用
oracle用户执行:$ORACLE_HOME/OPatch/datapatch -verbose - 确保当前
ORACLE_SID已设好,且sqlplus / as sysdba能连上;否则报ERROR: Unable to connect to database - RAC 环境下,
datapatch会自动滚动执行所有实例,无需手动切节点 - 验证是否生效:
SELECT BANNER FROM V$VERSION;应显示类似Oracle Database 19c Enterprise Edition Release 19.21.0.0.0
最常被忽略的点是:补丁包里的多个子补丁(比如同时含 DB、OCW、ACFS)是否全打了。opatch lsinventory -detail 输出里要逐行核对每个 patch number(如 32545013、32545014)的状态是否为 APPLIED,而不是只扫一眼顶部有没有“SUCCESS”。











