In this article, we are going to demonstrate the steps to apply the Oracle April 2026 Critical Patch Update (CPU) on a Single Instance Oracle 19c Container Database (CDB). Here we will apply combo patch 39062931 which contains 39034528 (Database Apr 2026 Release Update 19.31.0.0.260421) and 38906621 (OJVM Component Release Update 19.31.0.0.260421). We also cover an important real-world scenario where a previously applied overlay patch 34672698 (ORA-00800 fix) conflicted with the Apr 2026 RU — confirming that the fix is now natively included in the RU itself.
Follow the high-level plan to apply patch 39062931 (19.31.0.0.260421).
- Go through the README documents of patch IDs before proceeding with patch apply.
- Download the required patches from My Oracle Support.
- Upgrade OPatch utility to the latest version as required by the patch README.
- Perform pre-checks at CDB and PDB level — invalid objects, patch history, registry components.
- Take Oracle Home TAR backup.
- Blackout in OEM and disable crontab jobs before maintenance.
- Shutdown database and listener.
- Apply DB Release Update (39034528).
- Apply OJVM Release Update (38906621).
- Validate overlay patch (34672698) — check if still required post RU upgrade.
- Start database and listener.
- Execute datapatch on the database and validate.
- Uncomment crontab and remove OEM blackout.
- Perform post-checks and compare with pre-check data.
Environment Details:
| COMPONENTS | DETAILS |
|---|---|
| Oracle Home | /u01/app/oracle/product/19c/db_1 |
| DB Version | 19.30.0.0.0 (Jan 2026 RU) |
| OPatch Version (Before) | 12.2.0.1.49 |
| OPatch Version (After) | 12.2.0.1.51 |
| DB Type | Single Instance, Multitenant (CDB+PDB) |
| CDB Name | DEVCDB |
| PDBs | DEVPDB1, DEVPDB2 |
| OS | Linux x86-64 |
| Combo Patch | 39062931 (19.31.0.0.260421) |
| DB RU Patch | 39034528 |
| OJVM Patch | 38906621 |
| Overlay Patch | 34672698 (validated — not reapplied) |
1. Pre-Checks
1.1: Capture invalid objects at CDB level.
sqlplus / as sysdba
Set lines 230
set pages 100
col OBJECT_NAME for a40
col OBJECT_TYPE for a40
col OWNER for a20
select OBJECT_NAME, OBJECT_TYPE, OWNER,
to_char(LAST_DDL_TIME,'DD-MON-YYYY HH24:MI:SS'), status
from dba_objects
where status='INVALID'
order by owner;
no rows selected
1.2: Capture patch history from dba_registry_sqlpatch.
select patch_id, action, status, action_time, description
from dba_registry_sqlpatch;
| PATCH_ID | ACTION | STATUS | ACTION_TIME | DESCRIPTION |
|---|---|---|---|---|
| 38523609 | APPLY | SUCCESS | 03-FEB-26 | OJVM RELEASE UPDATE: 19.30.0.0.260120 |
| 38632161 | APPLY | SUCCESS | 03-FEB-26 | Database Release Update: 19.30.0.0.260120 |
44 rows selected.
1.3: Capture DB registry components.
SELECT COMP_ID, comp_name, version, status FROM dba_registry;
| COMP_ID | COMP_NAME | VERSION | STATUS |
|---|---|---|---|
| CATALOG | Oracle Database Catalog Views | 19.30.0.0.0 | VALID |
| CATPROC | Oracle Database Packages and Types | 19.30.0.0.0 | VALID |
| JAVAVM | JServer JAVA Virtual Machine | 19.30.0.0.0 | VALID |
| XML | Oracle XDK | 19.30.0.0.0 | VALID |
| XDB | Oracle XML Database | 19.30.0.0.0 | VALID |
| ORDIM | Oracle Multimedia | 19.30.0.0.0 | VALID |
| CONTEXT | Oracle Text | 19.30.0.0.0 | VALID |
| … 15 rows total. All components VALID. | |||
1.4: Connect to each PDB and capture invalid objects as baseline.
alter session set container=DEVPDB1;
select OBJECT_NAME, OBJECT_TYPE, OWNER, status
from dba_objects where status='INVALID'
order by owner;
1.5: Capture current patch inventory from OS.
[oracle@dbhost ~]$ opatch lspatches
| PATCH_ID | DESCRIPTION |
|---|---|
| 34672698 | ORA-00800 SOFT EXTERNAL ERROR, ARGUMENTS [SET PRIORITY FAILED], [VKTM], DISM(16) |
| 38523609 | OJVM RELEASE UPDATE: 19.30.0.0.260120 (38523609) |
| 38632161 | Database Release Update: 19.30.0.0.260120 (38632161) |
| 29585399 | OCW RELEASE UPDATE 19.3.0.0.0 (29585399) |
OPatch succeeded.
2. Download Patches
2.1: Create a dedicated directory for April 2026 patches.
mkdir -p /u01/app/oracle/patches/APR_2026
cd /u01/app/oracle/patches/APR_2026
2.2: Download OPatch (patch 6880880).
oui/lib/linux directory errors during patch apply.
wget --user=<MOS_EMAIL> --password='<MOS_PASSWORD>' --no-check-certificate -c \
"<DOWNLOAD_URL_FROM_MOS>" -O p6880880_190000_Linux-x86-64.zip
2.3: Download Combo Patch and Overlay Patch.
wget --user=<MOS_EMAIL> --password='<MOS_PASSWORD>' --no-check-certificate -c \
"<DOWNLOAD_URL_FROM_MOS>" -O p39062931_190000_Linux-x86-64.zip
wget --user=<MOS_EMAIL> --password='<MOS_PASSWORD>' --no-check-certificate -c \
"<DOWNLOAD_URL_FROM_MOS>" -O p34672698_1930000DBRU_Linux-x86-64.zip
2.4: Unzip patches and verify structure.
unzip p39062931_190000_Linux-x86-64.zip
unzip p34672698_1930000DBRU_Linux-x86-64.zip
ls -l 39062931/
drwxr-x---. 4 oracle oinstall 6144 38906621 -- OJVM RU
drwxr-x---. 4 oracle oinstall 6144 39034528 -- DB RU
-rw-r--r--. 1 oracle oinstall 118 README.html
3. Upgrade OPatch
3.1: Check current OPatch version.
[oracle@dbhost ~]$ $ORACLE_HOME/OPatch/opatch version
OPatch Version: 12.2.0.1.49
OPatch succeeded.
The April 2026 RU requires OPatch 12.2.0.1.51 or higher. We need to upgrade.
3.2: Backup and replace OPatch.
mv $ORACLE_HOME/OPatch $ORACLE_HOME/OPatch_old_12.2.0.1.49
unzip p6880880_190000_Linux-x86-64.zip -d $ORACLE_HOME
3.3: Verify new OPatch version.
[oracle@dbhost ~]$ $ORACLE_HOME/OPatch/opatch version
OPatch Version: 12.2.0.1.51
OPatch succeeded.
Invalid maximum heap size: -Xmx5120m, set the following before retrying:
export OPATCH_JRE_MEMORY_OPTIONS="-Xmx1024m"
Add this to ~/.bash_profile to make it permanent.
4. Pre-Patching Activities
4.1: Comment out crontab entries to prevent jobs from running during maintenance.
[oracle@dbhost ~]$ (/usr/bin/crontab -l | /bin/sed 's/^/##APR_2026##&/g' | /usr/bin/crontab)
4.2: Place OEM blackout if OEM is configured for this target.
5. Shutdown Database and Listener
5.1: Shutdown the database and listener, and take an Oracle Home TAR backup.
sqlplus / as sysdba
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit;
lsnrctl stop LISTENER
# Oracle Home TAR backup (run in background)
nohup tar -zcvf /u01/app/oracle/patches/oracle_home_APR2026.tar.gz $ORACLE_HOME &
6. Apply DB Release Update (39034528)
6.1: Set PATH and run the prerequisite conflict check.
export PATH=$ORACLE_HOME/OPatch:$PATH
cd /u01/app/oracle/patches/APR_2026/39062931/39034528
opatch prereq CheckConflictAgainstOHWithDetail -ph ./
ZOP-47: Superset Patch 39034528 has Subset Patch 38632161 which has overlay patches
[34672698] and these overlay patches conflict with Superset Patch.
OPatch failed with error code 73
6.2: Rollback overlay patch 34672698.
opatch rollback -id 34672698
Patch 34672698 successfully rolled back.
OPatch succeeded.
6.3: Re-run prereq check after rollback.
opatch prereq CheckConflictAgainstOHWithDetail -ph ./
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
6.4: Apply the DB Release Update.
opatch apply
Patch 39034528 successfully applied.
Sub-set patch [38632161] has become inactive due to the application of a super-set patch [39034528].
OPatch succeeded.
6.5: Verify the patch is applied.
opatch lsinventory | grep 39034528
39034528 Database Release Update : 19.31.0.0.260421
7. Apply OJVM Release Update (38906621)
7.1: Run prereq check and apply the OJVM patch.
export PATH=$ORACLE_HOME/OPatch:$PATH
cd /u01/app/oracle/patches/APR_2026/39062931/38906621
opatch prereq CheckConflictAgainstOHWithDetail -ph ./
Prereq "checkConflictAgainstOHWithDetail" passed.
OPatch succeeded.
opatch apply
Patch 38906621 successfully applied.
Sub-set patch [38523609] has become inactive due to the application of a super-set patch [38906621].
OPatch succeeded.
7.2: Verify both patches are listed.
[oracle@dbhost ~]$ opatch lspatches
| PATCH_ID | DESCRIPTION |
|---|---|
| 39034528 | Database Release Update: 19.31.0.0.260421 (39034528) |
| 38906621 | OJVM RELEASE UPDATE: 19.31.0.0.260421 (38906621) |
| 29585399 | OCW RELEASE UPDATE 19.3.0.0.0 (29585399) |
OPatch succeeded.
8. Overlay Patch (34672698) — Conflict with Apr 2026 RU
The overlay patch 34672698 was previously applied on top of the Jan 2026 RU to fix ORA-00800: SOFT EXTERNAL ERROR, ARGUMENTS: [SET PRIORITY FAILED], [VKTM], DISM(16). It was rolled back in Step 6. Before reapplying, always run the prereq check.
oradism ownership change to oracle before applying the overlay patch. Always check the current permissions first:
ls -l $ORACLE_HOME/bin/oradism
If oradism is already oracle-owned (e.g., -rwxr-x---. 1 oracle oinstall), no root permission change is required. Only apply the chown/chmod steps if oradism is root-owned with setuid bit.
8.1: Run prereq check before reapplying the overlay patch.
cd /u01/app/oracle/patches/APR_2026/34672698
opatch prereq CheckConflictAgainstOHWithDetail -ph ./
ZOP-40: The patch(es) has conflicts with other patches installed in the Oracle Home.
Following patches have conflicts: 34672698, 39034528
OPatch failed with error code 73
8.2: Verify the overlay patch is absent from inventory.
opatch lsinventory | grep 34672698
[oracle@dbhost 34672698]$
9. Start Database and Run Datapatch
9.1: Start the database and open all PDBs.
sqlplus / as sysdba
SQL> startup;
ORACLE instance started.
Database mounted.
Database opened.
SQL> alter pluggable database all open;
Pluggable database altered.
SQL> exit;
lsnrctl start LISTENER
9.2: Run datapatch to apply the SQL portion of the patches.
cd $ORACLE_HOME/OPatch
./datapatch -verbose
SQL Patching tool version 19.31.0.0.0 Production on Tue May 5 13:17:39 2026
Installation queue:
For CDB$ROOT PDB$SEED DEVPDB1 DEVPDB2:
Rollback: 38523609 (OJVM 19.30)
Apply: 39034528 (DB RU 19.31)
Apply: 38906621 (OJVM 19.31)
Patch 38523609 rollback (CDB$ROOT): SUCCESS
Patch 39034528 apply (CDB$ROOT): SUCCESS
Patch 38906621 apply (CDB$ROOT): SUCCESS
Patch 38523609 rollback (DEVPDB1): SUCCESS
Patch 39034528 apply (DEVPDB1): SUCCESS
Patch 38906621 apply (DEVPDB1): SUCCESS
Patch 38523609 rollback (DEVPDB2): SUCCESS
Patch 39034528 apply (DEVPDB2): SUCCESS
Patch 38906621 apply (DEVPDB2): SUCCESS
SQL Patching tool complete on Tue May 5 13:24:18 2026
10. Post-Patching Activities
10.1: Uncomment crontab entries.
[oracle@dbhost ~]$ (/usr/bin/crontab -l | /bin/sed 's/##APR_2026##//g' | /usr/bin/crontab)
10.2: Remove OEM blackout if applicable.
11. Post-Checks
11.1: Verify patch registry — all entries should show SUCCESS.
select patch_id, action, status, action_time, description
from dba_registry_sqlpatch
order by action_time;
| PATCH_ID | ACTION | STATUS | ACTION_TIME | DESCRIPTION |
|---|---|---|---|---|
| 38523609 | ROLLBACK | SUCCESS | 05-MAY-26 01:20:47 | OJVM RELEASE UPDATE: 19.30.0.0.260120 |
| 38906621 | APPLY | SUCCESS | 05-MAY-26 01:21:02 | OJVM RELEASE UPDATE: 19.31.0.0.260421 |
| 39034528 | APPLY | SUCCESS | 05-MAY-26 01:21:56 | Database Release Update: 19.31.0.0.260421 |
11.2: Verify all DB registry components are VALID.
SELECT COMP_ID, comp_name, version, status FROM dba_registry;
| COMP_ID | COMP_NAME | VERSION | STATUS |
|---|---|---|---|
| CATALOG | Oracle Database Catalog Views | 19.31.0.0.0 | VALID |
| CATPROC | Oracle Database Packages and Types | 19.31.0.0.0 | VALID |
| JAVAVM | JServer JAVA Virtual Machine | 19.31.0.0.0 | VALID |
| XML | Oracle XDK | 19.31.0.0.0 | VALID |
| XDB | Oracle XML Database | 19.31.0.0.0 | VALID |
| ORDIM | Oracle Multimedia | 19.31.0.0.0 | VALID |
| CONTEXT | Oracle Text | 19.31.0.0.0 | VALID |
| … 15 rows total. All components VALID. | |||
11.3: Confirm final patch inventory.
[oracle@dbhost ~]$ opatch lspatches
| PATCH_ID | DESCRIPTION |
|---|---|
| 39034528 | Database Release Update: 19.31.0.0.260421 (39034528) |
| 38906621 | OJVM RELEASE UPDATE: 19.31.0.0.260421 (38906621) |
| 29585399 | OCW RELEASE UPDATE 19.3.0.0.0 (29585399) |
OPatch succeeded.
11.4: Compare invalid objects at CDB and PDB level with pre-patch baseline. Compile any new invalid objects introduced by the patch:
@$ORACLE_HOME/rdbms/admin/utlrp.sql
Key MOS References
| Document | Description |
|---|---|
| KB869205 | Oracle Database 19c Apr 2026 RU Known Issues |
| KB137197 | OJVM Conditional Rolling Install Details |
| 244241.1 | OPatch Support for RAC Rolling Patches |
| 293369.1 | OPatch Documentation List |
Disclaimer: All server names, hostnames, database names, and environment-specific paths in this post have been anonymized. Steps and outputs are based on real production experience adapted for general use. Always test in a non-production environment before applying patches to production systems.
If you found this useful, connect with me on LinkedIn or explore more Oracle DBA scripts on my GitHub. More patching walkthroughs at syedanwarahmedoracle.blog.
💬 Share Your Experience
Have you applied Oracle 19c CPU patches and hit a similar overlay patch conflict? Or found that a fix you applied months ago is now natively bundled into the next RU? Your real-world experiences help fellow DBAs tackle the same challenges. Drop a comment below — questions, observations, and feedback are always welcome.