Oracle RAC database upgrade from 12c to 19c manually

Introduction

In this article, I will show a detailed step-by-step guide of an Oracle RAC database upgrade from 12c to 19c manually.

Oracle RAC database upgrade manually

We will perform the Oracle RAC database upgrade in 3 parts.

1) PRECHECK

2) UPGRADE

3) POSTCHECK

Now, let's begin the setup.

PRECHECK

Precheck is the first step in the Oracle RAC database upgrade.

Step 1) Check the database status

[oracle@lab1 ~]$ srvctl status database -d DEVDB
Instance DEVDB1 is running on node lab1
Instance DEVDB2 is running on node lab2
set lines 250 pages 250
col HOST_NAME for a15
col DB_Start_Time for a20
col HOST_NAME for a20
alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';
SELECT NAME as DB_NAME,instance_name,OPEN_MODE,HOST_NAME,database_role,logins FROM gV$INSTANCE,v$database;

DB_NAME   INSTANCE_NAME    OPEN_MODE            HOST_NAME             DATABASE_ROLE    LOGINS    
--------- ---------------- -------------------- --------------------  ---------------- ----------
DEVDB     DEVDB2           READ WRITE           lab2.localdomain.com  PRIMARY          ALLOWED   
DEVDB     DEVDB1           READ WRITE           lab1.localdomain.com  PRIMARY          ALLOWED   

Step 2)  Spfile and pfile backup

SQL> create pfile='/tmp/initDEVDB1.ora' from spfile;

File created.

Step 3) Database Archive Log mode

Note: – Before performing the Oracle RAC database upgrade, putting the database in Archive log is one of the mandatory steps.

SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     2
Current log sequence           3

As we can check from the above output Database is in No Archive log mode. First, we need to change the IT mode from No Archive to Archive log mode.

Step 4) Putting the Database in Archive Log Mode

[oracle@lab1 DEVDB]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Aug 22 20:03:05 2025

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup mount;
ORACLE instance started.

Total System Global Area 2667577344 bytes
Fixed Size                  8624264 bytes
Variable Size             754976632 bytes
Database Buffers         1895825408 bytes
Redo Buffers                8151040 bytes
Database mounted.
SQL>

SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     2
Current log sequence           3
SQL>
SQL>
SQL> alter database archivelog;

Database altered.

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     2
Next log sequence to archive   3
Current log sequence           3


Node 2 Output

[oracle@lab2 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Aug 22 20:06:42 2025

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     1
Next log sequence to archive   2
Current log sequence           2

Step 5) Take Oracle DB Backup

Taking an Oracle DB backup is a very important step in an Oracle RAC database upgrade because in case something happens to the Guarantee restore point, then in that case you can restore your database using the Oracle DB backup.

export ORACLE_SID=DEVDB1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export PATH=$PATH:$ORACLE_HOME/bin
find /u01/backup/DEVDB -name "L0_*.log" -type f | sort | head -n -5 | xargs -r rm -f
rman target / log=/u01/backup/DEVDB/L0_$(date +%Y%m%d_%H_%M).log <<EOF
run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
crosscheck backup;
delete noprompt expired backup;
crosscheck archivelog all;
delete noprompt expired archivelog all;
backup incremental level 0 database format='/u01/backup/DEVDB/database_L0_%d_%T_%U' plus archivelog format='/u01/backup/DEVDB/archivelog_%d_%T_%U';
backup spfile format='/u01/backup/DEVDB/spfile_%d_%T_%U';
backup current controlfile format='/u01/backup/DEVDB/controlfile_%d_%T_%U';
backup current controlfile for standby format='/u01/backup/DEVDB/stndby_cf_%d_t%t_s%s_p%p';
release channel ch1;
release channel ch2;
}
quit;
EOF

Step 6) Oracle Home Backup

- DB Home backup 
tar -cvpzf /u01/backup/DEVDB/OH_backup/Oracle_Home.tar /u01/app/oracle/product/12.2.0/dbhome_1

tar → archive utility (tape archive)
-c → create a new archive
-v → verbose (shows progress on screen)
-p → preserve permissions (keeps file ownership & permissions intact)
-z → compress with gzip (creates .tar.gz file)
-f → filename (specifies the name of the backup file)

