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
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
Author
Yes, you could use this method for that!
If you can post method to upgrade a non-cdb 19c database to first a cdb database and then to 26ai
Hi Rodrigo,
Is the cfg file of upgrade step same? If so, how it interprest source_home parameter when its a new server?
Author
The “-mode upgrade” will not care about a non-existent source_home, because this step performs the tasks on the target_home.