Upgrade a full CDB from Oracle 19c to 26ai between two different servers using AutoUpgrade

In this article, I’ll walk through upgrading an entire 19c CDB by relocating it from Server A to Server B and upgrading it to 26ai using AutoUpgrade.

Note: this approach is handy when the target database version or operating system differs from the source.

If you want to just move a single PDB instead, which makes this process even faster, check this article: https://www.dbarj.com.br/en/2026/01/upgrade-from-oracle-19c-to-26ai-between-two-different-servers-using-pdb-unplug-plug-with-autoupgrade/

Scope and assumptions

  • The source is Oracle Database 19c RU 29 (the same approach applies to 21c, although it is already out of support).

  • The target database is Oracle AI Database 26ai (23.26.0).

  • The full CDB is copied and upgraded; the source CDB remains untouched.

  • Source and target systems have the same endianness, although they may run different OS releases.

Environment overview

Source:
  • Oracle Linux 7.9
  • Oracle Database 19c (RU 19.29.0)
Target:
  • Oracle Linux 8.7
  • Oracle AI Database 26ai (RU 23.26.0)

With these prerequisites in place, we can use CDB relocation combined with AutoUpgrade to perform the move and upgrade in a controlled and supported way.

Getting Started

Before moving the CDB, still in 19c, we need to do some prechecks and fixups to ensure nothing is going to fail. Please note you can’t perform those checks after you plug into the new 26ai database, as the dictionary becomes invalid until you finish the upgrade process.

So, connected to my server A, first, I create the AutoUpgrade config file:

global.global_log_dir=/home/oracle/autopatch/logs
upg1.sid=orcl
upg1.source_home=/u01/app/oracle/product/19c/dbhome_1
upg1.target_home=/u01/app/oracle/product/26ai/dbhome_1
upg1.restoration=NO
upg1.target_version=23

Start up your database and open all the PDBs:

$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 14 20:13:41 2026
Version 19.29.0.0.0

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

Connected to an idle instance.

SQL> startup;

ORACLE instance started.

Total System Global Area 3154116192 bytes
Fixed Size		    9182816 bytes
Variable Size		  905969664 bytes
Database Buffers	 2231369728 bytes
Redo Buffers		    7593984 bytes
Database mounted.
Database opened.

SQL> alter pluggable database all open;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB01                          READ WRITE NO

SQL> exit

Next, I will run the AutoUpgrade pre-checks:

$ $ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config upgrade_cdb.cfg -mode analyze
AutoUpgrade 25.6.251016 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 CDB(s) plus 2 PDB(s) will be analyzed
Type 'help' to list console commands
upg> Job 100 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.html
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log

Checking the logs, we are good to fly:

$ cat /home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Jan 14 16:10:32 GMT 2026
[Number of Jobs] 1
==========================================
[Job ID] 100
==========================================
[DB Name]                orcl
[Version Before Upgrade] 19.29.0.0.0
[Version After Upgrade]  19.29.0.0.0
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        SUCCESS
[Start Time]    2026-01-14 16:09:48
[Duration]      0:00:43
[Log Directory] /home/oracle/autopatch/logs/orcl/100/prechecks
[Detail]        /home/oracle/autopatch/logs/orcl/100/prechecks/orcl_preupgrade.log
                Check passed and no manual intervention needed
------------------------------------------

Now let’s run the fixups:

$ $ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config upgrade_cdb.cfg -mode fixups
AutoUpgrade 25.6.251016 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 CDB(s) plus 2 PDB(s) will be processed
Type 'help' to list console commands
upg> Job 101 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.html
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log

Checking the logs:

$ cat /home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Jan 14 16:18:57 GMT 2026
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name]                orcl
[Version Before Upgrade] 19.29.0.0.0
[Version After Upgrade]  19.29.0.0.0
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        SUCCESS
[Start Time]    2026-01-14 16:12:11
[Duration]      0:00:36
[Log Directory] /home/oracle/autopatch/logs/orcl/101/prechecks
[Detail]        /home/oracle/autopatch/logs/orcl/101/prechecks/orcl_preupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
[Stage Name]    PREFIXUPS
[Status]        SUCCESS
[Start Time]    2026-01-14 16:12:47
[Duration]      0:06:10
[Log Directory] /home/oracle/autopatch/logs/orcl/101/prefixups
[Detail]        /home/oracle/autopatch/logs/orcl/101/prefixups/prefixups.html
------------------------------------------

Check prefixups.html if you want to get all the actions performed on your PDB to prepare it, like purge recyclebin, collecting dictionary statistics, etc.

Now we are good to fly. Since we are in 2 different servers, I will stop the database and move it entirely to a new server via RSYNC.

Please note that there are many other methods to achieve minimal downtime on this move, which includes:

  • Use RMAN incremental backups.
  • Data Guard

Stopping the system

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.29.0.0.0

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Now it is time to move all the CDB data files, init file, pw file, etc, to the new server:

$ rsync -avz /u01/app/oradata/ oracle@server-26:/u01/app/oradata/
sending incremental file list
./
ORCL/
ORCL/control01.ctl
ORCL/redo01.log
ORCL/redo02.log
ORCL/redo03.log
ORCL/sysaux01.dbf
ORCL/system01.dbf
ORCL/temp01.dbf
ORCL/undotbs01.dbf
ORCL/users01.dbf
ORCL/PDB01/
ORCL/PDB01/sysaux01.dbf
ORCL/PDB01/system01.dbf
ORCL/PDB01/temp01.dbf
ORCL/PDB01/undotbs01.dbf
ORCL/PDB01/users01.dbf
ORCL/pdbseed/
ORCL/pdbseed/sysaux01.dbf
ORCL/pdbseed/system01.dbf
ORCL/pdbseed/temp012022-05-27_14-08-05-960-PM.dbf
ORCL/pdbseed/undotbs01.dbf

