直接修改PATH顺序无效,因系统缓存命令路径、shell已加载旧版opatch或Oracle工具硬编码调用$ORACLE_HOME/OPatch/opatch;必须替换原OPatch目录、校验JRE完整性并修复inventory。 为什么直接改 PATH 顺序不顶用 很多朋友在把新版opatch解压
很多朋友在把新版opatch解压到$ORACLE_HOME/OPatch后,习惯性地只执行一句export PATH=$ORACLE_HOME/OPatch:$PATH,就以为万事大吉了。结果呢?运行opatch version一看,显示的依然是旧版本。问题出在哪儿?
其实,系统很可能已经缓存了命令的路径(即便你改了PATH,也需要hash -r来清除缓存),或者你的shell在启动时,已经从其他位置(比如/usr/local/bin或者另一个旧的Oracle Home)加载过同名的二进制文件。更棘手的情况是,一些Oracle工具,比如datapatch,其内部是硬编码调用$ORACLE_HOME/OPatch/opatch的,它根本不理会你的PATH环境变量怎么设置。所以,只调整PATH顺序,很多时候只是隔靴搔痒。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这里有个关键点:Oracle就认$ORACLE_HOME/OPatch这个固定路径下的完整目录。什么软链接、重命名后放在旁边,这些“小聪明”它通常不买账。正确的操作流程,其实是一套标准动作:
mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_bak,给自己留条后路。OPatch/。有时候压缩包会多一层版本号目录,比如p6880880_122010_Linux-x86-64/OPatch/,这时候需要手动调整。OPatch目录整个移动到$ORACLE_HOME/下:mv OPatch $ORACLE_HOME/。opatch可执行文件和它自带的jre/子目录:chown -R oracle:oinstall $ORACLE_HOME/OPatch。怎么验证成功了?切换到oracle用户,执行which opatch$ORACLE_HOME/OPatch/opatch。再直接运行$ORACLE_HOME/OPatch/opatch version,看看输出的版本号是不是你下载的那个(例如12.2.0.1.28)。
新版OPatch(特别是12.2.0.1.13之后的版本)通常会自带一个jre/子目录,并且默认会优先使用自带的JRE。但如果这个自带的JRE缺失、损坏,或者版本太老(比如还停留在Ja va 1.7),你就会看到类似Ja va (1.7) could not be located. OPatch cannot proceed!这样的错误。这可不是简单的环境变量问题,而是OPatch自身的运行时依赖没得到满足。
OPatch自带的JRE,然后从数据库主目录里复制一份兼容的JDK过来。命令可以这样写:rm -rf $ORACLE_HOME/OPatch/jre && cp -r $ORACLE_HOME/jdk/jre $ORACLE_HOME/OPatch/。/usr/ja va)来替代。这通常行不通,因为OPatch对JDK路径有硬性依赖,并且要求与当前Oracle Home的JDK版本保持兼容。$ORACLE_HOME/OPatch目录,直接执行./opatch version,只要不报任何Ja va相关的错误,就算过关了。opatch lsinventory -detail这个命令,可不只是让你看看装了哪些补丁。它实际上会触发Oracle Inventory(中央库存)的完整性校验。如果输出里出现了Inventory load failed或者OPatch failed with error code 73这类提示,那就说明inventory已经损坏了。在这种情况下,后续所有的opatch apply操作都会失败,哪怕你的OPatch版本完全正确也无济于事。
$ORACLE_HOME/oui/bin/runInstaller -ignoreSysPrereqs -force -silent -attachHome ORACLE_HOME=$ORACLE_HOME ORACLE_HOME_NAME=OraDB12c_home1。ORACLE_HOME_NAME必须和系统里注册的名称完全一致。你可以通过cat /etc/oraInst.loc | grep inventory_loc找到inventory的路径,然后去该路径下的ContentsXML/inventory.xml文件里确认具体的名称。opatch lsinventory -detail,确认没有任何报错信息了,才能继续后续的打补丁操作。说到底,真正把人卡住的,往往不是补丁包本身,而是OPatch整个调用链条里某个不起眼的环节——可能是inventory,可能是JRE,也可能是PATH缓存——没有对齐。这些环节一旦出问题,给出的错误信息又常常模糊不清,导致排查起来异常困难。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述