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:
CDBPRODPDBs inside:
PDB1,PDB2Backup location:
/backup/rman/
Target:
New CDB name:
CDBCLONEDatafiles 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_namemust match source CDB nameenable_pluggable_database=TRUEis 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.