Tuesday, February 17, 2026

Step by Step Clone 19c DB from source to target

Step by Step Manually Clone 19c DB from source to target

Environment:

  • Oracle 19c

  • Multitenant (CDB + PDBs)

  • Different server

  • Filesystem (no ASM)

  • Using RMAN full backup (not active duplicate)

Below is the correct production-grade procedure.


🔷 Architecture Assumption

Source:

  • CDB name: CDBPROD

  • PDBs inside: PDB1, PDB2

  • Backup location: /backup/rman/

Target:

  • New CDB name: CDBCLONE

  • Datafiles will go to /u02/oradata/CDBCLONE/


✅ STEP 1 — Take Full Backup on Source

On source:

export ORACLE_SID=CDBPROD
rman target /
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
BACKUP CURRENT CONTROLFILE;

Confirm:

LIST BACKUP SUMMARY;

✅ STEP 2 — Copy Backup to Target

Copy all backup pieces + archivelogs:

scp -r /backup/rman/* oracle@target:/backup/rman/

Ensure permission:

chown -R oracle:oinstall /backup/rman

✅ STEP 3 — Prepare Target Server

On target server:

Set environment

export ORACLE_SID=CDBCLONE

Create password file

orapwd file=$ORACLE_HOME/dbs/orapwCDBCLONE password=oracle

✅ STEP 4 — Create Minimal PFILE (Important for CDB)

Create /tmp/initCDBCLONE.ora

db_name=CDBPROD
db_unique_name=CDBCLONE
enable_pluggable_database=TRUE

control_files='/u02/oradata/CDBCLONE/control01.ctl'

db_file_name_convert=
'/u02/oradata/CDBPROD/','/u02/oradata/CDBCLONE/'

log_file_name_convert=
'/u02/oradata/CDBPROD/','/u02/oradata/CDBCLONE/'

🔎 Critical:

  • db_name must match source CDB name

  • enable_pluggable_database=TRUE is mandatory


✅ STEP 5 — Start Instance NOMOUNT

sqlplus / as sysdba
startup nomount pfile='/tmp/initCDBCLONE.ora';

✅ STEP 6 — Restore Controlfile

rman target /
RESTORE CONTROLFILE FROM '/backup/rman/<controlfile_piece>.bkp';
ALTER DATABASE MOUNT;

✅ STEP 7 — Catalog Backup Pieces

CATALOG START WITH '/backup/rman/';

Verify:

LIST BACKUP;

✅ STEP 8 — Restore CDB (All PDBs Included)

RUN {
  SET NEWNAME FOR DATABASE TO '/u02/oradata/CDBCLONE/%b';
  RESTORE DATABASE;
  SWITCH DATAFILE ALL;
}

This restores:

  • CDB$ROOT

  • PDB$SEED

  • All PDBs automatically


✅ STEP 9 — Recover Database

RECOVER DATABASE;

Archivelogs will be applied automatically.


✅ STEP 10 — Open with RESETLOGS

ALTER DATABASE OPEN RESETLOGS;

Now entire CDB + PDBs should open.


✅ STEP 11 — Verify Multitenant

select name, open_mode from v$pdbs;
select name, cdb from v$database;

If PDBs are MOUNTED:

alter pluggable database all open;

✅ STEP 12 — Change DBID & DBNAME (Recommended)

To avoid backup conflicts:

nid target=/

Change name to:

CDBCLONE

Restart database.


✅ STEP 13 — Recompile Invalid Objects

@?/rdbms/admin/utlrp.sql

🔎 Important Multitenant Notes

✔ You do NOT restore PDB separately
✔ Entire CDB is restored as one unit
✔ All PDBs come automatically
enable_pluggable_database=TRUE is mandatory
✔ Backup must be taken from CDB root


🚀 Cleaner Method (Recommended in 19c)

Instead of manual restore:

DUPLICATE DATABASE TO CDBCLONE
  BACKUP LOCATION '/backup/rman/'
  NOFILENAMECHECK;

For multitenant on different server, this is the safest and least error-prone method.