Output

[oracle@lab1 OH_backup]$ ls -lrt
total 6922396
-rw-r--r-- 1 oracle oinstall 7088532753 Aug 22 20:58 Oracle_Home.tar

Step 7) Check for Invalid objects

set lines 200 pages 200
col owner for a14
col object_name for a30
col object_type for a30
select count(*) from dba_objects where status='INVALID' and owner like '%SYS%';
 
 COUNT(*)
----------
         0

Step 8) Create GRP (Guarantee Restore Point)

SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      +FRA
db_recovery_file_dest_size           big integer 15G
recovery_parallelism                 integer     0
remote_recovery_file_dest            string
SQL>

SQL> create restore point pre_upgrade guarantee flashback database;

Restore point created.

SQL> col name for a20
col GUARANTEE_FLASHBACK_DATABASE for a10
col TIME for a60
set lines 190
select NAME,GUARANTEE_FLASHBACK_DATABASE,TIME from V$restore_point;

NAME                 GUARANTEE_ TIME
-------------------- ---------- ------------------------------------------------------------
PRE_UPGRADE          YES        23-AUG-25 11.12.12.000000000 AM

Step 9 )  List database object count for APPs Schema

Step 10) Gather dictionary stats and fixed object stats

SET ECHO ON;
SET SERVEROUTPUT ON;
EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;
EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

Output

SQL> SET ECHO ON;
SET SERVEROUTPUT ON;
EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;

PL/SQL procedure successfully completed.

SQL> EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

PL/SQL procedure successfully completed.

Step 11) Purge the recycle bin

SQL> PURGE DBA_RECYCLEBIN;

DBA Recyclebin purged.

Step 12) Check DBA Registry

col comp_id for a10
col version for a11
col status for a10
col comp_name for a38
select comp_id,comp_name,version,status from dba_registry;

COMP_ID    COMP_NAME                              VERSION     STATUS
---------- -------------------------------------- ----------- ----------
CATALOG    Oracle Database Catalog Views          12.2.0.1.0  VALID
CATPROC    Oracle Database Packages and Types     12.2.0.1.0  VALID
JAVAVM     JServer JAVA Virtual Machine           12.2.0.1.0  VALID
XML        Oracle XDK                             12.2.0.1.0  VALID
CATJAVA    Oracle Database Java Packages          12.2.0.1.0  VALID
APS        OLAP Analytic Workspace                12.2.0.1.0  VALID
RAC        Oracle Real Application Clusters       12.2.0.1.0  VALID
XDB        Oracle XML Database                    12.2.0.1.0  VALID
OWM        Oracle Workspace Manager               12.2.0.1.0  VALID
CONTEXT    Oracle Text                            12.2.0.1.0  VALID
ORDIM      Oracle Multimedia                      12.2.0.1.0  VALID
SDO        Spatial                                12.2.0.1.0  VALID
XOQ        Oracle OLAP API                        12.2.0.1.0  VALID
OLS        Oracle Label Security                  12.2.0.1.0  VALID
DV         Oracle Database Vault                  12.2.0.1.0  VALID

Step 13) DB Links Status

col owner for a20
col host for a20
col db_link for a20
col username for a20
set lines 200 pages 200
select * from dba_db_links; 

OWNER                DB_LINK              USERNAME             HOST                 CREATED   HID
-------------------- -------------------- -------------------- -------------------- --------- ---
SYS                  SYS_HUB                                   SEEDDATA             26-JAN-17 NO

Step 14) Run Oracle prechecks scripts

Download Preupgrade.jar file from MOS 884522.1

Once downloaded unzip it in below path of 19c.

Path : - /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin

Output

[oracle@lab1 u01]$ unzip preupgrade_19_cbuild_13_lf.zip -d /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin

Archive:  preupgrade_19_cbuild_13_lf.zip
replace /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade_package.sql? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade_package.sql
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade_driver.sql
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/dbms_registry_extended.sql
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/parameters.properties
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade_messages.properties
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/components.properties
  inflating: /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade.jar

Command : - /u01/app/oracle/product/19.0.0.0/dbhome_1/jdk/bin/java -jar /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade.jar TERMINAL TEXT

Output

