Oracle ZDM Instant Deploy

Introduction

Oracle ZDM 26.1 introduced Instant Deploy, which allows you to use the ZDM software on the source or target database host without a software installation.

This blog post provides an example of using Instant Deploy on the source database host for a Physical Online migration. Since the focus is on Instant Deploy, this blog post does not cover the prerequisites for the Physical Online migration.

The Environment

For demonstration purposes, I will be using OCI Oracle Base Database Service with Oracle AI Database 26ai, version 23.26.2.0.0.

  • Source: hostname: hostsrc, IP: 10.10.0.214, DB name: ORADB, DB unique name: ORADB_src
  • Target: hostname: hosttgt, IP: 10.10.0.45, DB name: ORADB, DB unique name: ORADB_tgt

The Migration

Step 1: Download the latest ZDM main release version from the Oracle ZDM product page (version 26.1). For any following patching (e.g., 26.2), check My Oracle Support (MOS) by searching for patch number 33509650 in the “Patches & Updates” tab.

Step 2. Copy the V1055491-01.zip file (1,125,684,981 bytes) to a directory with sufficient free storage. In this case:

[opc@hostsrc ~]$ sudo mkdir /opt/opc/zdm/
[opc@hostsrc ~]$ sudo chown opc:opc /opt/opc/zdm/
#copy to this directory via WinSCP

Unzip the file:

[opc@hostsrc ~]$ cd /opt/opc/zdm/
[opc@hostsrc zdm]$ unzip V1055491-01.zip

This will create the zdm26.1 sub directory. Hence, the ZDM software is in the /opt/opc/zdm/zdm26.1 directory.

Step 3: Exchange the source and target host names in the /etc/hosts files.

Add the source hostname and IP information to the /etc/hosts file of the target host.

#on source host
[opc@hostsrc ~]$ cat /etc/hosts
10.10.0.214  hostsrc.subnetpublic.vcnfra.oraclevcn.com  hostsrc
10.10.0.214  hostsrc-scan.subnetpublic.vcnfra.oraclevcn.com  hostsrc-scan
#on target host
[opc@hosttgt ~]$ sudo vi /etc/hosts

Add the target hostname and IP information to the /etc/hosts file of the source host.

#on target host
[opc@hosttgt ~]$ cat /etc/hosts
10.10.0.45  hosttgt.subnetpublic.vcnfra.oraclevcn.com  hosttgt
10.10.0.45  hosttgt-scan.subnetpublic.vcnfra.oraclevcn.com  hosttgt-scan
#on source host
[opc@hostsrc ~]$ sudo vi /etc/hosts

Step 4: Copy the SSH public key for your OS user (in this case, opc) on the source host and add it to the authorized_keys file for the OS user (in this case, also opc) on the target host.

#on source host
[opc@hostsrc ~]$ cat .ssh/id_rsa.pub
#on target host
[opc@hosttgt ~]$ vi .ssh/authorized_keys

Test the SSH connectivity from the source to the target database host:

[opc@hostsrc ~]$ ssh opc@hosttgt
Last login: Mon Jun  1 12:18:29 2026 from 10.10.0.214
[opc@hosttgt ~]$

Verify that TTY is disabled for the SSH-privileged user. If TTY is disabled, the following command returns the date from the remote host without any errors:

[opc@hostsrc ~]$ ssh -i /home/opc/.ssh/id_rsa opc@hosttgt "/usr/bin/sudo /bin/sh -c date"
Mon Jun  1 12:20:02 UTC 2026

Step 5: Evaluate the migration. On the source host:

[opc@hostsrc ~]$ /opt/opc/zdm/zdm26.1/zdmcli migrate database -sourcedb ORADB_src -targetdb ORADB_tgt -targetnode hosttgt -eval

Performing one-time ZDM binary setup... This may take a few minutes.
ZDM binary setup completed successfully.
Enter source database ORADB_src SYS password:
Migration evaluation job started
Result file path: /opt/opc/zdm/zdm26.1/zdmbase/chkbase/scheduled/job-1-<date>.log
======================JOB_EXECUTION_DETAILS_START======================
...
####################################################################
hostsrc: <date> : Oracle ZDM ONLINE PHYSICAL evaluation job completed
hostsrc: <date> : Job duration: 1 minutes and 15 seconds

The output file path contains the job id, in this case 1, that can be used to query the job status afterward as well if needed:

