This guide shows a way, how a Gold Image can be created from an Oracle Home on Windows and how that can be used to patch other Oracle Homes. This worked for me, but is not meant to be the only, best or officially recommended Oracle way.
Prepare the image source home
Say we have an unpatched 19.3 installed in c:\oracle\product\19.0.0\dbhome_1 with a database ORCL (non-PDB), installed with the option to use a Virtual Account, which is the default from the Oracle installer.
So the owner for the Oracle software home and datafiles has been created as ORA_OraDB19Home1_SVCACCTS by the installer.There is no standard oraenv.sh under Windows. As some tasks have to be done from the old and some from the new home, it helps to create two different oraenv scripts, eg. old-oraenv.cmd and new-oraenv.cmd , like in my environment:
old-oraenv.cmd
set ORACLE_BASE=C:\Oracle
set ORACLE_HOME=%ORACLE_BASE%\Product\19.0.0\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH% set PATH=%ORACLE_HOME%\perl\bin;%PATH% set PATH=%ORACLE_HOME%\OPatch\;%PATH% set PATH=%ORACLE_HOME%\jdk\bin\;%PATH%
new-oraenv.cmd
set ORACLE_BASE=C:\Oracle set OLDORA_HOME=%ORACLE_BASE%\Product\19.0.0\dbhome_1 set ORACLE_HOME=%ORACLE_BASE%\Product\19.21\dbhome_3 set PATH=%ORACLE_HOME%\bin;%PATH% set PATH=%ORACLE_HOME%\perl\bin;%PATH% set PATH=%ORACLE_HOME%\OPatch\;%PATH% set PATH=%ORACLE_HOME%\jdk\bin\;%PATH%
Run your oraenv.cmd, unpack the software (you can use tar xfz under Windows for unzip) and run setup.bat, see the Database Installation Guide 19c for Microsoft Windows.
C:\app>oraenv.cmd
C:\app>mkdir %ORACLE_HOME% C:\app>cd %ORACLE_HOME% C:\app\oracle\product\19.0.0\dbhome_2>tar xfz z:\Install\Windows\WINDOWS.X64_193000_db_home.zip C:\app\oracle\product\19.0.0\dbhome_2>setup.bat
We only need to setup the software only and this is a single instance installation. Under Linux, we would just apply the RU and one-offs from the setup, but the options '-applyRU 'and '-applyOneOffs' are not available under Windows (see the comments on https://mikedietrichde.com/2022/05/17/simple-database-installation-with-applyru-and-applyoneoffs/, search for Windows).
Update opatch by following Doc ID 274526.1 from Oracle Support, in this case using opatch 12.2.0.1.41.
For the Gold Image, we will patch the 19.3 dbhome_2 up to 19.21 plus two one-off patches for the JVM. So download and unpack the patches to a given directory, in this example c:\app\oracle\patches. The patch numbers are 35638318, 35648110 and 35681552, these have to be applied manually by running opatch apply in every patch directory, starting with 35681552 which is the Bundle Patch 19.21.
Now the dbhome_2 is on 19.21 with two additional one-off patches and will serve as source for our Gold Image.
Create the Gold Image
Next, from the patched Oracle Home, we create a Gold Image following the documentation.
setup.exe -createGoldImage -destinationLocation c:\oracle\images
Wait for the installer to finish, then you should have the newly created image in the directory stated by -destinationLocation. The dbhome_2 can be deleted with Oracle's deinstall program.
Out-of-place patching using the Gold Image
We now have an unpatched Oracle 19.3 home in dbhome_1 with the database ORCL and a gold image with version version 19.21 and two one-off patches.
For out-of-place patching, we need to create a new Oracle Home, where we unpack the Gold Image.
C:\app>new-oraenv.cmd C:\app>mkdir %ORACLE_HOME% C:\app>cd %ORACLE_HOME% C:\app\oracle\product\19.21\dbhome_3>tar xfz c:\app\oracle\images\db_home_2024-02-21_05-21-14PM.zip C:\app\oracle\product\19.21\dbhome_3>setup
rem --- Copy spfile and pwdfile to new ORACLE_HOME copy %OLDORA_HOME%\database\SPFILEORCL.ORA %ORACLE_HOME%\database copy %OLDORA_HOME%\database\PWDorcl.ora %ORACLE_HOME%\database
set OLDORA_HOME=%ORACLE_BASE%\product\19.0.0\dbhome_1
rem --- use oradim to delete Oracle services ---oradim -DELETE -SID orcl
rem --- stop remaining Oracle services ---
sc stop OracleOraDB19Home1MTSRecoveryService sc config OracleOraDB19Home1MTSRecoveryService start= disabled
sc stop OracleOraDB19Home1TNSListener
sc config OracleOraDB19Home1TNSListener start=disabled
rem --- create new services for new Oracle home
oradim -NEW -SID orcl -STARTMODE auto -SRVCSTART system -SPFILE -PFILE %ORACLE_HOME%\database\SPFILEORCL.ORA
rem --- recreate remaining services %ORACLE_HOME%\bin\oramtsctl -new %ORACLE_HOME%\bin\lsnrctl start sc config "OracleOraDB19Home3TNSListener" start= auto
rem --- start the database and run datapatch rem --- not needed with service auto start --- @echo startup | sqlplus / as sysdba rem --- @echo alter pluggable database all open | sqlplus / as sysdba rem --- @echo show pdbs | sqlplus / as sysdba
@echo @?/rdbms/admin/utlrp.sql | sqlplus / as sysdba %ORACLE_HOME%\OPatch\datapatch
rem --- apply optimizer fixes for every PDB @echo @?/rdbms/admin/dbmsoptim.sql | sqlplus / as sysdba @echo @?/rdbms/admin/prvtoptim.plb | sqlplus / as sysdba @echo execute dbms_optim_bundle.enable_optim_fixes('ON','BOTH', 'YES'); | sqlplus / as sysdba