[oracle@lab1 u01]$ /u01/app/oracle/product/19.0.0.0/dbhome_1/jdk/bin/java -jar /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin/preupgrade.jar TERMINAL TEXT
Report generated by Oracle Database Pre-Upgrade Information Tool Version
19.0.0.0.0 Build: 13 on 2025-08-23T11:55:25

Upgrade-To version: 19.0.0.0.0

=======================================
Status of the database prior to upgrade
=======================================
      Database Name:  DEVDB
     Container Name:  DEVDB
       Container ID:  0
            Version:  12.2.0.1.0
     DB Patch Level:  No Patch Bundle applied
         Compatible:  12.2.0
          Blocksize:  8192
           Platform:  Linux x86 64-bit
      Timezone File:  26
  Database log mode:  ARCHIVELOG
           Readonly:  FALSE
            Edition:  EE

  Oracle Component                       Upgrade Action    Current Status
  ----------------                       --------------    --------------
  Oracle Server                          [to be upgraded]  VALID
  JServer JAVA Virtual Machine           [to be upgraded]  VALID
  Oracle XDK for Java                    [to be upgraded]  VALID
  Real Application Clusters              [to be upgraded]  VALID
  Oracle Workspace Manager               [to be upgraded]  VALID
  OLAP Analytic Workspace                [to be upgraded]  VALID
  Oracle Label Security                  [to be upgraded]  VALID
  Oracle Database Vault                  [to be upgraded]  VALID
  Oracle Text                            [to be upgraded]  VALID
  Oracle XML Database                    [to be upgraded]  VALID
  Oracle Java Packages                   [to be upgraded]  VALID
  Oracle Multimedia                      [to be upgraded]  VALID
  Oracle Spatial                         [to be upgraded]  VALID
  Oracle OLAP API                        [to be upgraded]  VALID

==============
BEFORE UPGRADE
==============

  REQUIRED ACTIONS
  ================
  None

  RECOMMENDED ACTIONS
  ===================
  1.  Review and remove any unnecessary HIDDEN/UNDERSCORE parameters.

      The database contains the following initialization parameters whose name
      begins with an underscore:

      _ipddb_enable

      Remove hidden parameters before database upgrade unless your application
      vendors and/or Oracle Support state differently.  Changes will need to be
      made in the pfile/spfile.

  INFORMATION ONLY
  ================
  2.  Here are ALL the components in this database registry:

      Component Current     Current     Original    Previous    Component
      CID       Version     Status      Version     Version     Schema
      --------- ----------- ----------- ----------- ----------- -----------
      APS       12.2.0.1.0  VALID                               SYS
      CATALOG   12.2.0.1.0  VALID                               SYS
      CATJAVA   12.2.0.1.0  VALID                               SYS
      CATPROC   12.2.0.1.0  VALID                               SYS
      CONTEXT   12.2.0.1.0  VALID                               CTXSYS
      DV        12.2.0.1.0  VALID                               DVSYS
      JAVAVM    12.2.0.1.0  VALID                               SYS
      OLS       12.2.0.1.0  VALID                               LBACSYS
      ORDIM     12.2.0.1.0  VALID                               ORDSYS
      OWM       12.2.0.1.0  VALID                               WMSYS
      RAC       12.2.0.1.0  VALID                               SYS
      SDO       12.2.0.1.0  VALID                               MDSYS
      XDB       12.2.0.1.0  VALID                               XDB
      XML       12.2.0.1.0  VALID                               SYS
      XOQ       12.2.0.1.0  VALID                               OLAPSYS

      Review the information before upgrading.

  3.  Check the Oracle Backup and Recovery User's Guide for information on how
      to manage an RMAN recovery catalog schema.

      If you are using a version of the recovery catalog schema that is older
      than that required by the RMAN client version, then you must upgrade the
      catalog schema.

      It is good practice to have the catalog schema the same or higher version
      than the RMAN client version you are using.

  4.  Here is a count of invalid objects by Oracle-maintained users:

      Oracle-Maintained User Name                 Number of INVALID Objects
      ---------------------------                 -------------------------
      None                                        None

      Review the information before upgrading.

  5.  Here is a count of invalid objects by Application users:

      Application User Name                       Number of INVALID Objects
      ---------------------------                 -------------------------
      None                                        None

      Review the information before upgrading.