[opc@hostsrc ~]$ /opt/opc/zdm/zdm26.1/zdmcli query job -jobid 1
Job ID: 1
User: opc
Job Type: "EVAL"
Scheduled job command: "zdmcli migrate database -sourcedb ORADB_src -targetdb ORADB_tgt -targetnode hosttgt -eval"
Current status: SUCCEEDED
Result file path: "/opt/opc/zdm/zdm26.1/zdmbase/chkbase/scheduled/job-1-<date>.log"
Job execution elapsed time: 1 minutes 15 seconds
ZDM_GET_SRC_INFO ........... PRECHECK_PASSED
ZDM_GET_TGT_INFO ........... PRECHECK_PASSED
ZDM_PRECHECKS_SRC .......... PRECHECK_PASSED
ZDM_PRECHECKS_TGT .......... PRECHECK_PASSED
ZDM_SETUP_SRC .............. PRECHECK_PASSED
ZDM_SETUP_TGT .............. PRECHECK_PASSED
ZDM_PREUSERACTIONS ......... PRECHECK_PASSED
ZDM_PREUSERACTIONS_TGT ..... PRECHECK_PASSED
ZDM_VALIDATE_SRC ........... PRECHECK_PASSED
ZDM_VALIDATE_TGT ........... PRECHECK_PASSED
ZDM_POSTUSERACTIONS ........ PRECHECK_PASSED
ZDM_POSTUSERACTIONS_TGT .... PRECHECK_PASSED
ZDM_CLEANUP_SRC ............ PRECHECK_PASSED
ZDM_CLEANUP_TGT ............ PRECHECK_PASSED

Step 6: Migrate. On the source host:

[opc@hostsrc ~]$ /opt/opc/zdm/zdm26.1/zdmcli migrate database -sourcedb ORADB_src -targetdb ORADB_tgt -targetnode hosttgt
Enter source database ORADB_src SYS password:
Migration job started ....
Result file path: /opt/opc/zdm/zdm26.1/zdmbase/chkbase/scheduled/job-2-<date>.log
======================JOB_EXECUTION_DETAILS_START======================
...
####################################################################
hostsrc: 2026-06-01T13:05:19.398Z : Oracle ZDM ONLINE PHYSICAL migration completed
hostsrc: 2026-06-01T13:05:19.399Z : Job duration: 16 minutes and 55 seconds

The output file path contains the job id, in this case 2, that can be used to query the job status afterward as well if needed:

Job ID: 4
User: opc
Job Type: "MIGRATE"
Scheduled job command: "zdmcli migrate database -sourcedb ORADB_src -targetdb ORADB_tgt -targetnode hosttgt"
Current status: SUCCEEDED
Result file path: "/opt/opc/zdm/zdm26.1/zdmbase/chkbase/scheduled/job-2-<date>.log"
Job execution elapsed time: 16 minutes 55 seconds
ZDM_GET_SRC_INFO ................ COMPLETED
ZDM_GET_TGT_INFO ................ COMPLETED
ZDM_PRECHECKS_SRC ............... COMPLETED
ZDM_PRECHECKS_TGT ............... COMPLETED
ZDM_SETUP_SRC ................... COMPLETED
ZDM_SETUP_TGT ................... COMPLETED
ZDM_PREUSERACTIONS .............. COMPLETED
ZDM_PREUSERACTIONS_TGT .......... COMPLETED
ZDM_VALIDATE_SRC ................ COMPLETED
ZDM_VALIDATE_TGT ................ COMPLETED
ZDM_DISCOVER_SRC ................ COMPLETED
ZDM_COPYFILES ................... COMPLETED
ZDM_PREPARE_TGT ................. COMPLETED
ZDM_SETUP_TDE_TGT ............... COMPLETED
ZDM_RESTORE_TGT ................. COMPLETED
ZDM_RECOVER_TGT ................. COMPLETED
ZDM_FINALIZE_TGT ................ COMPLETED
ZDM_CONFIGURE_DG_SRC ............ COMPLETED
ZDM_SWITCHOVER_SRC .............. COMPLETED
ZDM_SWITCHOVER_TGT .............. COMPLETED
ZDM_POST_DATABASE_OPEN_TGT ...... COMPLETED
ZDM_DATAPATCH_TGT ............... COMPLETED
ZDM_UPDATE_PLATFORM_METADATA .... COMPLETED
ZDM_POST_MIGRATE_TGT ............ COMPLETED
ZDM_POSTUSERACTIONS ............. COMPLETED
ZDM_POSTUSERACTIONS_TGT ......... COMPLETED
ZDM_CLEANUP_SRC ................. COMPLETED
ZDM_CLEANUP_TGT ................. COMPLETED

Step 7: Confirm the Instant Deploy mode is used (ZDM service is NOT running and the mode is Serverless).

[opc@hostsrc ~]$ /opt/opc/zdm/zdm26.1/zdmhome/bin/zdmservice status
---------------------------------------
        Service Status
---------------------------------------
 Running:       false
 Tranferport:
 Conn String:   jdbc:derby:/opt/opc/zdm/zdm26.1/zdmbase/derbyRepo;create=true
 Repo Path:     /opt/opc/zdm/zdm26.1/zdmbase/derbyRepo
 SSH port:      22
 Wallet path:   /opt/opc/zdm/zdm26.1/zdmbase/crsdata/hostsrc/security
 Mode :         Serverless

Further Reading

Would you like to get notified when the next post is published?