Non-CDB to CDB/PDB Migration Runbook: Mandatory AutoUpgrade Conversion Before Oracle 26ai

Step-by-step production runbook for converting legacy Non-CDB Oracle Database 19c instances to Multitenant PDBs using the AutoUpgrade utility ahead of mandatory Oracle 26ai upgrades.

⚡ BLUF (Bottom Line Up Front) Summary

⚠️ Advisory Scope & Terms

Oracle Database 26ai completely desupports the legacy Non-CDB architecture. All Oracle 19c non-CDB databases must be converted into Pluggable Databases (PDBs) adoptable by a Container Database (CDB) prior to upgrading to 26ai. This runbook details the end-to-end AutoUpgrade conversion workflow, including target CDB creation, plugin configuration parameter generation, non-CDB pre-checks, fallback storage snapshots, and post-conversion PDB plugin validation.

Environment & Prerequisites

ComponentVersion / Specification
Oracle Database SourceOracle Database 19c (19.24+ Non-CDB)
Oracle Database TargetOracle Database 19c / 26ai (CDB Architecture)
Migration ToolingAutoUpgrade Utility (build 2026.1+)
OS / InfrastructureOracle Linux 8.x / RHEL 8.x

Executive Summary & Architectural Context

ith the release of Oracle Database 26ai, Oracle Corporation officially removed all support for legacy Non-CDB (Non-Container Database) architecture. While Oracle Database 19c permitted non-CDB deployments as a legacy fallback, Oracle 26ai exclusively runs on the Multitenant Architecture (CDB/PDB).

To upgrade a legacy Oracle 19c non-CDB to Oracle 26ai, DBAs cannot perform a direct in-place upgrade on a non-CDB instance. The non-CDB database must first be converted into a Pluggable Database (PDB) and plugged into a target Container Database (CDB).

<div class="process-flow">
  <div class="process-step">
    <div class="step-number">1</div>
    <div class="step-title">Source Pre-Checks</div>
    <div class="step-desc">Run AutoUpgrade -mode analyze on 19c Non-CDB source database.</div>
  </div>
  <div class="process-arrow">➔</div>
  <div class="process-step">
    <div class="step-number">2</div>
    <div class="step-title">Target CDB Creation</div>
    <div class="step-desc">Provision empty 19c/26ai CDB shell with matching character set (AL32UTF8).</div>
  </div>
  <div class="process-arrow">➔</div>
  <div class="process-step">
    <div class="step-number">3</div>
    <div class="step-title">AutoUpgrade Plugin</div>
    <div class="step-desc">AutoUpgrade executes noncdb_to_pdb.sql conversion and plugs PDB into target CDB.</div>
  </div>
  <div class="process-arrow">➔</div>
  <div class="process-step">
    <div class="step-number">4</div>
    <div class="step-title">PDB Compilation</div>
    <div class="step-desc">Open PDB in READ WRITE, recompile invalid objects via utlrp.sql, and verify datapatch.</div>
  </div>
</div>

🛠️ Step 1: Pre-Migration Prerequisites & Character Set Audit

Before attempting non-CDB to PDB conversion, ensure the source non-CDB and target CDB satisfy mandatory architectural compatibility rules:

  1. Character Set Alignment: The target CDB’s NLS_CHARACTERSET MUST be a superset of or identical to the source non-CDB. Oracle strongly recommends AL32UTF8.
  2. Time Zone Version: The target CDB’s time zone file version must be equal to or higher than the source database.
  3. Database Options: Installed options (e.g., Spatial, OLAP, Multimedia) in the source non-CDB must exist in the target CDB root (CDB$ROOT).

Run the following SQL query on both the source Non-CDB and target CDB to audit compatibility:

-- Audit Database Character Set, National Character Set, and Time Zone Version
SELECT property_name, property_value 
FROM database_properties 
WHERE property_name IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET', 'DST_PRIMARY_TT_VERSION');

📝 Step 2: AutoUpgrade Plugin Configuration File Creation

The modern Oracle AutoUpgrade utility automates the entire non-CDB to PDB conversion workflow via the target_cdb and plugin_filename directives.

Create an AutoUpgrade configuration file (/u01/app/oracle/cfg/noncdb_to_pdb.cfg) on your database server:

# Global AutoUpgrade Parameters
global.autoupg_log_dir=/u01/app/oracle/cfg/logs

