Oracle打补丁工具opatchauto调用过程浅析
【问题现象】
Oracle 19.11 RAC 打补丁升级到19.15的过程中,DB是关闭的,使用opatchauto apply 19.15RU最后提示:
[WARNING] The database instance 'wewin1' from /oracle/app/oracle/product/19/db',in host'weerp1 is not running.
SQL changes, if any, will not be applied.To apply the SQL changes, bring up the database instance and run the command manually from any one node (run as oracle).Refer to the readme to get the correct steps for applying the sql changes.
之后手动执行datapatch,是否对数据库有影响?即opatchauto apply过程中除了自动调用datapatch外,还在数据库中执行其他脚本了吗?
【问题分析】
- 手动执行dataptach后,通过dba_registry_sqlpatch显示sql补丁已经应用;
- 从opatchauto apply的日志判断,并没有发现要单独给DB执行什么SQL变更脚本,却因为DB没打开而导致执行失败的记录;
- 通过MOS文档:Opatchauto Apply on SIHA (Oracle Restart) Fails To Run Datapatch With Warning "The database instance ... is not running" (Doc ID 2926737.1)可以看出:
结合MOS文档Datapatch: Database 12c or later Post Patch SQL Automation (Doc ID 1585822.1)判断,opatchauto apply 会自动调用datapatch去应用SQL变化。
【结论】
-
如果opatchauto前DB是关闭的,则手动执行datapatch 应用SQL变化即可;
-
opatchauto 在打完RU补丁后,仅自动调用了datapatch,并没有其他SQL要应用到DB中。
【知识扩展】
opatchauto是从12C开始引入的简化打补丁的操作,本质是一些打补丁命令的集合。
opatchauto引入了很多检查命令,如SSH等效性检查,很有可能由于一些环境不具备打补丁的环境,导致opatchauto命令报错,但是这些检查对升级本身并没有影响。
opatchauto命令本质是将几个打补丁的操作合并在一起,所以我们也可以手动使用optach打每个补丁。
opatchauto在打补丁后会自动调用datapatch更新数据字典。opatchauto更新软件相关二进制文件,datapatch用于更新数据字典(dba_registry_sqlpatch)。
如果通过dba_registry_sqlpatch看到有些补丁更新状态不是success,则可以再次执行datapatch(datapatch是可以执行多次的)。