=============
AFTER UPGRADE
=============

  REQUIRED ACTIONS
  ================
  None

  RECOMMENDED ACTIONS
  ===================
  6.  Upgrade the database time zone file using the DBMS_DST package.

      The database is using time zone file version 26 and the target 19 release
      ships with time zone file version 32.

      Oracle recommends upgrading to the desired (latest) version of the time
      zone file.  For more information, refer to "Upgrading the Time Zone File
      and Timestamp with Time Zone Data" in the 19 Oracle Database
      Globalization Support Guide.

  7.  (AUTOFIXUP) Gather dictionary statistics after the upgrade using the
      command:

        EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;

      Oracle recommends gathering dictionary statistics after upgrade.

      Dictionary statistics provide essential information to the Oracle
      optimizer to help it find efficient SQL execution plans. After a database
      upgrade, statistics need to be re-gathered as there can now be tables
      that have significantly changed during the upgrade or new tables that do
      not have statistics gathered yet.

  8.  Gather statistics on fixed objects after the upgrade and when there is a
      representative workload on the system using the command:

        EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

      This recommendation is given for all preupgrade runs.

      Fixed object statistics provide essential information to the Oracle
      optimizer to help it find efficient SQL execution plans.  Those
      statistics are specific to the Oracle Database release that generates
      them, and can be stale upon database upgrade.

      For information on managing optimizer statistics, refer to the 12.2.0.1
      Oracle Database SQL Tuning Guide.

  ORACLE GENERATED FIXUP SCRIPT
  =============================
  All of the issues in database DEVDB
  which are identified above as AFTER UPGRADE "(AUTOFIXUP)" can be resolved by
  executing the following

    SQL>@/u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/postupgrade_fixups.sql


==================
PREUPGRADE SUMMARY
==================
  /u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/preupgrade.log
  /u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/preupgrade_fixups.sql
  /u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/postupgrade_fixups.sql

Execute fixup scripts as indicated below:

Before upgrade:

Log into the database and execute the preupgrade fixups
@/u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/preupgrade_fixups.sql

After the upgrade:

Log into the database and execute the postupgrade fixups
@/u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/postupgrade_fixups.sql

Preupgrade complete: 2025-08-23T11:55:25
[oracle@lab1 u01]$

UPGRADE

The next step is the Oracle RAC database upgrade.

Step 1) We need to stop the database using the SRVCTL command

srvctl stop database -d devdb

Step 2) Log in from node 1 and start the database in NOMOUNT stage

[oracle@lab1 u01]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Sat Aug 23 12:31:03 2025

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area 2667577344 bytes
Fixed Size                  8624264 bytes
Variable Size             754976632 bytes
Database Buffers         1895825408 bytes
Redo Buffers                8151040 bytes

Step 3) Make the cluster database parameter FALSE

a)SQL> alter system set cluster_database=false scope=spfile;

System altered.

b)SQL> create pfile from spfile;

File created.

c)shut immediate;

Step 4) Copy the above pfile from 12c to 19c Oracle home and start the DB from one node to perform the Oracle RAC database upgrade

cd /u01/app/oracle/product/12.2.0/dbhome_1/dbs

cp initDEVDB1.ora  /u01/app/oracle/product/19.0.0.0/dbhome_1

Step 5) Set the Oracle home for the 19c database

export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
env | grep ORA

[oracle@lab1 dbs]$ env | grep ORA
ORACLE_SID=DEVDB1
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1

Step 6) Log in to the database and start up the database in UPGRADE mode using the pfile that we copied in 19c home

[oracle@lab1 dbs]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Sat Aug 23 12:35:18 2025

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup upgrade
pfile='/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/initDEVDB1.ora';
ORACLE instance started.

Total System Global Area 2667574848 bytes
Fixed Size                  8943168 bytes
Variable Size             721420288 bytes
Database Buffers         1929379840 bytes
Redo Buffers                7831552 bytes
Database mounted.
Database opened.

Step 7) Now go to the $ORACLE_HOME/bin of the 19c database and perform the Oracle RAC database upgrade

cd $ORACLE_HOME/bin

./dbupgrade

Note:- Oracle RAC database upgrade will start from this moment and it will run from 1 to 107 phases. You will get final output like below.

