Zero Downtime Migration (ZDM) is Oracle’s orchestration engine for physical and logical database migrations into OCI — it doesn’t move data itself so much as drive Data Guard, RMAN, Data Pump, and GoldenGate through a coordinated migration workflow. Before any of that, though, ZDM needs its own service host set up correctly. This walks through that installation end to end.
Prerequisites
ZDM host placement. The ZDM service can run on an OCI compute instance, an on-premises server, or a VM in another cloud — the only hard requirement is network reachability to both the source and target database hosts. It does not need to sit on either database server itself, and in most real deployments it shouldn’t.
Supported operating systems:
- Oracle Linux 8
- Oracle Linux 9
- Red Hat Enterprise Linux 8
Storage: at least 100 GB free — ZDM stages migration artifacts, logs, and (for physical migrations) intermediate backup metadata under ZDM_BASE.
Required packages (Oracle Linux 8/9):
sudo dnf install -y unzip expect glibc-devel libnsl ncurses-compat-libs libaio \
oraclelinux-developer-release-el8
Dedicated OS user and group. Don’t install as oracle or root — ZDM should run under its own service account:
sudo groupadd zdm
sudo useradd -g zdm zdmuser
sudo passwd zdmuser
Base and home directories:
sudo mkdir -p /u01/zdm/zdmhome
sudo mkdir -p /u01/zdm/zdmbase
sudo chown -R zdmuser:zdm /u01/zdm
Environment variables. Add to zdmuser’s shell profile (~/.bashrc):
export ZDM_BASE=/u01/zdm/zdmbase
export ZDM_HOME=/u01/zdm/zdmhome
export PATH=$PATH:$ZDM_HOME/bin
Perl. ZDM’s install script is Perl-driven — most Oracle Linux minimal installs already carry a compatible Perl, but confirm with perl -v before proceeding. Sources on 11.2.0.4 additionally need Perl patched to at least 5.28.2.
Installation
1. Download the Software
Get the current ZDM release from the Zero Downtime Migration downloads page. You’ll need a My Oracle Support account.
2. Stage the Software
Copy the zip to a directory owned by zdmuser:
mkdir -p /u01/zdm/zdminstall
# transfer the zip here, e.g. /u01/zdm/zdminstall/zdm21.6.zip
su - zdmuser
cd /u01/zdm/zdminstall
unzip zdm21.6.zip
3. Run the Install Script
Re-verify the environment variables are set correctly before running the installer — a mismatched ZDM_HOME/ZDM_BASE here is the most common install-time mistake:
set | grep -i ZDM_
echo $PATH
Then run the setup:
./zdminstall.sh setup oraclehome=$ZDM_HOME oraclebase=$ZDM_BASE ziploc=$PWD/zdm_home.zip
ziploc points at the inner software zip bundled inside the download, not the outer download zip itself — check the extracted directory contents if the path isn’t obvious. The script prints messages about root scripts at the end; for a standalone ZDM host these can be ignored unless your organisation’s install standard says otherwise.
4. Start the Service
$ZDM_HOME/bin/zdmservice start
Verifying the Installation
Check the service is actually up:
$ZDM_HOME/bin/zdmservice status
---------------------------------------
Service Status
---------------------------------------
Running: true
Tranferport:
Conn String: jdbc:mysql://localhost:8900/
RMI port: 8897
HTTP port: 8898
Wallet path: /u01/zdm/zdmbase/crsdata/zdmhost/security
And confirm the version matches what you expect to have installed:
$ZDM_HOME/bin/zdmcli -build
version: 21.0.0.0.0
full version: "21.6.0"
patch version: "21.6.0"
label date: 260112.10
ZDM kit build date: Feb 02 2026 14:11:03 UTC
CPAT build version: 26.1.0
What’s Next
A fresh ZDM install carries whatever patch level shipped with that base release — in practice you’ll usually apply the latest one-off patch immediately after install, which is covered separately. Before running any real migration job, also set up wallet-based credential storage so ZDM jobs don’t sit waiting on interactive password prompts, especially if they’re kicked off from a scheduler rather than a terminal.