sent 2,881,866,753 bytes  received 385 bytes  5,016,304.85 bytes/sec
total size is 14,075,528,704  speedup is 4.88

$ rsync -avz /u01/app/fra/ oracle@server-26:/u01/app/fra/
sending incremental file list
./
ORCL/
ORCL/control02.ctl
ORCL/archivelog/
ORCL/archivelog/2022_05_27/
ORCL/archivelog/2024_09_06/
ORCL/archivelog/2025_10_22/
ORCL/archivelog/2026_01_14/
ORCL/onlinelog/

sent 35,723 bytes  received 70 bytes  23,862.00 bytes/sec
total size is 18,726,912  speedup is 523.20

$ rsync -avz /u01/app/oracle/product/19c/dbhome_1/dbs/*orcl* oracle@server-26:/u01/app/oracle/product/26ai/dbhome_1/dbs/
sending incremental file list
hc_orcl.dat
orapworcl
spfileorcl.ora

sent 1,287 bytes  received 109 bytes  2,792.00 bytes/sec
total size is 7,176  speedup is 5.14

Now moving to the new 26ai server, it is time to start up both the CDB and PDBs in upgrade mode:

$ sqlplus / as sysdba

SQL*Plus: Release 23.26.0.0.0 - for Oracle Cloud and Engineered Systems on Wed Jan 14 20:46:34 2026
Version 23.26.0.0.0

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

Connected to an idle instance.

SQL> startup upgrade;
ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
ORACLE instance started.

Total System Global Area 3151206952 bytes
Fixed Size		    5012008 bytes
Variable Size		  654311424 bytes
Database Buffers	 2483027968 bytes
Redo Buffers		    8855552 bytes
Database mounted.
Database opened.

SQL> alter pluggable database all open upgrade;

Pluggable database altered.

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       MIGRATE    YES
         3 PDB01                          MIGRATE    YES
SQL>

Now that the PDB is opened in upgrade state, we can call AutoUpgrade in the last of the 3 modes (upgrade).

Please note that we use the same config file. Calling AutoUpgrade:

$ $ORACLE_HOME/jdk/bin/java -jar autoupgrade.jar -config upgrade_cdb.cfg -mode upgrade
AutoUpgrade 25.6.251016 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 PDB(s) will be processed
Type 'help' to list console commands
upg> Job 102 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.html
/home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log

Checking the logs:

$ cat /home/oracle/autopatch/logs/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Jan 14 22:18:41 GMT 2026
[Number of Jobs] 1
==========================================
[Job ID] 100
==========================================
[DB Name]                orcl
[Version Before Upgrade] 19.29.0.0.0
[Version After Upgrade]  23.26.0.0.0
------------------------------------------
[Stage Name]    DBUPGRADE
[Status]        SUCCESS
[Start Time]    2026-01-14 20:48:15
[Duration]      1:08:42
[Log Directory] /home/oracle/autopatch/logs/orcl/100/dbupgrade
------------------------------------------
[Stage Name]    POSTCHECKS
[Status]        SUCCESS
[Start Time]    2026-01-14 21:57:09
[Duration]      0:00:09
[Log Directory] /home/oracle/autopatch/logs/orcl/100/postchecks
[Detail]        /home/oracle/autopatch/logs/orcl/100/postchecks/orcl_postupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
[Stage Name]    POSTFIXUPS
[Status]        SUCCESS
[Start Time]    2026-01-14 21:57:20
[Duration]      0:21:20
[Log Directory] /home/oracle/autopatch/logs/orcl/100/postfixups
[Detail]        /home/oracle/autopatch/logs/orcl/100/postfixups/postfixups.html
------------------------------------------
[Stage Name]    SYSUPDATES
[Status]        SUCCESS
[Start Time]    2026-01-14 22:18:40
[Duration]      0:00:00
[Log Directory] /home/oracle/autopatch/logs/orcl/100/sysupdates
------------------------------------------
Summary:/home/oracle/autopatch/logs/orcl/100/dbupgrade/upg_summary.log

Our CDB was successfully upgraded. Finally, the last step is to check if all CDB and PDBs are up and running :

Oracle AI Database 26ai Enterprise Edition Release 23.26.0.0.0 - for Oracle Cloud and Engineered Systems Version 23.26.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB01                          READ WRITE NO

SQL>

That’s it! CDB successfully updated to 26ai.

Have you enjoyed? Please leave a comment or give a 👍!

5 comments

Skip to comment form

    • Adrian Godoy Ferro on February 6, 2026 at 13:58
    • Reply

    Hi Rodrigo,
    quick question. This also applies when the Source 19ai database is running in a ODA X5 (OEL 7) and I want to migrate/upgrade to a different non-Oracle Hardware host on Linux Red Hat 8 ?

    Thank you in advance
    Adrian

    1. Yes, you could use this method for that!

    • Asim Khan on February 12, 2026 at 07:13
    • Reply

    If you can post method to upgrade a non-cdb 19c database to first a cdb database and then to 26ai

    • Rajat on February 13, 2026 at 13:15
    • Reply

    Hi Rodrigo,

    Is the cfg file of upgrade step same? If so, how it interprest source_home parameter when its a new server?

    1. The “-mode upgrade” will not care about a non-existent source_home, because this step performs the tasks on the target_home.

Leave a Reply

Your email address will not be published.