ZDM vs Traditional Rapid Clone — Which to Use

For the database tier, you have two options when moving EBS 12.2 to OCI:

ZDM (Zero Downtime Migration): Best for databases over 2TB or when the maintenance window is under 4 hours. ZDM automates Data Guard setup, redo transport, and the switchover. It requires a dedicated ZDM service host, OCI CLI configured on both source and target, and a more complex setup that takes a day to prepare.

RMAN to Object Storage: Right for databases under 500GB, for teams doing their first OCI migration, or when you have a 6–12 hour maintenance window. Full control, no extra software, same process as any RMAN restore.

For the application tier, use rapid clone (adpreclone + adcfgclone) in both cases. ZDM handles the database only.

OCI Prerequisites Specific to EBS

VCN and Subnet Design

EBS on OCI requires three subnets at minimum:

| Subnet | Type | Key Inbound Ports |
|--------|------|-------------------|
| DB subnet | Private | 1521 (listener), 1526 (RAC secondary) |
| App tier subnet | Private | 7001–7002 (WLS), 8000–8021 (EBS HTTP), 1647 (apps listener), 6701 (OPMN) |
| Load balancer subnet | Public | 443, 80 |

Security list rules must allow the app tier subnet to reach the DB subnet on port 1521. A common mistake is creating the DB system first and adding the security list rule only after the app tier is already deployed and failing to connect.

Shape Selection

Object Storage Bucket

Create the bucket before starting the RMAN backup:

# Create bucket in the correct compartment
oci os bucket create   --compartment-id <compartment_ocid>   --name ebs-migration-rman   --namespace <namespace>

DB Tier Migration — RMAN to Object Storage

Install and Configure OCI CLI on Source

# Install OCI CLI
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

Configure credentials

oci setup config

Enter: user OCID, tenancy OCID, region, path to API signing key

Run RMAN Backup and Upload

# Take a compressed backup to local staging area
rman target / << RMAN
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO COMPRESSED BACKUPSET;
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG
  FORMAT '/backup/rman/ebs_%U.bkp';
RMAN

Upload to Object Storage (parallel, 10 concurrent uploads)

oci os object bulk-upload --bucket-name ebs-migration-rman --src-dir /backup/rman --parallel-upload-count 10 --namespace <namespace>

Restore on the OCI DB System

# Download backup from Object Storage to OCI DB System
oci os object bulk-download   --bucket-name ebs-migration-rman   --dest-dir /backup/rman   --parallel-download-count 10   --namespace <namespace>

Restore and recover

rman target / << RMAN RESTORE DATABASE FROM '/backup/rman/'; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS; RMAN
-- Verify the restored database
SELECT name, db_unique_name, open_mode, database_role FROM v$database;
-- open_mode should be READ WRITE

App Tier Migration

Prepare Source App Tier for Clone

# On source DB tier (as oracle user)
export ORACLE_SID=EBSPROD
perl $ORACLE_HOME/appsutil/scripts/${ORACLE_SID}_$(hostname)/adpreclone.pl dbTier

On source app tier (as applmgr user)

source /u01/install/APPS/EBSapps.env run perl $AD_TOP/bin/adpreclone.pl appsTier

Archive and Transfer to OCI

# Create archive (skip logs and temp files to reduce size)
tar -czf /backup/apps_$(date +%Y%m%d).tar.gz   --exclude='.log'   --exclude='.out'   --exclude='$APPL_TOP/*/log'   $APPL_TOP $INST_TOP $COMMON_TOP

Upload to Object Storage

oci os object put --bucket-name ebs-migration-rman --file /backup/apps_$(date +%Y%m%d).tar.gz --name apps_$(date +%Y%m%d).tar.gz

On OCI compute: download and extract

oci os object get --bucket-name ebs-migration-rman --name apps_$(date +%Y%m%d).tar.gz --file /backup/apps.tar.gz

tar -xzf /backup/apps.tar.gz -C /

Run adcfgclone on OCI Compute

cd $COMMON_TOP/clone/bin
perl adcfgclone.pl appsTier

Runs 30–60 minutes

Prompts for new app tier hostname, DB connection string, ports

Post-Clone Autoconfig for OCI Hostnames

Every EBS service uses hostnames pulled from the context file. After a clone to OCI, all the old source hostnames need to be replaced.

Update the Context File

Open $CONTEXT_FILE (found by running echo $CONTEXT_FILE as applmgr) and update:

Then run autoconfig:
perl $AD_TOP/bin/adautocfg.pl

Update FND_NODES

-- Check what node names are registered
SELECT node_name, server_address, support_cp, support_web, support_admin
FROM fnd_nodes ORDER BY node_name;

-- Update app tier node to the new OCI compute hostname
UPDATE fnd_nodes
SET node_name = UPPER('<new_oci_compute_hostname>'),
server_address = '<new_oci_private_ip>'
WHERE node_name = UPPER('<old_source_hostname>');
COMMIT;

Bounce All Services and Verify

$ADMIN_SCRIPTS_HOME/adstopall.sh
$ADMIN_SCRIPTS_HOME/adstartall.sh

Verify EBS login page responds

curl -sk https://<new_hostname>/OA_HTML/AppsLocalLogin.jsp | grep -i "login|oracle"

Common Post-Clone Failures on OCI

SSL Certificate Errors in OHS

The old SSL wallet references the source hostname. After cloning, regenerate the wallet using Oracle Wallet Manager (owm), or set s_ssl_enabled to false in the context file and re-run autoconfig for a plain HTTP test environment.

FNDSM Not Starting

FNDSM startup failure after autoconfig almost always means the apps listener hostname in tnsnames.ora still references the old hostname. Check:

grep -i $(hostname) $TNS_ADMIN/tnsnames.ora

Should show the new OCI hostname; if not, re-run autoconfig after

verifying s_dbhost and s_appservnode in the context file

Reports Servlet 404

Check s_reportsserver in the context file — it must match the new OCI compute hostname. Update it, re-run autoconfig, and bounce the Reports Server in the WebLogic console.

WebLogic Managed Servers Not Starting

OCI Security Lists block all inbound ports by default. After migration, verify that the following ports are open within the app tier Security List: 7001 (AdminServer), 7201–7210 (managed servers), 5556 (Node Manager). Without Node Manager connectivity, the AdminServer cannot start managed servers remotely.