------------------------------------------------------
Phases [0-107]         End Time:[2025_08_25 01:10:48]
------------------------------------------------------

Grand Total Time: 2617s

 LOG FILES: (/u01/app/oracle/product/19.0.0.0/dbhome_1/cfgtoollogs/DEVDB/upgrade20250825002711/catupgrd*.log)

Upgrade Summary Report Located in:
/u01/app/oracle/product/19.0.0.0/dbhome_1/cfgtoollogs/DEVDB/upgrade20250825002711/upg_summary.log

Grand Total Upgrade Time:    [0d:0h:43m:37s]

POSTCHECK

Postcheck is the last step in the Oracle RAC database upgrade.

Step 8) We have finally performed the Oracle RAC database upgrade, but as we know, the Manual method comes with some drawbacks because we need to perform several things after the upgrade.

a) The database will not come up automatically.

[oracle@lab1 bin]$ ps -ef | grep pmon
oracle    6964     1  0 Aug24 ?        00:00:00 asm_pmon_+ASM1
oracle    9601  6848  0 01:22 pts/1    00:00:00 grep --color=auto pmon

[oracle@lab1 bin]$ srvctl status database -d DEVDB
Instance DEVDB1 is not running on node lab1
Instance DEVDB2 is not running on node lab2

b) When we check the configuration of the database, the Oracle home is still pointing to 12c

[oracle@lab1 bin]$ srvctl config database -d DEVDB
Database unique name: DEVDB
Database name: DEVDB
Oracle home: /u01/app/oracle/product/12.2.0/dbhome_1

Imp Note:- We need to upgrade the database and set the oracle home of 19c 
cd /u01/app/oracle/product/19.0.0.0/dbhome_1/bin
srvctl upgrade database -d DEVDB -oraclehome /u01/app/oracle/product/19.0.0.0/dbhome_1

After Upgrade Output (Set the oracle home to 19c)

export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

[oracle@lab1 bin]$ /u01/app/oracle/product/19.0.0.0/dbhome_1/bin/srvctl config database -d DEVDB
Database unique name: DEVDB
Database name: DEVDB
Oracle home: /u01/app/oracle/product/19.0.0.0/dbhome_1

c) If we start the database after these steps, then it will not start and give below error as cluster_database is set as FALSE in the beginning when we start our Oracle RAC database upgrade

Oracle RAC database upgrade
Note:- We need to first set the cluster_database parameter is TRUE and then we can start the database

a)srvctl stop database -d DEVDB
b)sqlplus / as sysdba
c)startup nomount;
d)alter system set cluster_database=TRUE scope=spfile;
e)Shut immediate;
f)srvctl status database -d DEVDB
g)srvctl start database -d DEVDB

d) If we check the DBA registry components, their status will show as UPGRADED instead of VALID, so to make them VALID, we need to run the UTLRP scripts.

set lines 200 pages 200
col owner for a14
col object_name for a30
col object_type for a30
select count(*) from dba_objects where status='INVALID' and owner like '%SYS%';

COMP_ID    COMP_NAME                              VERSION     STATUS
---------- -------------------------------------- ----------- ----------
CATALOG    Oracle Database Catalog Views          19.0.0.0.0  UPGRADED
CATPROC    Oracle Database Packages and Types     19.0.0.0.0  UPGRADED
JAVAVM     JServer JAVA Virtual Machine           19.0.0.0.0  UPGRADED
XML        Oracle XDK                             19.0.0.0.0  UPGRADED
CATJAVA    Oracle Database Java Packages          19.0.0.0.0  UPGRADED
APS        OLAP Analytic Workspace                19.0.0.0.0  UPGRADED
RAC        Oracle Real Application Clusters       19.0.0.0.0  UPGRADED
XDB        Oracle XML Database                    19.0.0.0.0  UPGRADED
OWM        Oracle Workspace Manager               19.0.0.0.0  UPGRADED
CONTEXT    Oracle Text                            19.0.0.0.0  UPGRADED
ORDIM      Oracle Multimedia                      19.0.0.0.0  UPGRADED

