RAC打Patch遭遇PRKC-1002

同事在两节点的RAC上打oneoff patch,在其中一个节点上运行opatch apply,按理应该会自动检测并且分发到另外一个节点,进行patch,但是在分发到第二个节点的时候遇到了PRKC-1002的报错,此时,如果在另外一个节点运行opatch lsinventory也会报错,检测不到原来打过哪些patch了。

我先开启opatch的debug,来查看为什么在节点2上无法运行lsinventory了:

我们看到,是因为缺少了一些文件,如 /ora/product/10.2.0/db_1/inventory/oneoffs/6920066/etc/config/actions.xml等等。

可以看到,整个/ora/product/10.2.0/db_1/inventory/oneoffs/8350262/路径都不存在。

那么,为什么在部署这个patch的时候,这个路径会在node2上没有呢?我们来看看部署patch时完整的log:

请注意,在140行之前的log是说明在node1上的patch过程,到140行为止,说明在node1上patch是成功的。在140行之后是在node2上的patch的log。

到153行为止,在node2上分发文件的过程是没有问题的,而且在node2上检查
在/ora/product/10.2.0/db_1/.patch_storage/8350262_Sep_14_2010_04_59_44/rac/copy_files.txt.instantiated中所示的3个文件都是存在的:

在158行,开始报错了,以下的文件夹在node2上无法建立:

该2个文件夹无法建立,所以我们在node2上运行lsinventory也会报错找不到上述文件夹中的文件。

因此,从log中我们看到,那些patch的jar 文件,只是拷贝到了node2上,连编译都还没编译(因为编译需要将执行语句从node1分发到node2上的/oneoffs/8350262目录下)。在node上,该patch是部署失败的。

那么是什么原因造成了PRKC-1002?我们在metalink上找到了一些线索:

难道是时间不一致?分别在2台机器上运行date看时间,似乎没有差异。我们再试试在同一台机器上运行date:

看出什么问题来了吗?是不是多了很多内容?平时运行date的时候,只有2行,而现在,你却看到了node2上的ssh banner?!

在metalink上还找到了两篇相关的文章:

因此,问题就出在这边了,由于设置了node的ssh banner,我估计在分发或者创建文件的时候,会通过ssh获取节点间的时间,如果有ssh banner,获取不到第一行显示的时间,因此出现上述报错。如果你搜索metelink,还会发现ssh banner会造成很多类似的问题,如gc agent无法push,cluvfy也会失败。

找到问题后,解决问题就比较简单了。而且还有不同的解决方式。

总体来说,如果节点不是很多,不嫌麻烦的话,还是用-local的方式一个节点一个节点的手工部署过去来的安全。方式为:

如果部署多个patch:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据