I recently applied system patch 20132450 to my 12.1.0.2.0 installation on a 2 node RAC system on Oracle Linux 7.1. While ensuring that OPatch is the latest version available I came across an interesting command line option in opatchauto. It is called “-generateSteps”.
[oracle@rac12sby1 ~]$ $ORACLE_HOME/OPatch/opatchauto apply -help OPatch Automation Tool Copyright (c) 2015, Oracle Corporation. All rights reserved. DESCRIPTION Apply a System Patch to Oracle Home. User specified the patch location or the current directory will be taken as the patch location. opatchauto must run from the GI Home as root user. SYNTAX <GI_HOME>/OPatch/opatchauto apply [-analyze] [-database <database names> ] [-generateSteps] [-invPtrLoc <Path to oraInst.loc> ] [-jre <LOC> ] [-norestart ] [-nonrolling ] [-ocmrf <OCM response file location> ] [-oh <OH_LIST> ] [ <Patch Location> ] OPTIONS -analyze This option runs all the required prerequisite checks to confirm the patchability of the system without actually patching or affecting the system in any way. -database Used to specify the RDBMS home(s) to be patched. Option value is oracle database name separated by comma. -generateSteps Generate the manual steps of apply session. These steps are what 'opatchauto apply' does actually. -invPtrLoc Used to locate the oraInst.loc file when the installation used the -invPtrLoc. This should be the path to the oraInst.loc file. -jre This option uses JRE (java) from the specified location instead of the default location under Oracle Home. -norestart This option tells opatchauto not to restart the Grid Infrastructure stack and database home resources after patching. -nonrolling This option makes the patching session run in 'nonrolling' mode. It is required that the stack on the local node is running while it must be stopped on all the remaining nodes before the patching session starts. -ocmrf This option specifies the absolute path to the OCM response file. It is required if the target Oracle Home doesn't have OCM installed and configured. -oh This option specifies Oracle Home(s) to be patched. This can be a RAC home, a Grid Home or comma separated list of multiple homes. PARAMETERS Patch Location Path to the location for the patch. If the patch location is not specified, then the current directory is taken as the patch location. Example: To patch GI home and all RAC homes: '<GI_HOME>/OPatch/opatchauto apply' To patch multiple homes: '<GI_HOME>/OPatch/opatchauto apply -oh <GI_HOME>,<RAC_HOME1>,<RAC_HOME2>' To patch databases running from RAC homes only: '<RAC_HOME>/OPatch/opatchauto apply -database db1,db2...dbn' To patch software-only installation: '<RAC_HOME>/OPatch/opatchauto apply -oh <RAC_HOME>' OR '<GI_HOME>/OPatch/opatchauto apply -oh <GI_HOME>' opatchauto succeeded. [oracle@rac12sby1 ~]$
So this could be quite interesting so I wanted to see what it does with the system patch. I don’t have a database installed in my cluster yet, it’s going to be the standby site for another cluster (rac12pri). Unfortunately opatchauto still skips RDBMS homes without a database in it in my tests so I end up using the “-oh” flag in this case. Here’s the result, formatted for better readability. In reality all calls to opatchauto are in a single line:
[root@rac12sby1 ~]# opatchauto apply /u01/patches/20132450 \ -oh /u01/app/12.1.0.2/grid -generateSteps -ocmrf /u01/patches/ocm.rsp OPatch Automation Tool Copyright (c) 2015, Oracle Corporation. All rights reserved. OPatchauto version : 12.1.0.1.5 OUI version : 12.1.0.2.0 Running from : /u01/app/12.1.0.2/grid Invoking opatchauto utility "generateapplysteps" To apply the patch, Please do the following manual actions: Step 1 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 1.1 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch version -oh /u01/app/12.1.0.2/grid -invPtrLoc \ /u01/app/12.1.0.2/grid/oraInst.loc -v2c 12.1.0.1.5 Step 2 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 2.1 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch lsinventory -invPtrLoc \ /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid Step 3 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 3.1 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckComponents \ -ph /u01/patches/20132450/19769473 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 3.2 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckComponents \ -ph /u01/patches/20132450/19769479 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 3.3 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckComponents \ -ph /u01/patches/20132450/19769480 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 3.4 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckComponents \ -ph /u01/patches/20132450/19872484 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Step 4 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 4.1 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckConflictAgainstOH \ -ph /u01/patches/20132450/19769473 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 4.2 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckConflictAgainstOH \ -ph /u01/patches/20132450/19769479 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 4.3 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckConflictAgainstOH \ -ph /u01/patches/20132450/19769480 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Action 4.4 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch prereq CheckConflictAgainstOH \ -ph /u01/patches/20132450/19872484 -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc \ -oh /u01/app/12.1.0.2/grid Step 5 As the "root" user on the host "rac12sby1", please run the following commands: Action 5.1 [root@rac12sby1]# /u01/app/12.1.0.2/grid/perl/bin/perl -I/u01/app/12.1.0.2/grid/perl/lib \ -I/u01/app/12.1.0.2/grid/crs/install /u01/app/12.1.0.2/grid/crs/install/rootcrs.pl -prepatch Step 6 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 6.1 [oracle@rac12sby1]$ echo /u01/patches/20132450/19769473 > /tmp/OraGI12Home1_patchList Action 6.2 [oracle@rac12sby1]$ echo /u01/patches/20132450/19769479 >> /tmp/OraGI12Home1_patchList Action 6.3 [oracle@rac12sby1]$ echo /u01/patches/20132450/19769480 >> /tmp/OraGI12Home1_patchList Action 6.4 [oracle@rac12sby1]$ echo /u01/patches/20132450/19872484 >> /tmp/OraGI12Home1_patchList Action 6.5 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch napply -phBaseFile /tmp/OraGI12Home1_patchList \ -local -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid -silent Step 7 As the "root" user on the host "rac12sby1", please run the following commands: Action 7.1 [root@rac12sby1]# /u01/app/12.1.0.2/grid/rdbms/install/rootadd_rdbms.sh Step 8 As the "root" user on the host "rac12sby1", please run the following commands: Action 8.1 [root@rac12sby1]# /u01/app/12.1.0.2/grid/perl/bin/perl -I/u01/app/12.1.0.2/grid/perl/lib \ -I/u01/app/12.1.0.2/grid/crs/install /u01/app/12.1.0.2/grid/crs/install/rootcrs.pl -postpatch Step 9 As the "oracle" user on the host "rac12sby1", please run the following commands: Action 9.1 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch lsinventory \ -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid | grep 19769473 Action 9.2 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch lsinventory \ -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid | grep 19769479 Action 9.3 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch lsinventory \ -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid | grep 19769480 Action 9.4 [oracle@rac12sby1]$ /u01/app/12.1.0.2/grid/OPatch/opatch lsinventory \ -invPtrLoc /u01/app/12.1.0.2/grid/oraInst.loc -oh /u01/app/12.1.0.2/grid | grep 19872484
You could of course use oplan which is bundled in $ORACLE_HOME/OPatch/oplan/oplan to generate a lot more detailed profile for the patch application. For a first glance at the activity opatchauto -generateSteps seems quite useful.
The steps all rang a bell from my 11.2.0.1 days when this was the procedure to patch Grid Infrastructure (thank god that’s over). What I didn’t recognise was rootadd_rdbms.sh. Looking at the file I can see it is changing ownership and permissions for oradism (important!) and some other executables in $ORACLE_HOME and fixes potential problems with “fs.file-max*” in /etc/sysctl.conf.