COMP_ID    COMP_NAME                              VERSION     STATUS
---------- -------------------------------------- ----------- ----------
SDO        Spatial                                19.0.0.0.0  UPGRADED
XOQ        Oracle OLAP API                        19.0.0.0.0  UPGRADED
OLS        Oracle Label Security                  19.0.0.0.0  UPGRADED
DV         Oracle Database Vault                  19.0.0.0.0  UPGRADED

Utlrp script Output

@?/rdbms/admin/utlrp.sql

SQL> select comp_id,comp_name,version,status from dba_registry;

COMP_ID    COMP_NAME                              VERSION     STATUS
---------- -------------------------------------- ----------- ----------
CATALOG    Oracle Database Catalog Views          19.0.0.0.0  VALID
CATPROC    Oracle Database Packages and Types     19.0.0.0.0  VALID
JAVAVM     JServer JAVA Virtual Machine           19.0.0.0.0  VALID
XML        Oracle XDK                             19.0.0.0.0  VALID
CATJAVA    Oracle Database Java Packages          19.0.0.0.0  VALID
APS        OLAP Analytic Workspace                19.0.0.0.0  VALID
RAC        Oracle Real Application Clusters       19.0.0.0.0  VALID
XDB        Oracle XML Database                    19.0.0.0.0  VALID
OWM        Oracle Workspace Manager               19.0.0.0.0  VALID
CONTEXT    Oracle Text                            19.0.0.0.0  VALID
ORDIM      Oracle Multimedia                      19.0.0.0.0  VALID

COMP_ID    COMP_NAME                              VERSION     STATUS
---------- -------------------------------------- ----------- ----------
SDO        Spatial                                19.0.0.0.0  VALID
XOQ        Oracle OLAP API                        19.0.0.0.0  VALID
OLS        Oracle Label Security                  19.0.0.0.0  VALID
DV         Oracle Database Vault                  19.0.0.0.0  VALID

e) Run the Post fixup script after the Oracle RAC database upgrade

SQL> @/u01/app/oracle/cfgtoollogs/DEVDB/preupgrade/postupgrade_fixups.sql
Preup                             Preupgrade
Action                            Issue Is
Number  Preupgrade Check Name     Remedied    Further DBA Action
------  ------------------------  ----------  --------------------------------
    6.  old_time_zones_exist      NO          Manual fixup recommended.
    7.  post_dictionary           YES         None.
    8.  post_fixed_objects        NO          Informational only.
                                              Further action is optional.

Note: - The above output is saying we also need to upgrade the TIMEZONE as well.

f) Upgrade the Timezone

SQL> SELECT version FROM v$timezone_file;

   VERSION
----------
        26

[oracle@lab1 admin]$ cd /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin
[oracle@lab1 admin]$
[oracle@lab1 admin]$ ls -ltr utltz_countstats.sql utltz_countstar.sql utltz_upg_check.sql utltz_upg_apply.sql
-rw-r--r-- 1 oracle oinstall  8317 Feb 25  2017 utltz_countstats.sql
-rw-r--r-- 1 oracle oinstall  7423 Feb 25  2017 utltz_countstar.sql
-rw-r--r-- 1 oracle oinstall 35322 Apr 15 11:36 utltz_upg_check.sql
-rw-r--r-- 1 oracle oinstall 21793 Apr 15 11:36 utltz_upg_apply.sql

Note: - Timezone upgrade will only work in when the database is in Statup upgrade mode. When you run below command it will fail with error.

SQL> @utltz_upg_check.sql

WARNING: This RAC database is not started in single instance mode.
WARNING: Set cluster_database = false and start as single instance
WARNING: BEFORE running utltz_upg_apply.sql!
WARNING: This is REQUIRED!

So first need to put the database im upgrade mode then perform the timezone upgrade. You can do it by follow below steps.

a) srvctl stop database -d DEVDB
b) sqlplus / as sysdba
c) startup nomount;
d) alter system set cluster_database=FALSE scope=spfile;
e) shut immediate;
f) startup upgrade;
g) cd /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/admin
h) @utltz_upg_check.sql

After output
INFO: A newer RDBMS DST version than the one currently used is found.
INFO: Note that NO DST update was yet done.
INFO: Now run utltz_upg_apply.sql to do the actual RDBMS DST update.
INFO: Note that the utltz_upg_apply.sql script will
INFO: restart the database 2 times WITHOUT any confirmation or prompt.

