用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

初衷

分享的初衷也是为了人类的共同进步。今天在遇到了一连串的问题之后,百度了各大博客和论坛,均没有确切的Windows环境下,用OPatch工具给Oracle数据库打补丁的细致的问题讲解。本人通过反复尝试,终于从什么都不行,到补丁安装成功。感到不易的同时,也留下一份攻略,算是回馈帮助我很多的互联网吧,看到的朋友觉得有用的话可以转载,但要注明出处哦,谢谢!

OPatch介绍

这是一个安装工具,具体的概念建议百度,这里只需要会用就行。只要正常安装Oracle数据库,那么在Oracle数据库软件安装位置下,自然会有OPatch文件夹。我创建的Oracle数据库软件安装位置(也就是ORACLE_HOME的位置)是:“D:\Oracle\Base\product\11.2.0\dbhome_1”。一定要记住自己的数据库对应位置,后面要用到。

打补丁之前的准备工作一:查看OPatch版本

这是一个开始之前很基本的步骤,是一个开始,当然这个开始就绊倒了很多人也包括我。
具体的步骤是这样的:

一、找到自己的OPatch文件夹的位置
一般都在Oracle软件的位置,我的OPatch目录就在"D:\Oracle\Base\product\11.2.0\dbhome_1\OPatch"。如下图所示:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

二、通过cd命令进入OPatch目录
打开命令行win+R,输入cmd(当然我更倾向于打开管理员的命令窗口,不会的请百度)。如下图所示:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
三、在这个目录下输入"opatch version"命令
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

问题1:显示"Oracle Home is not set. OPatch cannot proceed!"

命令行出现下面这种情况:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
解决办法:在环境变量的系统变量中设立一个"ORACLE_HOME",变量值是Oracle软件安装位置,我的对应值是"D:\Oracle\Base\product\11.2.0\dbhome_1"。
只靠这一步还是不行,还得在命令行中添加命令"
set ORACLE_HOME=D:\Oracle\Base\product\11.2.0\dbhome_1
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
然后你在输入"opatch version"命令,就好使了:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

打补丁之前的准备工作二:关闭所有的Oracle服务

Ctrl+shift+Esc,调出任务管理器。在菜单项的下面一行找到"服务",点开,找到所有Oracle开头的服务,如下图所示:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
在单个服务的后面,鼠标右键,选择"停止",当然我这里早就把它们都停掉了,后面这些Oracle开头的服务全都要停掉才能打补丁。
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

开始打补丁

步骤一:解压补丁文件
将补丁文件解压,会得到一个数字代号的文件夹。我的补丁名字《p10432045_*********》解压后得到一个文件夹为《10432045》。

步骤二:将数字代号的文件夹放在一个离盘根目录较近的地方,比如我是把《10432045》文件夹放在D:根目录下(个人习惯而已,其实地址随意,不要有中文就好)。

步骤三:在cmd命令行中进入《10432045》的目录:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
步骤四:在这个目录输入"%ORACLE_HOME%\OPatch\opatch apply"命令,如下图所示:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
打补丁的步骤就这些。运气好的同学下面一气呵成,运气不咋地的同学跟我一样要开始漫长的调试。。

问题2::出现’%ORACLE_HOME%不是内部或外部命令,也不是可运行的程序或批处理文件’

用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

解决办法:命令行中添加命令"
"set ORACLE_HOME=D:\Oracle\Base\product\11.2.0\dbhome_1"就行

问题3:出现"ZOP-51: The patch location is not valid for apply, because it doesn’t have correct metadata, or it points to a patch directory.Please check the arguments and try again OPatch failed with error code = 135.

用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
解决办法:这种情况说明补丁解压后的文件夹跟OPatch文件夹重了,你肯定跟曾经的我一样,把解压后的数字代码文件夹《10432045》放在OPatch目录下了"D:\Oracle\Base\product\11.2.0\dbhome_1\OPatch\10432045"
然后在这个目录下输入命令"%ORACLE_HOME%\OPatch\opatch apply"
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
这是肯定不行的,解决的办法只有一个,就是将《10432045》放到其他文件夹,比如我放在D盘根目录下:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

问题4:出现"OPatch could not create/open history file for writing .OPatch failed to lock and get an Inventory Session for the given Oracle Home.OPatch failed with error code = 73."

用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
解决办法:显示没有权限创建《.patch_storage》目录,那它没有创建,我们去给它创建一个让它用不就好了。在ORACLE_HOME下(“D:\Oracle\Base\product\11.2.0\dbhome_1”)创建一个文件夹《.patch_storage》。啥?你也没权限在Oracle目录下创建文件夹,百度一下文件夹修改受限怎么办,或者百度一下如何改变文件夹的所有权。篇幅过多,不予赘述。

问题5:出现"OiiolLogger.addFileHandler:Error while adding file handler - C:\Program Files\Oracle\Inventory/logs\OPatch2020-09-18_11-22-15-AM.log.java.io.FileNotFoundException: C:\ProgramFiles\Oracle\Inventory\logs\OPatch2020-09-18_11-22-15-AM.log (拒绝访问。)无法锁定主产品清单。OPatch 将尝试重新锁定。"

用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
解决办法:哪地方受限,哪地方我来解决。提示"C:\Program Files\Oracle\Inventory\logs"这个目录下加入不了OPatch2020-09-18_11-22-15-AM.log文本文件,那就在目录下手动创建加入这个文件,然后再重新执行打补丁命令。没权限创建文件?百度一下你就知道。

问题6:打补丁的过程中跳出问题"UtilSession 失败: Can’t create patch_storage loc. for NApply.OPatch failed with error code = 73"

用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
哦吼,那你肯定是和曾经的我一样,没有在ORACLE_HOME下创建《.patch_storage》文件夹,而是创建了".patch_storage"文件。

解决办法:将.patch_storage文件删除,创建《.patch_storage》文件夹
创建好再运行,目录什么的都能用了。
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
能列的问题都列了一遍了,应该都能装完补丁吧。。
补丁安装过程:
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录

验证补丁是否安装上

进入OPatch目录,输入"opatch lsinventory"命令
用OPatch给Oracle打补丁,小白踩坑以及解决办法全纪录
大功告成!!