8i | 9i | 10g | 11g | 12c | 13c | 18c | 19c | 21c | 23c | Misc | PL/SQL | SQL | RAC | WebLogic | Linux
Patching : Apply a Database Release Update (RU) to a New ORACLE_HOME
This article gives an example of applying a database Release Update (RU) to a new ORACLE_HOME
for a simple single-instance Oracle database.
You should always check the patch notes before doing any patching. It's always possible some changes have been introduced that make the process differ from that presented here.
- Assumptions
- Environment
- Create the New ORACLE_HOME
- Patch the Database
- Clean Up
- Check the Patch History
- Rollback the Patch
- Pros and Cons
Related articles.
Assumptions
This article makes some assumptions.
- We have an existing Oracle 19c or 21c database.
- We have a backup of the database in case anything goes wrong.
- We have the base release of the Oracle database software to create the new
ORACLE_HOME
. - We've downloaded the relevant OPatch and patch files for this quarter, as listed here.
Environment
Set up the environment. This includes the database software, OPatch and patch file names, and the paths.
export ORA_INVENTORY=/u01/app/oraInventory export ORACLE_BASE=/u01/app/oracle export SOFTWARE_DIR=/u01/software # 19c export OLD_ORACLE_HOME=${ORACLE_BASE}/product/19.0.0/dbhome_1 export NEW_ORACLE_HOME=${ORACLE_BASE}/product/19.16.0/dbhome_1 export DB_SOFTWARE="LINUX.X64_193000_db_home.zip" export OPATCH_FILE="p6880880_190000_Linux-x86-64.zip" export PATCH_FILE="p34133642_190000_Linux-x86-64.zip" export PATCH_TOP=${SOFTWARE_DIR}/34133642 # 21c export OLD_ORACLE_HOME=${ORACLE_BASE}/product/21.0.0/dbhome_1 export NEW_ORACLE_HOME=${ORACLE_BASE}/product/21.7.0/dbhome_1 export DB_SOFTWARE="LINUX.X64_213000_db_home.zip" export OPATCH_FILE="p6880880_210000_Linux-x86-64.zip" export PATCH_FILE="p34160444_210000_Linux-x86-64.zip" export PATCH_TOP=${SOFTWARE_DIR}/34160444
Create the New ORACLE_HOME
We create a new ORACLE_HOME
by doing a software-only install. Create the new ORACLE_HOME
and unzip the base software into it.
mkdir -p ${NEW_ORACLE_HOME} cd ${NEW_ORACLE_HOME} unzip -oq ${SOFTWARE_DIR}/${DB_SOFTWARE}
Update OPatch in the new home.
cd ${NEW_ORACLE_HOME} rm -Rf OPatch unzip -oq ${SOFTWARE_DIR}/${OPATCH_FILE}
Unzip the release update.
cd ${SOFTWARE_DIR} unzip -oq ${PATCH_FILE}
Install the Oracle software in the new home, applying the RU as part of the installation process. Notice we are referencing the NEW_ORACLE_HOME
location in the runInstaller
command, and we unset the ORACLE_HOME
variable, just to be on the safe side.
unset ORACLE_HOME cd ${NEW_ORACLE_HOME} ${NEW_ORACLE_HOME}/runInstaller -ignorePrereq -waitforcompletion -silent \ -applyRU ${PATCH_TOP} \ -responseFile ${NEW_ORACLE_HOME}/install/response/db_install.rsp \ oracle.install.option=INSTALL_DB_SWONLY \ ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \ UNIX_GROUP_NAME=oinstall \ INVENTORY_LOCATION=${ORA_INVENTORY} \ SELECTED_LANGUAGES=en,en_GB \ ORACLE_HOME=${NEW_ORACLE_HOME} \ ORACLE_BASE=${ORACLE_BASE} \ oracle.install.db.InstallEdition=EE \ oracle.install.db.OSDBA_GROUP=dba \ oracle.install.db.OSBACKUPDBA_GROUP=dba \ oracle.install.db.OSDGDBA_GROUP=dba \ oracle.install.db.OSKMDBA_GROUP=dba \ oracle.install.db.OSRACDBA_GROUP=dba \ SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \ DECLINE_SECURITY_UPDATES=true
Run the root scripts as instructed.
# 19c As a root user, execute the following script(s): 1. /u01/app/oracle/product/19.16.0/dbhome_1/root.sh # 21c As a root user, execute the following script(s): 1. /u01/app/oracle/product/21.7.0/dbhome_1/root.sh
We now have the newly patched home, so we are ready to patch the database.
Patch the Database
To patch the database we need to switch it to the new ORACLE_HOME
and run the datapatch utility in the normal way.
Turn off all the services in the current ORACLE_HOME
.
export ORACLE_SID=cdb1 export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES dbshut ${ORACLE_HOME}
Edit the "/etc/oratab" file, setting the new home for the instance.
# 19c #cdb1:/u01/app/oracle/product/19.0.0/dbhome_1:Y cdb1:/u01/app/oracle/product/19.16.0/dbhome_1:Y # 21c #cdb1:/u01/app/oracle/product/21.0.0/dbhome_1:Y cdb1:/u01/app/oracle/product/21.7.0/dbhome_1:Y
In previous releases we would need to copy the following files between the homes, but in 21c onward this is not necessary, as we are using read-only homes, so all the configuration files are no longer stored in the same place as the binaries.
- "ORACLE_HOME/dbs" : Copy password file, SPFILE and the instance init{ORACLE_SID}.ora file if it is present.
- "ORACLE_HOME/network/admin" : Copy the network config files. Amend any paths referenced in the files.
# 19c cp ${OLD_ORACLE_HOME}/dbs/*${ORACLE_SID}* ${NEW_ORACLE_HOME}/dbs/ cp ${OLD_ORACLE_HOME}/dbs/*${ORACLE_SID^^}* ${NEW_ORACLE_HOME}/dbs/ cp ${OLD_ORACLE_HOME}/network/admin/*.ora ${NEW_ORACLE_HOME}/network/admin/ sed -i -e "s|${OLD_ORACLE_HOME}|${NEW_ORACLE_HOME}|g" ${NEW_ORACLE_HOME}/network/admin/*.ora
Make sure we are using the new ORACLE_HOME
.
export ORACLE_SID=cdb1 export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES echo ${ORACLE_HOME} /u01/app/oracle/product/21.7.0/dbhome_1 $
Start the listener.
lsnrctl start
Start the database, making sure all pluggable databases are open.
sqlplus / as sysdba <<EOF startup; alter pluggable database all open; exit; EOF
Run datapatch.
cd $ORACLE_HOME/OPatch ./datapatch -verbose
Recompile any invalid objects.
$ORACLE_HOME/perl/bin/perl \ -I$ORACLE_HOME/perl/lib \ -I$ORACLE_HOME/rdbms/admin \ $ORACLE_HOME/rdbms/admin/catcon.pl \ -l /tmp/ \ -b postpatch_${ORACLE_SID}_recompile \ -C 'PDB$SEED' \ $ORACLE_HOME/rdbms/admin/utlrp.sql
Clean Up
If we have any additional environment files or scripts containing paths that include the ORACLE_HOME
, they will need to be adjusted.
Clean up the patch software.
cd ${SOFTWARE_DIR} rm -Rf ${DB_SOFTWARE} rm -Rf ${PATCH_TOP} rm -Rf ${OPATCH_FILE} rm -Rf ${PATCH_FILE} rm -Rf PatchSearch.xml
At some point we will need to remove the old ORACLE_HOME
.
Check the Patch History
We can check the patch history by running the following command.
${ORACLE_HOME}/OPatch/opatch lsinventory
Rollback the Patch
To rollback the patch we need to switch it to the old ORACLE_HOME
and run the datapatch utility in the normal way.
Shutdown the services run from the ORACLE_HOME
.
dbshut ${ORACLE_HOME}
Edit the "/etc/oratab" file, setting the original home for the instance.
# 19c cdb1:/u01/app/oracle/product/19.0.0/dbhome_1:Y #cdb1:/u01/app/oracle/product/19.16.0/dbhome_1:Y # 21c cdb1:/u01/app/oracle/product/21.0.0/dbhome_1:Y #cdb1:/u01/app/oracle/product/21.7.0/dbhome_1:Y
Make sure we are using the original ORACLE_HOME
.
export ORACLE_SID=cdb1 export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES echo ${ORACLE_HOME} /u01/app/oracle/product/21.0.0/dbhome_1 $
Start the listener.
lsnrctl start
Start the database, making sure all pluggable databases are open.
sqlplus / as sysdba <<EOF startup; alter pluggable database all open; exit; EOF
Run datapatch.
cd $ORACLE_HOME/OPatch ./datapatch -verbose
Recompile any invalid objects.
$ORACLE_HOME/perl/bin/perl \ -I$ORACLE_HOME/perl/lib \ -I$ORACLE_HOME/rdbms/admin \ $ORACLE_HOME/rdbms/admin/catcon.pl \ -l /tmp/ \ -b postpatch_${ORACLE_SID}_recompile \ -C 'PDB$SEED' \ $ORACLE_HOME/rdbms/admin/utlrp.sql
Pros and Cons
Pros:
- Patching to a new
ORACLE_HOME
is quicker, because the patches to the binaries are done while the database is still running in the original home. We only need downtime while we switch between homes, and run the datapatch utility. - We have the original
ORACLE_HOME
, should we need to switch back. - If we have multiple instances sharing the same
ORACLE_HOME
, we can patch them separately by being selective about which databases we turn off and on.
Cons:
- We need additional disk space for the new
ORACLE_HOME
. - If we are not using a read-only
ORACLE_HOME
, wee need to copy config files between homes during the switch. - If we have any additional environment files or scripts containing paths that include the
ORACLE_HOME
, they will need to be adjusted. - We will need to clean up the old
ORACLE_HOME
at some point.
For more information see:
- Critical Patch Updates, Security Alerts and Bulletins
- Patching : Apply a Release Update (RU) to an Existing ORACLE_HOME
Hope this helps. Regards Tim...