Execute the Timezone upgrade script

@utltz_upg_apply.sql

INFO: Total failures during update of TSTZ data: 0 .
An upgrade window has been successfully ended.
INFO: Your new Server RDBMS DST version is DSTv44 .
INFO: The RDBMS DST update is successfully finished.
INFO: Make sure to exit this SQL*Plus session.
INFO: Do not use it for timezone related selects.

Session altered.

SQL> select version from v$timezone_file;

   VERSION
----------
        44

g) Execution of utlusts.sql script

Oracle Database Release 19 Post-Upgrade Status Tool    08-25-2025 03:03:5
Database Name: DEVDB

Component                               Current         Full     Elapsed Time
Name                                    Status          Version  HH:MM:SS

Oracle Server                             VALID     19.27.0.0.0  00:20:50
JServer JAVA Virtual Machine              VALID     19.27.0.0.0  00:01:48
Oracle XDK                                VALID     19.27.0.0.0  00:01:55
Oracle Database Java Packages             VALID     19.27.0.0.0  00:00:31
OLAP Analytic Workspace                   VALID     19.27.0.0.0  00:00:13
Oracle Label Security                     VALID     19.27.0.0.0  00:00:13
Oracle Database Vault                     VALID     19.27.0.0.0  00:00:50
Oracle Text                               VALID     19.27.0.0.0  00:00:59
Oracle Workspace Manager                  VALID     19.27.0.0.0  00:00:41
Oracle Real Application Clusters          VALID     19.27.0.0.0  00:00:00
Oracle XML Database                       VALID     19.27.0.0.0  00:01:30
Oracle Multimedia                         VALID     19.27.0.0.0  00:02:38
Spatial                                   VALID     19.27.0.0.0  00:08:49
Oracle OLAP API                           VALID     19.27.0.0.0  00:00:22
Datapatch                                                        00:00:41
Final Actions                                                    00:00:48
Post Upgrade                                                     00:00:00
Post Compile                                                     00:07:44

Total Upgrade Time: 00:50:03

Database time zone version is 44. It meets current release needs.

h) Execution of catuppst.sql script

TIMESTAMP
--------------------------------------------------------------------------------
COMP_TIMESTAMP CATUPPST               2025-08-25 03:04:40
DBUA_TIMESTAMP CATUPPST      FINISHED 2025-08-25 03:04:40
DBUA_TIMESTAMP CATUPPST          NONE 2025-08-25 03:04:40

From this point, you can hand over the database to the application team for the sanity checks as we have completed our Oracle RAC database upgrade part, and if all looks good from the app team, then you can change the compatibility parameter from 12.2.0 to 19.0.0

Note: – Best practice is to change this parameter after 1 month so that database performance can be checked properly, because if you change this parameter, then DBA cannot downgrade the database to a lower version in case of any issues.

SQL> show parameter compatible;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
compatible                           string      12.2.0
noncdb_compatible                    boolean     FALSE

alter system set compatible='19.0.0' scope=spfile sid='*';

You can delete the restore point as well after the app team confirmation to avoid any storage issues.

col name for a20
col GUARANTEE_FLASHBACK_DATABASE for a10
col TIME for a60
set lines 190
select NAME,GUARANTEE_FLASHBACK_DATABASE,TIME from V$restore_point;

NAME                 GUARANTEE_ TIME
-------------------- ---------- ------------------------------------------------------------
PRE_UPGRADE          YES        23-AUG-25 11.12.12.000000000 AM


DROP RESTORE POINT PRE_UPGRADE;

Note: – Manual Method has some drawbacks because all the steps you need manually throughout the process, but if you don't want to perform those manual steps, in that case you can go for Oracle RAC Database Upgrade through the DBUA method.

Conclusion

Finally, we have completed our Oracle RAC database upgrade from 12c to 19c using the Manual method.

Note: – If you want to practice this whole activity in your home lab, then you'll need a platform to perform the installation. To set that up, you first need to download and install Oracle VirtualBox, followed by the operating system, the Oracle binary software, and finally, create the database.

If you enjoyed the article, please leave a comment and share it with your friends. Also, let me know which Oracle and MySQL topics you'd like to see covered in future articles.

Scroll to Top