Oracle Database の移行ツールとして Zero Downtime Migration というソフトウェアがあります。これを使ってみますやで。
彡(^)(^)
1. 参考ドキュメント
以下のマニュアル/ドキュメントを参照しました。
2 Zero Downtime Migrationソフトウェアの設定
https://docs.oracle.com/cd/G22032_01/zdmug/installing-zero-downtime-migration-software.html#GUID-A55FEDBA-236A-4006-91A5-6F28D100C5B2Oracle Support Document 2630479.1 [ZDM]: How To Install And Uninstall Zero Downtime Migration (ZDM) Software
https://support.oracle.com/epmos/faces/DocumentDisplay?id=2630479.1[TechNight #90-1] 本当に使える? ZDMの 新機能を実践検証してみた
https://speakerdeck.com/oracle4engineer/oracletechnight90-zdm?slide=61
2. 環境
OCI Compute に Oracle Linux 8 をセットアップしました。難しいところは無いので詳細は省略
2 oCPU, 32GB Memory, Boot Volume 200GB で作成しました。
3. ソフトウェアのダウンロード
ソフトウェアを下記URLからダウンロードします。
Oracle Software Delivery Cloue(旧eDelivery)に飛ばされます。
現時点(2025/10/30)でダウンロードできるのは V1051437-01.zip(21.5.2) となります。
My Oracle Support から最新版のパッチ(Patch 33509650)もダウンロードします。
4. パッケージのインストール
dnfコマンドで prerequirement となるパッケージをインストールします。
dnf install oraclelinux-developer-release-el8 libnsl perl unzip glibc-devel expect libaio ncurses-compat-libs ncurses-devvel numactl-libs openssl mlocate bind-utils
5. ディレクトリ作成とインストール
opcユーザーのホームディレクトリに zdmディレクトリを作成します。
mkdir zdm
作成したディレクトリに zipファイル をアップロードして解凍します。
cd zdm
unzip V1051437-01.zip
ディレクトリzdm21.5.2が作成されるので、ディレクトリ配下の zdminstall.sh を実行します。
以下のディレクトリ構成でインストールを実行します。
| baseディレクトリ | /home/opc/zdm/zdm_base |
|---|---|
| homeディレクトリ | /home/opc/zdm/zdm_home |
cd ./zdm21.5.2/
./zdminstall.sh setup oraclehome=/home/opc/zdm/zdm_home oraclebase=/home/opc/zdm/zdm_base ziploc=/home/opc/zdm/zdm21.5.2/zdm_home.zip -zdm
インストールログは以下の通りです。
[opc@ayu-prvcomp2 zdm]$ cd ./zdm21.5.2/
[opc@ayu-prvcomp2 zdm21.5.2]$ ./zdminstall.sh setup oraclehome=/home/opc/zdm/zdm_home oraclebase=/home/opc/zdm/zdm_base ziploc=/home/opc/zdm/zdm21.5.2/zdm_home.zip -zdm
ZDM kit home: /home/opc/zdm/zdm21.5.2
/home/opc/zdm/zdm21.5.2
---------------------------------------
Validating zip file...
---------------------------------------
25 07-24-2025 23:59 rhp/zdm.build
---------------------------------------
Unzipping shiphome to home...
---------------------------------------
Unzipping shiphome...
Shiphome unzipped successfully..
---------------------------------------
##### Performing GridHome Software Only Installation #####
---------------------------------------
Installation log location: /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/logs/runInstaller_1761835124.out
making dir /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf
---------------------------------------
Generating Preference file
---------------------------------------
/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/rhp.pref
Using port 8899 for MySQL
---------------------------------------
Generating Root Certificate
---------------------------------------
Cluster root certificate generated successfully.
---------------------------------------
Generating CA CERTS file
---------------------------------------
spawn /home/opc/zdm/zdm_home/bin/crskeytoolctl -copycacerts -filestore /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security
Enter JRE cacerts truststore password:
JRE cacerts copied to file [/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cacerts].
---------------------------------------
Generating nogi.enabled file
---------------------------------------
nogi.enabled file generated sucessfully
---------------------------------------
Generating standalone_config.properties file
---------------------------------------
Setting base folder permissions
---------------------------------------
Copying service script to bin folder in Oracle Home
label_date is: 240219.27
---------------------------------------
Storing to wallet
---------------------------------------
cacerts crskeytoolctl.log cwallet.sso cwallet.sso.lck
---------------------------------------
Generating random password
---------------------------------------
-rw-------. 1 opc opc 4349 Oct 30 14:38 /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cwallet.sso
-rw-------. 1 opc opc 4349 Oct 30 14:38 /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cwallet.sso
---------------------------------------
Extracting MySQL...
---------------------------------------
---------------------------------------
Setting up MySQL...
---------------------------------------
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysqladmin --defaults-file=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/my.cnf -u root -p ping
---------------------------------------
Storing to wallet
---------------------------------------
cacerts crskeytoolctl.log cwallet.sso cwallet.sso.lck
---------------------------------------
Generating random password
---------------------------------------
-rw-------. 1 opc opc 4469 Oct 30 14:39 /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cwallet.sso
-rw-------. 1 opc opc 4469 Oct 30 14:39 /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cwallet.sso
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysql --socket=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/mysql/metadata/mysql.sock -u root
---------------------------------------
Creating MySQL DB and user...
---------------------------------------
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysql --socket=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/mysql/metadata/mysql.sock -u root -p -e CREATE DATABASE IF NOT EXISTS GHSUSER21;
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysql --socket=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/mysql/metadata/mysql.sock -u root -p
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysql --socket=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/mysql/metadata/mysql.sock -u root -p -e GRANT ALTER, CREATE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, INDEX, INSERT, LOCK TABLES, REFERENCES, SELECT, SHOW VIEW, UPDATE ON GHSUSER21.* TO 'GHSUSER21'@'localhost';
current node is active node
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysqladmin --defaults-file=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/my.cnf -u root -p shutdown
---------------------------------------
Adding Certs to ZDM
---------------------------------------
ZDM service setup finished successfully...
ホームディレクトリのコマンドを実行してバージョンを確認します。
[opc@ayu-prvcomp2 zdm21.5.2]$ /home/opc/zdm/zdm_home/bin/zdmcli -build
version: 21.0.0.0.0
full version: "21.5.0"
patch version: "21.5.2"
label date: 240219.27
ZDM kit build date: Jul 24 2025 23:59:08 UTC
CPAT build version: 25.6.0
6. パッチ適用
パッチの zipファイルをアップロードして解凍します。
cd /home/opc/zdm
unzip p33509650_215200_Linux-x86-64.zip
現時点(2025/10/30)のパッチでは zdm21.5.4 が作成されるので、ディレクトリ配下の zdminstall.sh を実行します。オプションは update でパラメータとして home と ziploc を指定します。
※余談ですが元のバイナリ不要でこのパッチ単体でインストール可能なようです……。
cd ./zdm21.5.4/
./zdminstall.sh update oraclehome=/home/opc/zdm/zdm_home ziploc=/home/opc/zdm/zdm21.5.4/zdm_home.zip
ログは以下の通りです。
[opc@ayu-prvcomp2 zdm21.5.4]$ ./zdminstall.sh update oraclehome=/home/opc/zdm/zdm_home ziploc=/home/opc/zdm/zdm21.5.4/zdm_home.zip
ZDM kit home: /home/opc/zdm/zdm21.5.4
/home/opc/zdm/zdm21.5.4
---------------------------------------
Validating zip file...
---------------------------------------
25 10-09-2025 19:39 rhp/zdm.build
rhp home is: /home/opc/zdm/zdm_home
rhp base is: /home/opc/zdm/zdm_base
label_date is: 240219.27
label_date is: 240219.27
OLDHOME_MAJOR_VERSION: 21
OLDHOME_MINOR_VERSION: 4
OLDHOME_GRID_VERSION: 21
OLDHOME_LABEL_DATE: 240219.27
Attempting to back up the existing ZDM home and ZDM base ...
-rw-rw-r--. 1 opc opc 1134129472 Oct 30 14:50 /home/opc/zdm/zdm21.5.4/oldhome.zip
-rw-rw-r--. 1 opc opc 2491916 Oct 30 14:50 /home/opc/zdm/zdm21.5.4/oldbase.zip
Attempting to stop the service ...
This zdmservice is not running.
---------------------------------------
Running update steps ...
---------------------------------------
DB_TYPE is: MYSQL
update is: 1
cleanup is: 0
Executing detachHome...
Starting Oracle Universal Installer...
Checking swap space: must be greater than 500 MB. Actual 6143 MB Passed
The inventory pointer is located at /home/opc/zdm/zdm_home/oraInst.loc
You can find the log of this install session at:
/home/opc/zdm/zdm_home/inventory/logs/DetachHome2025-10-30_02-50-08PM.log
'DetachHome' was successful.
Deleting oracle home folder
Deinstall finished successfully
nogi.enabled file found. Setup was performed before.
Removing nogi.enabled file ...
---------------------------------------
Unzipping shiphome to home...
---------------------------------------
Unzipping shiphome...
Shiphome unzipped successfully..
---------------------------------------
##### Performing GridHome Software Only Installation #####
---------------------------------------
Installation log location: /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/logs/runInstaller_1761835827.out
---------------------------------------
Restoring Preference file
---------------------------------------
/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/rhp.pref
Set REPOS=MYSQL in rhp.pref
Set CONN_DESC=jdbc:mysql:\/\/localhost:8899\/ in rhp.pref
Set MODE= in rhp.pref
Set CHECKPOINT_DIR= in rhp.pref
Set SHARD= in rhp.pref
Set MYSQL_PORT= in rhp.pref
Set TRANSFERPORT_RANGE= in rhp.pref
Set ISSTAGGER_ENABLED= in rhp.pref
Set ALLOW_HTTP_REST=FALSE in rhp.pref
Set IDCS_CLIENT_ID= in rhp.pref
Set IDCS_CLIENT_TENANT= in rhp.pref
Set IDCS_TOKEN_CLAIM_SCOPE= in rhp.pref
Set IDCS_SERVICE_URL= in rhp.pref
Set IDCS_CLIENT_SECRET_WALLET= in rhp.pref
Resetting default MySQL port
Editing MySQL port...
Set port=8899 in my.cnf
Set \1jdbc:mysql:\/\/localhost:8899\/ in rhp.pref
---------------------------------------
Generating Root Certificate
---------------------------------------
Cluster root certificate generated successfully.
---------------------------------------
Generating CA CERTS file
---------------------------------------
spawn /home/opc/zdm/zdm_home/bin/crskeytoolctl -copycacerts -filestore /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security
Enter JRE cacerts truststore password:
JRE cacerts copied to file [/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security/cacerts].
---------------------------------------
Generating nogi.enabled file
---------------------------------------
nogi.enabled file generated sucessfully
---------------------------------------
Generating standalone_config.properties file
---------------------------------------
Setting base folder permissions
---------------------------------------
Copying service script to bin folder in Oracle Home
label_date is: 240219.31
Updating NOGI home ...
---------------------------------------
Extracting MySQL...
---------------------------------------
current node is active node
---------------------------------------
Adding Certs to ZDM
---------------------------------------
ZDM service update finished successfully...
バージョンを確認します。
[opc@ayu-prvcomp2 zdm21.5.4]$ /home/opc/zdm/zdm_home/bin/zdmcli -build
version: 21.0.0.0.0
full version: "21.5.0"
patch version: "21.5.4"
label date: 240219.31
ZDM kit build date: Oct 09 2025 19:39:31 UTC
CPAT build version: 25.9.0
[opc@ayu-prvcomp2 zdm21.5.4]$
21.5.4 にアップデートされていることが確認できました。
7. 起動/停止
まず ZDM を起動します。
/home/opc/zdm/zdm_home/bin/zdmservice start
起動ログは以下の通りです。
[opc@ayu-prvcomp2 zdm21.5.4]$ /home/opc/zdm/zdm_home/bin/zdmservice start
No zdm instance detected, starting zdmservice
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysqladmin --defaults-file=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/my.cnf -u root -p ping
WARNING: oracle.jwc.jmx does not exist in the configuration file. It will be TRUE by default.
[jwcctl debug] Environment ready to start JWC
[jwcctl debug] Return code of initialization: [0]
[jwcctl debug] ... BEGIN_DEBUG [Action= start] ...
Start JWC
[jwcctl debug] Loading configuration file: /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/jwc.properties
[jwcctl debug] oracle.jmx.login.credstore = CRSCRED
[jwcctl debug] oracle.jmx.login.args = DOMAIN=rhp CACHE_ENABLED=true CACHE_EXPIRATION=180
[jwcctl debug] oracle.rmi.url = service:jmx:rmi://{0}:{1,number,#}/jndi/rmi://{0}:{1,number,#}/jmxrmi
[jwcctl debug] oracle.http.url = http://{0}:{1,number,#}/rhp/gridhome
[jwcctl debug] oracle.jwc.tls.clientauth = false
[jwcctl debug] oracle.jwc.tls.rmi.clientfactory = RELOADABLE
[jwcctl debug] oracle.jwc.lifecycle.start.log.fileName = JWCStartEvent.log
[jwcctl debug] oracle.jwc.http.connector.ssl.protocols = TLSv1.2,TLSv1.3
[jwcctl debug] Get JWC PIDs
[jwcctl debug] Done Getting JWC PIDs
[jwcctl debug] ... JWC containers not found ...
[jwcctl debug] Start command:-server -Xms2048M -Xmx4096M -Djava.awt.headless=true -Ddisable.checkForUpdate=true -Djava.util.logging.config.file=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -DTRACING.ENABLED=true -DTRACING.LEVEL=2 -Doracle.wlm.dbwlmlogger.logging.level=FINEST -Duse_scan_IP=true -Djava.rmi.server.hostname=localhost -Doracle.http.port=8898 -Doracle.jmx.port=8897 -Doracle.tls.enabled=false -Doracle.jwc.tls.http.enabled=false -Doracle.rhp.storagebase=/home/opc/zdm/zdm_base -Djava.security.manager -Djava.security.policy=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/catalina.policy -Djava.security.egd=file:/dev/urandom -Doracle.jwc.wallet.path=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security -Doracle.jmx.login.credstore=WALLET -Doracle.rest.enabled=false -Doracle.jmx.enabled=true -Dcatalina.home=/home/opc/zdm/zdm_home/tomcat -Dcatalina.base=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp -Djava.io.tmpdir=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/temp -Doracle.home=/home/opc/zdm/zdm_home -Doracle.jwc.mode=STANDALONE -classpath /home/opc/zdm/zdm_home/jlib/cryptoj.jar:/home/opc/zdm/zdm_home/jlib/oraclepki.jar:/home/opc/zdm/zdm_home/jlib/osdt_core.jar:/home/opc/zdm/zdm_home/jlib/osdt_cert.jar:/home/opc/zdm/zdm_home/tomcat/lib/tomcat-juli.jar:/home/opc/zdm/zdm_home/tomcat/lib/bootstrap.jar:/home/opc/zdm/zdm_home/jlib/jwc-logging.jar org.apache.catalina.startup.Bootstrap start
[jwcctl debug] Get JWC PIDs
[jwcctl debug] Done Getting JWC PIDs
[jwcctl debug] ... JWC Container (pid=92358) ...
[jwcctl debug] ... JWC Container running (pid=92358) ...
[jwcctl debug] Check command:-Djava.net.preferIPv6Addresses=true -Dcatalina.base=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp -Doracle.wlm.dbwlmlogger.logging.level=FINEST -Doracle.jwc.client.logger.file.name=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/logs/jwc_checker_stdout_err_%g.log -Doracle.jwc.client.logger.file.number=10 -Doracle.jwc.client.logger.file.size=1048576 -Doracle.jwc.wallet.path=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security -Doracle.jmx.login.credstore=WALLET -Doracle.tls.enabled=false -Doracle.jwc.tls.http.enabled=false -classpath /home/opc/zdm/zdm_home/jlib/jwc-logging.jar:/home/opc/zdm/zdm_home/jlib/jwc-security.jar:/home/opc/zdm/zdm_home/jlib/jwc-client.jar:/home/opc/zdm/zdm_home/jlib/jwc-cred.jar:/home/opc/zdm/zdm_home/jlib/srvm.jar:/home/opc/zdm/zdm_home/jlib/srvmhas.jar:/home/opc/zdm/zdm_home/jlib/cryptoj.jar:/home/opc/zdm/zdm_home/jlib/oraclepki.jar:/home/opc/zdm/zdm_home/jlib/osdt_core.jar:/home/opc/zdm/zdm_home/jlib/osdt_cert.jar:/home/opc/zdm/zdm_home/tomcat/lib/tomcat-juli.jar oracle.cluster.jwc.tomcat.client.JWCChecker localhost 8898 -1
[jwcctl debug] ... JWC Container is ready ...
[jwcctl debug] ... START - Return code = 0 ...
[jwcctl debug] ... END_DEBUG [Action=start] ...
[jwcctl debug] Return code of AGENT: [0]
Return code is 0
Server started successfully.
ステータスを確認します。
/home/opc/zdm/zdm_home/bin/zdmservice status
ステータス確認ログは以下の通りです。
[opc@ayu-prvcomp2 zdm21.5.4]$ /home/opc/zdm/zdm_home/bin/zdmservice status
---------------------------------------
Service Status
---------------------------------------
Running: true
Tranferport:
Conn String: jdbc:mysql://localhost:8899/
RMI port: 8897
HTTP port: 8898
Wallet path: /home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security
停止は下記コマンドになります。
/home/opc/zdm/zdm_home/bin/zdmservice stop
停止ログは以下の通りです。
[opc@ayu-prvcomp2 zdm21.5.4]$ /home/opc/zdm/zdm_home/bin/zdmservice stop
spawn /home/opc/zdm/zdm_home/mysql/server/bin/mysqladmin --defaults-file=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/conf/my.cnf -u root -p shutdown
WARNING: oracle.jwc.jmx does not exist in the configuration file. It will be TRUE by default.
[jwcctl debug] Environment ready to start JWC
[jwcctl debug] Return code of initialization: [0]
[jwcctl debug] ... BEGIN_DEBUG [Action= stop] ...
Stop JWC
[jwcctl debug] Get JWC PIDs
[jwcctl debug] Done Getting JWC PIDs
[jwcctl debug] ... JWC Container (pid=92358) ...
[jwcctl debug] Stop command:-Dcatalina.base=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp -Doracle.tls.enabled=false -Doracle.wlm.dbwlmlogger.logging.level=FINEST -Doracle.jwc.client.logger.file.name=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/rhp/logs/jwc_shutter_stdout_err_%g.log -Doracle.jwc.client.logger.file.number=10 -Doracle.jwc.client.logger.file.size=1048576 -Doracle.jwc.wallet.path=/home/opc/zdm/zdm_base/crsdata/ayu-prvcomp2/security -Doracle.jmx.login.credstore=WALLET -classpath /home/opc/zdm/zdm_home/jlib/jwc-logging.jar:/home/opc/zdm/zdm_home/jlib/jwc-client.jar:/home/opc/zdm/zdm_home/jlib/jwc-security.jar:/home/opc/zdm/zdm_home/jdk/lib/tools.jar:/home/opc/zdm/zdm_home/tomcat/lib/tomcat-juli.jar oracle.cluster.jwc.tomcat.client.ShutdownContainer 92358
[jwcctl debug] Get JWC shutter PIDs
[jwcctl debug] Done getting JWC shutter PIDs
[jwcctl debug] ... JWC shutter command (pid=92635) ...
[jwcctl debug] ... Initial Check - JWC Shutter JVM waiting (pid=92635) ...
[jwcctl debug] ... Sleep for 1 seconds ...
[jwcctl debug] ... Iteration 0 Check for JWC Shutter ...
[jwcctl debug] Get JWC shutter PIDs
[jwcctl debug] Done getting JWC shutter PIDs
[jwcctl debug] ... JWC shutter command not found ...
[jwcctl debug] ... Iteration 0 Check for JWC Container ...
[jwcctl debug] Get JWC PIDs
[jwcctl debug] Done Getting JWC PIDs
[jwcctl debug] ... JWC containers not found ...
[jwcctl debug] ... JWC Container is stopped ...
[jwcctl debug] ... STOP - Return code = 0 ...
[jwcctl debug] ... END_DEBUG [Action=stop] ...
[jwcctl debug] Return code of AGENT: [0]
Return code is 0
zdmservice stopped successfully.
8. まとめ
まずはインストール編の完了、次回は実際に Oracle Database のデータを移行するところをやってみます。
彡(^)(^)



