This post is to demonstrate downgrade Oracle Database from 19c (19.3) to 11g (11.2.0.4) manually.
1. Check the Compatibility Matrix to downgrade the database.
2. Disable the Oracle Database Vault.
If Oracle Database Vault is enabled, need to disable the Oracle Database Vault before downgrading. Use CDB_DV_STATUS to check the status of Oracle Database Vault.
SQL> SELECT * FROM V$OPTION WHERE PARAMETER = ‘Oracle Database Vault’;
PARAMETER VALUE CON_ID
———————— ——————– ———-
Oracle Database Vault FALSE 0
If the output is TRUE, then Oracle Database Vault is enabled, so we must disable it.
3. If your database uses Oracle Label Security, and you are downgrading to release 11.2, then run the Oracle Label Security (OLS) preprocess downgrade olspredowngrade.sql script in the new Oracle Database 12c Oracle home.
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = ‘Oracle Label Security’;
VALUE
—————————————————————-
FALSE
If Oracle Label Security enabled, run the olspredowngrade.sql script:
SQL> @ORACLE_HOME/rdbms/admin/olspredowngrade.sql
Caution: Run olspredowngrade.sql before you downgrade from Oracle Database 12c to database release 11.2 for databases that use Oracle Label Security and Oracle Database Vault.
4. If Unified Auditing is enabled, take the backup and purge the unified audit trail.
SQL> SELECT VALUE FROM V$OPTION WHERE PARAMETER = ‘Unified Auditing’;
VALUE
——————–
FALSE
If enabled, perform the below steps.
4.a Get the unified audit records
SQL> SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL;
4.b Get the unified audit records
SQL> SELECT COUNT(*) FROM UNIFIED_AUDIT_TRAIL;
4.c Backup existing data to backup table.
SQL> CREATE TABLE UA_DATA_BKP AS (SELECT * FROM UNIFIED_AUDIT_TRAIL);
4.d Clean up the audit trail.
SQL> EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE);
5. Before downgrade, check the the version of time zone file.
SQL> col version for 999999999999
select * from V$TIMEZONE_FILE;
FILENAME VERSION CON_ID
——————– ————- ———-
timezlrg_32.dat 32 0
This version of time zone file should exist in Oracle 11g home. If not exists, need to apply patch 28125601 (p28125601_112040_Linux-x86-64).
[oracle@prod db_1]$ cd /u01/app/oracle/product/11.0.0/db_1/oracore/zoneinfo/
[oracle@prod zoneinfo]$ ls -lrt timezlrg_32.dat
ls: cannot access timezlrg_32.dat: No such file or directory
export ORACLE_HOME=/u01/app/oracle/product/11.0.0/db_1
export PATH=/u01/app/oracle/product/11.0.0/db_1/bin
===
==Run OPatch Conflict Check
[oracle@prod ~]$ /u01/app/oracle/product/11.0.0/db_1/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /patch/patches/28125601
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-28_10-12-49AM_1.log
Invoking prereq “checkconflictagainstohwithdetail”
Prereq “checkConflictAgainstOHWithDetail” passed.
OPatch succeeded.
—
===Run OPatch System Space Check
[oracle@prod ~]$ /u01/app/oracle/product/11.0.0/db_1/OPatch/opatch prereq CheckSystemSpace -phBaseDir /patch/patches/28125601
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
PREREQ session
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-28_10-13-28AM_1.log
Invoking prereq “checksystemspace”
Prereq “checkSystemSpace” passed.
OPatch succeeded.
—
===Apply the Patch
/u01/app/oracle/product/11.0.0/db_1/OPatch/opatch apply -oh /u01/app/oracle/product/11.0.0/db_1 -local /patch/patches/28125601
[oracle@prod ~]$ /u01/app/oracle/product/11.0.0/db_1/OPatch/opatch apply -oh /u01/app/oracle/product/11.0.0/db_1 -local /patch/patches/28125601
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-28_10-16-14AM_1.log
Verifying environment and performing prerequisite checks…
OPatch continues with these patches: 28125601
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Backing up files…
Applying interim patch ‘28125601’ to OH ‘/u01/app/oracle/product/11.0.0/db_1’
ApplySession: Optional component(s) [ oracle.oracore.rsf.core, 11.2.0.4.0 ] not present in the Oracle Home or a higher version is found.
Patching component oracle.oracore.rsf, 11.2.0.4.0…
Patch 28125601 successfully applied.
Log file location: /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-28_10-16-14AM_1.log
OPatch succeeded.
—
[oracle@prod ~]$ cd /u01/app/oracle/product/11.0.0/db_1/oracore/zoneinfo/
[oracle@prod zoneinfo]$ ls -lrt timezlrg_32.dat
-rw-r–r– 1 oracle oinstall 786909 Jul 19 2018 timezlrg_32.dat
[oracle@prod OPatch]$ cd /u01/app/oracle/product/11.0.0/db_1/OPatch
[oracle@prod OPatch]$ ./opatch lsinventory | grep applied
Patch 28125601 : applied on Sat Jun 28 10:16:25 IST 2025
6. Apply the Patches on 11g home – 20348910 and 20898997
[oracle@prod ~]$ /u01/app/oracle/product/11.0.0/db_1/OPatch/opatch apply -oh /u01/app/oracle/product/11.0.0/db_1 -local /patch/patches/20348910
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-29_13-57-16PM_1.log
Verifying environment and performing prerequisite checks…
OPatch continues with these patches: 20348910
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Backing up files…
Applying interim patch ‘20348910’ to OH ‘/u01/app/oracle/product/11.0.0/db_1’
Patching component oracle.rdbms.dbscripts, 11.2.0.4.0…
Patch 20348910 successfully applied.
Log file location: /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-29_13-57-16PM_1.log
OPatch succeeded.
—–
[oracle@prod ~]$ /u01/app/oracle/product/11.0.0/db_1/OPatch/opatch apply -oh /u01/app/oracle/product/11.0.0/db_1 -local /patch/patches/20898997
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-29_13-57-53PM_1.log
Verifying environment and performing prerequisite checks…
——————————————————————————–
Start OOP by Prereq process.
Launch OOP…
Oracle Interim Patch Installer version 11.2.0.3.50
Copyright (c) 2025, Oracle Corporation. All rights reserved.
Oracle Home : /u01/app/oracle/product/11.0.0/db_1
Central Inventory : /u01/app/oraInventory
from : /u01/app/oracle/product/11.0.0/db_1/oraInst.loc
OPatch version : 11.2.0.3.50
OUI version : 11.2.0.4.0
Log file location : /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-29_13-57-59PM_1.log
Verifying environment and performing prerequisite checks…
OPatch continues with these patches: 20898997
Do you want to proceed? [y|n]
y
User Responded with: Y
All checks passed.
Please shutdown Oracle instances running out of this ORACLE_HOME on the local system.
(Oracle Home = ‘/u01/app/oracle/product/11.0.0/db_1’)
Is the local system ready for patching? [y|n]
y
User Responded with: Y
Backing up files…
Applying interim patch ‘20898997’ to OH ‘/u01/app/oracle/product/11.0.0/db_1’
Patching component oracle.rdbms.rsf, 11.2.0.4.0…
Patching component oracle.rdbms, 11.2.0.4.0…
Patch 20898997 successfully applied.
Log file location: /u01/app/oracle/product/11.0.0/db_1/cfgtoollogs/opatch/opatch2025-06-29_13-57-59PM_1.log
OPatch succeeded.
—
[oracle@prod ~]$ cd /u01/app/oracle/product/11.0.0/db_1/OPatch
[oracle@prod OPatch]$ ./opatch lsinventory | grep applied
Patch 20898997 : applied on Sun Jun 29 13:58:13 IST 2025
Patch 20348910 : applied on Sun Jun 29 13:57:26 IST 2025
Patch 28125601 : applied on Sun Jun 29 12:48:49 IST 2025
7. Before downgrade, check the status of dba_registry components.
set lines 1234 pages 1234
col comp_name for a50
col version for a15
col status for a10
SELECT comp_name, version, status FROM dba_registry;
COMP_NAME VERSION STATUS
————————————————– ————— ———-
Oracle Database Catalog Views 19.0.0.0.0 VALID
Oracle Database Packages and Types 19.0.0.0.0 VALID
JServer JAVA Virtual Machine 19.0.0.0.0 VALID
Oracle XDK 19.0.0.0.0 VALID
Oracle Database Java Packages 19.0.0.0.0 VALID
Oracle Real Application Clusters 19.0.0.0.0 OPTION OFF
OLAP Analytic Workspace 19.0.0.0.0 VALID
Oracle Workspace Manager 19.0.0.0.0 VALID
Oracle Text 19.0.0.0.0 VALID
Oracle XML Database 19.0.0.0.0 VALID
Oracle Multimedia 19.0.0.0.0 VALID
Spatial 19.0.0.0.0 VALID
Oracle OLAP API 19.0.0.0.0 VALID
Oracle Application Express 3.2.1.00.12 VALID
14 rows selected.
—
SQL> set lines 1234 pages 1234
col action_time for a30
col action for a14
col namespace for a14
col version for a10
col comments for a60
col bundle_series for a14
select action_time,action,namespace,version,comments from dba_registry_history;
ACTION_TIME ACTION NAMESPACE VERSION COMMENTS
—————————— ————– ————– ———- ————————————————————
24-08-13 12:03:45.119862 PM APPLY SERVER 11.2.0.4 Patchset 11.2.0.2.0
26-06-25 2:26:10.094049 PM APPLY SERVER 11.2.0.4 Patchset 11.2.0.2.0
BOOTSTRAP DATAPATCH 19 RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417
28-06-25 7:07:23.576713 AM RU_APPLY SERVER 19.0.0.0.0 Patch applied on 19.3.0.0.0: Release_Update – 190410122720
28-06-25 7:10:13.706536 AM UPGRADE SERVER 19.0.0.0.0 Upgraded from 11.2.0.4.0 to 19.3.0.0.0
8. If Oracle Enterprise Manager configured in database, then the drop the Enterprise Manager user.
SQL> select username,account_status from dba_users where username=’SYSMAN’;
no rows selected
In this scenario, OEM is not configured. If OEM configured, drop the SYSMAN user by below drop command.
DROP USER sysman CASCADE;
Note: After we drop the Enterprise Manager user, we can find that MGMT* synonyms are invalid. You must reconfigure Oracle Enterprise Manager to use any Oracle Enterprise Manager controls in the downgraded database.
9. Check the invalid objects in database.
SQL> select count(*) from dba_objects where status=’INVALID’;
COUNT(*)
———-
0
10. Start the downgrade from 19c to 11g.
10.a Shutdown the 19c database and startup in downgrade mode.
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup downgrade
ORACLE instance started.
Total System Global Area 3053449816 bytes
Fixed Size 8901208 bytes
Variable Size 654311424 bytes
Database Buffers 2382364672 bytes
Redo Buffers 7872512 bytes
Database mounted.
Database opened.
10.b Downgrade the 19c Database.
SQL> spool downgrade_19cto11g.log
SQL> set timing on;
SQL> @?/rdbms/admin/catdwgrd.sql
SQL> spool off;
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
10.c Set the environment to 11g home
[oracle@prod ~]$ export ORACLE_HOME=/u01/app/oracle/product/11.0.0/db_1
export PATH=/u01/app/oracle/product/11.0.0/db_1/bin
[oracle@prod ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/11.0.0/db_1
[oracle@prod ~]$ sqlplus -V
SQL*Plus: Release 11.2.0.4.0 Production
10.d Check the oratab file and update the with 12c ORACLE_HOME path.
[oracle@prod ~]$ cat /etc/oratab
#prod:/u01/app/oracle/product/19.0.0/db_1:N
prod:/u01/app/oracle/product/11.0.0/db_1:N
10.e From 19c home to 11g home, restore the necessary configuraton files such as parameter files, password filed and tns files sucha as listener.ora, tnsnames.ora and sqlner.ora.
10.f start the database in upgrade mode from 11g home.
[oracle@prod ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Tue Jun 24 06:43:20 2025
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup upgrade
ORACLE instance started.
Total System Global Area 1987563520 bytes
Fixed Size 2254584 bytes
Variable Size 520096008 bytes
Database Buffers 1459617792 bytes
Redo Buffers 5595136 bytes
Database mounted.
Database opened.
SQL> select * from v$version;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
PL/SQL Release 11.2.0.4.0 – Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 – Production
NLSRTL Version 11.2.0.4.0 – Production
SQL> spool reload11g.log
SQL> @?/rdbms/admin/catrelod.sql
SQL> spool off
SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 3607691264 bytes
Fixed Size 2258480 bytes
Variable Size 855640528 bytes
Database Buffers 2734686208 bytes
Redo Buffers 15106048 bytes
Database mounted.
Database opened.
NAME DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE INSTANCE_NAME HOST_NAME STARTUP_TIME
———- ————— ———- —————— ————— —————- ——————–
PROD prod READ WRITE PRIMARY prod prod 29-JUN-2025 17:27
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
PL/SQL Release 11.2.0.4.0 – Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 – Production
NLSRTL Version 11.2.0.4.0 – Production
11. Post downgrade from 19c to 11g, perform the post checks.
11.a Check the invalid objects and compile the, if any.
SQL> select count(*) from dba_objects where status=’INVALID’;
COUNT(*)
———-
0
—
11.b Check the status of dba registry components before upgrade. All components should be in valid status.
set lines 1234 pages 1234
col comp_name for a50
col version for a15
col status for a10
SELECT comp_name, version, status FROM dba_registry;
COMP_NAME VERSION STATUS
————————————————– ————— ———-
Oracle Application Express 3.2.1.00.12 VALID
Oracle OLAP API 11.2.0.4.0 VALID
Spatial 11.2.0.4.0 VALID
Oracle Multimedia 11.2.0.4.0 VALID
Oracle XML Database 11.2.0.4.0 VALID
Oracle Text 11.2.0.4.0 VALID
Oracle Workspace Manager 11.2.0.4.0 VALID
Oracle Database Catalog Views 11.2.0.4.0 VALID
Oracle Database Packages and Types 11.2.0.4.0 VALID
JServer JAVA Virtual Machine 11.2.0.4.0 VALID
Oracle XDK 11.2.0.4.0 VALID
Oracle Database Java Packages 11.2.0.4.0 VALID
OLAP Analytic Workspace 11.2.0.4.0 VALID
13 rows selected.
set lines 1234 pages 1234
col action_time for a30
col action for a14
col namespace for a14
col version for a10
col comments for a60
col bundle_series for a14
select action_time,action,namespace,version,comments from dba_registry_history;
ACTION_TIME ACTION NAMESPACE VERSION COMMENTS
—————————— ————– ————– ———- ————————————————————
24-08-13 12:03:45.119862 PM APPLY SERVER 11.2.0.4 Patchset 11.2.0.2.0
29-06-25 03:17:35.163356 PM APPLY SERVER 11.2.0.4 Patchset 11.2.0.2.0
BOOTSTRAP DATAPATCH 19 RDBMS_19.3.0.0.0DBRU_LINUX.X64_190417
29-06-25 04:15:25.364389 PM RU_APPLY SERVER 19.0.0.0.0 Patch applied on 19.3.0.0.0: Release_Update – 190410122720
29-06-25 04:17:29.690443 PM UPGRADE SERVER 19.0.0.0.0 Upgraded from 11.2.0.4.0 to 19.3.0.0.0
29-06-25 04:54:03.844626 PM DOWNGRADE
29-06-25 05:20:28.403341 PM RELOAD SERVER 11.2.0.4.0 Reloaded after downgrade from 11.2.0
7 rows selected.
—
11.c Post downgrade, check the time zone value of 11g DB.
SQL> set linesize 300
col property_name for a30
col value for a20
SELECT PROPERTY_NAME, SUBSTR(property_value, 1, 30) value
FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME LIKE ‘DST_%’
ORDER BY PROPERTY_NAME;
PROPERTY_NAME VALUE
—————————— ——————–
DST_PRIMARY_TT_VERSION 32
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE NONE
col version for 9999999999999
SELECT * FROM v$timezone_file;
FILENAME VERSION
——————– ————–
timezlrg_32.dat 32
12. Post downgrade, check the compatible parameter value.
SQL> show parameter compatible
NAME TYPE VALUE
———————————— ———– ——————————
compatible string 11.2.0.4.0
Disclaimer:
Please note the above information is only for educational purpose and practised in personal test database only. Always test in test database before implementing in production database. The pre-requisites and ways of implementing may vary from one environment to another. Hence, not providing guarantee that it will work in your environment.