This post is to demonstrate the downgrade standalone Oracle Database (Non-CDB) from 19c (19.27) to 12c (12.2.0.1) Using Flashback Database.
In this scenario compatible parameter was not updated after DB upgrade from 12c to 19c.
1. Check the GRP created before upgrading 12c DB to 19c.
set linesize 300
col name format a30
col time format a32
col scn for 999999999999999999
col storage_size for 999999999999999
SELECT name, scn, time, database_incarnation#, guarantee_flashback_database, storage_size FROM v$restore_point;
NAME SCN TIME DATABASE_INCARNATION# GUA STORAGE_SIZE
—————————— ——————- ——————————– ——————— — —————-
AUTOUPGRADE_9212_PROD122010 1551009 14-06-25 8:40:55.000000000 AM 2 YES 1048576000
2. Flashback to the GRP using the upgraded 19c home.
2.1 Shutdown the 19c DB.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
2.2 Startup the 19c DB in mount state.
Ensure 19c Home and Environment variable is set.
SQL> startup mount
ORACLE instance started.
Total System Global Area 2063597432 bytes
Fixed Size 8941432 bytes
Variable Size 520093696 bytes
Database Buffers 1526726656 bytes
Redo Buffers 7835648 bytes
Database mounted.
2.3 Flashback to the GRP.
SQL> flashback database to restore point AUTOUPGRADE_9212_PROD122010;
Flashback complete.
2.4 Shutdown the DB
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
3. Open the database using 12c home.
Set the environment variable to point to the 12c (12.2.0.1) Oracle Home (12.2.0.1).
export ORACLE_HOME=/u01/app/oracle/product/12c/db_1
export ORACLE_SID=prod
export PATH=/u01/app/oracle/product/12c/db_1/bin
[oracle@prod ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/12c/db_1
[oracle@prod ~]$ echo $ORACLE_SID
prod
[oracle@prod ~]$ sqlplus -V
SQL*Plus: Release 12.2.0.1.0 Production
[oracle@prod ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Sat Jun 14 16:35:31 2025
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 2063597568 bytes
Fixed Size 8622528 bytes
Variable Size 587206208 bytes
Database Buffers 1459617792 bytes
Redo Buffers 8151040 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
SQL> select name,version,status from v$database, v$instance;
NAME VERSION STATUS
———- —————– ———-
PROD 12.2.0.1.0 OPEN
4. Post downgrade check the status of components of dba_registry.
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 12.2.0.1.0 VALID
Oracle Database Packages and Types 12.2.0.1.0 VALID
JServer JAVA Virtual Machine 12.2.0.1.0 VALID
Oracle XDK 12.2.0.1.0 VALID
Oracle Database Java Packages 12.2.0.1.0 VALID
OLAP Analytic Workspace 12.2.0.1.0 VALID
Oracle Real Application Clusters 12.2.0.1.0 OPTION OFF
Oracle XML Database 12.2.0.1.0 VALID
Oracle Workspace Manager 12.2.0.1.0 VALID
Oracle Text 12.2.0.1.0 VALID
Oracle Multimedia 12.2.0.1.0 VALID
Spatial 12.2.0.1.0 VALID
Oracle OLAP API 12.2.0.1.0 VALID
Oracle Label Security 12.2.0.1.0 VALID
Oracle Database Vault 12.2.0.1.0 VALID
15 rows selected.
5. Check the timezone version whether it is reverted or not.
SQL> SELECT version FROM v$timezone_file;
VERSION
————–
26
6. Take the RMAN backup.
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.