Oracle主库存在Online Patch,备库该如何打上该补丁
引出
Online Patch需要和普通补丁进行对比,不同的地方在于:
- 普通补丁需要停DB,停监听等,而Online Patch直接在线应用即可。
- 普通补丁打上之后,需要数据库跑脚本,脚本通常位于$ORACLE_HOME/sqlpatch/[BUG ID]这个目录下。而Online Patch则无需跑脚本,但是会出现$ORACLE_HOME/hpatch这个目录。官方文档说明了该目录不能删除。
- readme.txt中表示Online Patch也可以使用常规方式(离线模式),停DB停监听后使用opatch apply来打,但是和普通补丁不同的是没脚本给你跑,也不会出现$ORACLE_HOME/hpatch这个目录。
- 普通补丁打上补丁并在DB上跑完脚本后,可以通过dba_registry_history找到注册信息表示生效。而Online Patch只能通过oradebug patch list查看。
由于以上第2,3这两个不同地方,导致了备库应该如何打上该补丁的疑问。
常规搭建备库,对于补丁的处理是:
在计划做备库的服务器上安装OS,OS打上补丁,安装数据库软件(注意,这些东西版本都要和主库的保持一致)。
之后看主库应用了什么PSU,小补丁,在安装完数据库软件后,就直接在备库的数据库软件也打上相同的补丁,然后才开始搭建备库。
那么问题来了,Online Patch如何在备库打上,Online Patch在线应用的时候是需要实例启动并且监听存在的情况下打,现在连一个实例都没有备库该如何应用这个补丁。
如果使用离线模式,那么没有$ORACLE_HOME/hpatch这个目录,会不会有影响,怎么确定补丁生效。
可能的方法
想了很多的办法,包括如下:
- 直接拷贝主库$ORACLE_HOME/hpatch这个目录到备库,然后备库使用离线模式打上Online Patch。
- 现在备库dbca一个临时的数据库,通过在线应用给临时库打上补丁,这样就有$ORACLE_HOME/hpatch目录,然后在把库删了然后搭建备库。
方法可行性
关于第1种方法,
$ORACLE_HOEM/hpatch目录会存在一些文件,
[oracle@oracle ~]$ cd $ORACLE_HOME/hpatch [oracle@oracle hpatch]$ ll total 528 -rw-r--r-- 1 oracle oinstall 264374 Mar 17 09:33 bug18034737.pch -rw------- 1 oracle oinstall 1 Mar 17 09:33 bug18034737.pchzkm.fixup -rwx------ 1 oracle oinstall 263350 Mar 17 09:33 bug18034737.so -rw------- 1 oracle oinstall 80 Mar 17 16:04 orapatchzkm.cfg
同样的Online Patch在不同的数据库,我用MD5值对文件bug18034737.pch做校验后时不同的,因此该方法估计不对。
至于第2种方法,备库就算是搭建好后那么备库通过oradebug patch list发现Online Patch是启用状态,那么还能通过"opatch util EnableOnlinePatch"去启用补丁吗?
或者说不需要启用,那么$ORACLE_HOME/hpatch下边这两个文件(标红)怎么出来:
[oracle@oracle hpatch]$ ll total 528 -rw-r--r-- 1 oracle oinstall 264374 Mar 17 09:33 bug18034737.pch -rw------- 1 oracle oinstall 1 Mar 17 09:33 bug18034737.pchzkm.fixup -rwx------ 1 oracle oinstall 263350 Mar 17 09:33 bug18034737.so -rw------- 1 oracle oinstall 80 Mar 17 16:04 orapatchzkm.cfg
zkm是我的实例名,你不通过"opatch util EnableOnlinePatch"去启用补丁那肯定不会有这两个文件的,这样估计也是有问题的。
意外发现正确的方式
正常搭建备库肯定是要PSU和补丁都搞定在开始搭建,因为你不知道PSU说不定对Rman工具做了改动修补。
万一你用Rman去搭建备库原本如果PSU和补丁均一致不会有问题,但是如果缺了一个补丁之类导致搭建失败或者虽然成功但是其实哪里有致命的隐患存在。
吐个槽,应该不会有人通过冷备份方式搭建备库吧..
由于库比较大,决定先用Rman做restore database再说。
然后,在按照步骤搭建备库,搞定参数文件控制文件启动备库到mount状态后,使用oradebug patch list,发现竟然是显示
SQL> oradebug patch list Patch File Name State ================ ========= No patches currently installed
这里竟然没有Online Patch的补丁信息??!!
难道现在可以应用??
然后就用“opatch apply online --connectString”去应用补丁,发现成功了。。。
总算是成功了,不需要拷贝从主库拷贝hpatch目录,也不需要dbca临时库,更是提前在restore database之前让主备库的补丁全部一致了。
之后更是恍然大悟,在找解决方法时候查阅了很多资料,其中有一篇官档有提到如下信息:
Beginning with Oracle Database 11g there is support for online patching for qualified interim and diagnostic patches. Online patching provides the ability to patch the processes in an Oracle instance without bringing the instance down. Each process associated with the instance checks for patched code at a safe execution point, and then copies the code into its process space. Thus, the processes being patched may not necessarily pick up the new code at the exact same time.
A key difference between traditional patching and online patching is that traditional patching is implemented at the software level and online patching is implemented at the software or Oracle Database instance level. In other words, instances using an
ORACLE_HOME
that receives a traditional patch always use the patched code whereas instances using anORACLE_HOME
that receives an online patch receive the patched code only if the instance is specified when the patch is applied.
谷歌翻译:
从Oracle Database 11g开始,支持对合格的临时和诊断补丁程序进行在线补丁程序。 在线修补程序提供了修补Oracle实例中的进程而无需关闭实例的能力。 与实例相关联的每个进程都在安全的执行点检查修补的代码,然后将代码复制到其进程空间中。 因此,被修补的进程可能不一定会在完全相同的时间获取新代码。
传统修补程序和在线修补程序之间的主要区别在于,传统修补程序是在软件级别实现的,而联机修补程序是在软件或Oracle数据库实例级别实现的。 换句话说,使用接收传统补丁的ORACLE_HOME的实例始终使用修补的代码,而使用接收在线补丁的ORACLE_HOME的实例仅在应用补丁时指定了实例的情况下才接收修补的代码。
实例级别实现的,怪不得其实实例开启到nomount就可以应用补丁了,怪不得不需要跟普通补丁一样跑脚本。
至此,问题解决。
疑问点
官档有提到不建议对Online Patch在线应用补丁,在有条件的情况下建议回退在线应用方式,使用离线方式对该补丁再次应用。
离线方式没有hpatch目录,也没有脚本给你跑,是否是正常的?
因为dba_registry_history查询不到补丁信息,oradebug patch list也查不到。
如何知道真的补丁生效了。