# Job 1: Non-CDB (PROD19) to PDB (PDB_PROD19) Conversion in Target CDB (CDB26)
upg1.dbname=PROD19
upg1.start_time=IMMEDIATE
upg1.source_home=/u01/app/oracle/product/19.0.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/26.0.0/dbhome_1
upg1.sid=PROD19
upg1.target_cdb=CDB26
upg1.target_pdb_name=PDB_PROD19
upg1.target_db_start_mode=READ WRITE
upg1.upg_err_action=abort
upg1.restoration=YES

💡 Tip: Setting restoration=YES automatically creates a guaranteed restore point (GRP) prior to conversion, enabling instant fallback if storage or plugin errors occur.


🚀 Step 3: Executing Pre-Checks & Non-CDB Conversion

1. Run AutoUpgrade Pre-Checks (Analyze Mode)

Execute AutoUpgrade in analyze mode to validate dictionary sanity, undo mode, and tablespace encryptions without modifying database files:

java -jar /u01/app/oracle/product/26.0.0/dbhome_1/rdbms/admin/autoupgrade.jar \
  -config /u01/app/oracle/cfg/noncdb_to_pdb.cfg \
  -mode analyze

Review the generated HTML report located in /u01/app/oracle/cfg/logs/PROD19/100/prechecks/PROD19_prechecks.html. Resolve any FAILURE or WARNING items (such as stale optimizer stats or pending material views).

2. Execute Non-CDB Conversion (Deploy Mode)

Once pre-checks pass cleanly, launch AutoUpgrade in deploy mode to execute the non-CDB to PDB plugin conversion:

java -jar /u01/app/oracle/product/26.0.0/dbhome_1/rdbms/admin/autoupgrade.jar \
  -config /u01/app/oracle/cfg/noncdb_to_pdb.cfg \
  -mode deploy

AutoUpgrade automatically executes the following actions:

  1. Creates a Guaranteed Restore Point (AUTOUPGRADE_GRP_PROD19).
  2. Shuts down the non-CDB source database (PROD19) cleanly.
  3. Generates the PDB manifest XML file (/u01/app/oracle/cfg/logs/PROD19_describe.xml).
  4. Plugs PROD19 as PDB_PROD19 into target CDB26.
  5. Executes noncdb_to_pdb.sql to re-align dictionary views with CDB$ROOT.
  6. Opens PDB_PROD19 in READ WRITE mode and runs datapatch to align SQL patch levels.

🔍 Step 4: Post-Migration Validation & PDB Health Check

After AutoUpgrade completes with status FINISHED, connect to the target Container Database (CDB26) to verify PDB plugin status:

-- Connect to target CDB as SYSDBA
SQL> CONNECT / AS SYSDBA;

-- 1. Verify PDB open status and restricted mode
SELECT name, open_mode, restricted, total_size/1024/1024/1024 AS size_gb 
FROM v$pdbs 
WHERE name = 'PDB_PROD19';

-- Expected Output:
-- NAME         OPEN_MODE   RESTRICTED   SIZE_GB
-- ------------ ----------- ------------ ----------
-- PDB_PROD19   READ WRITE  NO           450.25

-- 2. Inspect PDB Plugin Violations
SELECT type, cause, message, status 
FROM pdb_plug_in_violations 
WHERE name = 'PDB_PROD19' AND status != 'RESOLVED';

-- Expected Output: 0 rows selected (or harmless WARNINGs for OPTION mismatch)

If pdb_plug_in_violations displays unresolved ERROR items (e.g. ORA-65126), execute utlrp.sql inside the PDB to recompile invalid objects:

ALTER SESSION SET CONTAINER = PDB_PROD19;
@?/rdbms/admin/utlrp.sql

📚 Official Documentation & Technical References


Need expert assistance migrating legacy Non-CDB databases to Multitenant PDBs or upgrading to Oracle 26ai? Contact our Database Specialists or explore our Enterprise Health Audits.

⚠️INFORMATIONAL & TECHNICAL ADVISORY DISCLAIMER

The diagnostic methodologies, commands, and runbooks provided on DBPros.Net are published for informational and educational purposes only. They do not constitute customized professional consulting advice. Operating engineers and DBAs are solely responsible for securing pre-flight backups (RMAN, VM snapshots, LVM clones), validating changes in non-production staging environments, and adhering to organizational change-control policies. All content, scripts, and runbooks are provided "AS IS" without warranty of any kind, and DBPros.Net assumes no liability for system downtime, database corruption, data loss, or operational disruption. For complete advisory limitations and legal terms, view our full Terms of Service & Advisory Disclaimer.