みなさん、こんにちは
既存環境からクラウドへの移行(クラウドリフト)を検討する際、課題の1つとして挙げられるのが「データ移行に伴うDB停止時間の最小化」です。
その最適解の一つとなるのが、Oracle社から提供されているソリューション「Zero Downtime Migration (ZDM) 」です。
現在、ZDMでは物理移行、論理移行およびハイブリッドなど要件に合わせて柔軟に移行方式を選択することが可能です。
本記事では、その中でも特にOracle GoldenGateを利用した「論理オンライン方式」に焦点を当てて、実際の検証結果に基づいた移行のステップを解説します。
※ZDMの全体像や基本機能については、「前回の記事:Zero Downtime Migration ~概要編~」をあわせて参照ください。
【概要】検証環境のサーバ構成
本検証では、ZDMの「論理オンライン方式」を用いたデータ移行を検証するため、計4台のサーバで構成される環境を構築しました。
クラウドリフトのシナリオに沿って、ソースDBはオンプレミス、ターゲットDBはOCI (Oracle Cloud Infrastructure)としています。
- 【オンプレ】ZDMサービス・ホスト:データ移行プロセス全体を管理
- 【オンプレ】ソースDBサーバ:データ移行元環境
- 【OCI】ターゲットDBサーバ:データ移行先環境
- 【OCI】GoldenGate Hubサーバ:オンライン論理移行の要となる変更データの抽出・反映を管理
【構築】ZDMサービス・ホスト
1.ZDM用ユーザおよびグループの作成
以下のコマンドで、ZDM用ユーザ「zdmuser」およびZDM用グループ「zdm」を作成します。
--- ZDM用ユーザおよびグループの作成 ---
root# groupadd zdm
root# useradd -g zdm zdmuser
root# id zdmuser
uid=1001(zdmuser) gid=1001(zdm) groups=1001(zdm)
2.ZDM用ディレクトリの作成
以下のコマンドで、ZDM用ディレクトリを作成します。
--- ZDM用ディレクトリの作成 ---
root# mkdir -p /home/zdmuser/zdminstall
root# mkdir /home/zdmuser/zdmhome
root# mkdir /home/zdmuser/zdmbase
root# chown -R zdmuser:zdm /home/zdmuser/
--- 作成確認 ---
root# ls -lR /home/zdmuser/
--- 以下、出力例 ---
/home/zdmuser/:
合計 0
drwxr-xr-x. 2 zdmuser zdm 6 5月 2 01:36 zdmbase
drwxr-xr-x. 2 zdmuser zdm 6 5月 2 01:36 zdmhome
drwxr-xr-x. 2 zdmuser zdm 6 5月 2 01:36 zdminstall
/home/zdmuser/zdmbase:
合計 0
/home/zdmuser/zdmhome:
合計 0
/home/zdmuser/zdminstall:
合計 0
3.「zdminstall」ディレクトリにZDMのバイナリファイルを配置
以下のコマンドで、配置したZDMのバイナリファイルの確認および権限変更を行います。
※「Oracle Zero Downtime Migration」のダウンロードはこちら
--- ZDMバイナリファイルの配置 ---
root# cd /home/zdmuser/zdminstall
root# chown zdmuser:zdm /home/zdmuser/zdminstall/V1055491-01.zip
root# ls -l /home/zdmuser/zdminstall
-rw-r--r--. 1 zdmuser zdm 1125684981 5月 1 23:14 V1055491-01.zip
4.「zdmuser」の環境変数設定
以下のコマンドで、「zdmuser」の環境変数を設定します。
--- 環境変数設定 ---
root# su - zdmuser
zdmuser$ echo "export ORACLE_HOME=/home/zdmuser/zdmhome" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export ORACLE_BASE=/home/zdmuser/zdmbase" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export ZDM_HOME=/home/zdmuser/zdmhome" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export ZDM_BASE=/home/zdmuser/zdmbase" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export ZDM_INSTALL_LOC=/home/zdmuser/zdminstall" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export PATH=$ZDM_HOME/bin:$PATH" >> /home/zdmuser/.bash_profile
zdmuser$ echo "export LD_LIBRARY_PATH=$ZDM_HOME/lib:$LD_LIBRARY_PATH" >> /home/zdmuser/.bash_profile
--- 設定確認 ---
zdmuser$ cat /home/zdmuser/.bash_profile
--- 以下、出力例 ---
~前略~
# User specific environment and startup programs
export ORACLE_HOME=/home/zdmuser/zdmhome
export ORACLE_BASE=/home/zdmuser/zdmbase
export ZDM_HOME=/home/zdmuser/zdmhome
export ZDM_BASE=/home/zdmuser/zdmbase
export ZDM_INSTALL_LOC=/home/zdmuser/zdminstall
export PATH=$ZDM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ZDM_HOME/lib:$LD_LIBRARY_PATH
5.ZDMのインストール
以下のコマンドで、ZDMソフトウェアをインストールします。
・「ZDM service setup finished successfully...」 が出力されることを確認します。
--- ZIPファイルのunzip ---
zdmuser$ cd /home/zdmuser/zdminstall
zdmuser$ unzip ./V1055491-01.zip
--- ZDMのインストール ---
zdmuser$ export LC_ALL=C
zdmuser$ cd /home/zdmuser/zdminstall/zdm26.1/
zdmuser$ ./zdminstall.sh setup oraclehome=$ZDM_HOME oraclebase=$ZDM_BASE ziploc=./zdm_home.zip -zdm
--- 以下、出力例 ---
ZDM kit home: /home/zdmuser/zdminstall/zdm26.1
/home/zdmuser/zdminstall/zdm26.1
---------------------------------------
Validating zip file...
---------------------------------------
~中略~
---------------------------------------
Adding java jre to ZDM
---------------------------------------
ZDM service setup finished successfully...
6.ZDMの起動
以下のコマンドで、ZDMを起動します。
・「zdmservice start」において、「Server started successfully.」が出力されることを確認します。
・「zdmservice status」において、Runningの項目が「true」であることを確認します。
--- ZDMの起動 ---
zdmuser$ $ZDM_HOME/bin/zdmservice start
--- 以下、出力例 ---
No instance detected, starting zdmservice
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
Server started successfully.
--- ZDMの起動確認 ---
zdmuser$ $ZDM_HOME/bin/zdmservice status
--- 以下、出力例 ---
---------------------------------------
Service Status
---------------------------------------
Running: true
Tranferport:
Conn String: jdbc:derby:/home/zdmuser/zdmbase/derbyRepo;create=true
Repo Path: /home/zdmuser/zdmbase/derbyRepo
RMI port: 8897
HTTP port: 8898
SSH port: 22
Wallet path: /home/zdmuser/zdmbase/crsdata/kuno-zdmserver/security
7.レスポンスファイルの作成
本検証で作成したレスポンスファイルの一例を以下に記載します。
--- レスポンスファイルの作成 ---
zdmuser$ cat zdm_migration.rsp
--- 以下、出力例 ---
#-------------------------------------------------------------------------------#
# A. 基本設定 (Migration Method & Transfer)
#-------------------------------------------------------------------------------#
MIGRATION_METHOD=ONLINE_LOGICAL
DATATRANSFERMEDIUM=OSS
#-------------------------------------------------------------------------------#
# B. 接続ユーザー
#-------------------------------------------------------------------------------#
TARGETDATABASE_ADMINUSERNAME=sys as sysdba
SOURCEDATABASE_ADMINUSERNAME=sys as sysdba
#-------------------------------------------------------------------------------#
# C. ターゲットDBの情報
#-------------------------------------------------------------------------------#
TARGETDATABASE_CONNECTIONDETAILS_HOST=zdmtarget
TARGETDATABASE_CONNECTIONDETAILS_PORT=1521
TARGETDATABASE_OCID=ocid1.database.oc1.ap-tokyo-1.<ターゲットDBのOCID>
TARGETDATABASE_CONNECTIONDETAILS_SERVICENAME=targetpdb1.sbprivate.zdmvcn.oraclevcn.com
WALLET_TARGETADMIN=/home/zdmuser/zdm_wallets/tgt_sys
WALLET_TARGETGGADMIN=/home/zdmuser/zdm_wallets/tgt_gg
#-------------------------------------------------------------------------------#
# D. ソースDBの情報
#-------------------------------------------------------------------------------#
SOURCEDATABASE_CONNECTIONDETAILS_HOST=zdmsource
SOURCEDATABASE_CONNECTIONDETAILS_PORT=1521
SOURCEDATABASE_CONNECTIONDETAILS_SERVICENAME=sourcedb
WALLET_SOURCEADMIN=/home/zdmuser/zdm_wallets/src_sys
WALLET_SOURCEGGADMIN=/home/zdmuser/zdm_wallets/src_gg
#-------------------------------------------------------------------------------#
# E. Data Pump設定
#-------------------------------------------------------------------------------#
DATAPUMPSETTINGS_JOBMODE=SCHEMA
DATAPUMPSETTINGS_SCHEMABATCH-1=SCHEMA_A,SCHEMA_B
TABLESPACEDETAILS_AUTOCREATE=TRUE
DATAPUMPSETTINGS_EXPORTDIRECTORYOBJECT_NAME=ZDM_DATAPUMP
DATAPUMPSETTINGS_IMPORTDIRECTORYOBJECT_NAME=ZDM_DATAPUMP
DATAPUMPSETTINGS_DATAPUMPPARAMETERS_ENCRYPTION=NONE
#-------------------------------------------------------------------------------#
# F. GoldenGate Hub設定
#-------------------------------------------------------------------------------#
GOLDENGATEHUB_ADMINUSERNAME=oggadmin
GOLDENGATEHUB_URL=https://10.X.X.X
GOLDENGATEHUB_SOURCEDEPLOYMENTNAME=zdmGoldenGate
GOLDENGATEHUB_TARGETDEPLOYMENTNAME=zdmGoldenGate
WALLET_OGGSERVICEADMIN=/home/zdmuser/zdm_wallets/ogg_hub
GOLDENGATESETTINGS_REPLICAT_PERFORMANCEPROFILE=LOW
GOLDENGATEHUB_ALLOWSELFSIGNEDCERTIFICATE=TRUE
GOLDENGATEHUB_COMPUTEID=ocid1.instance.oc1.ap-tokyo-1.<GoldenGate HubのOCID>
SOURCEDATABASE_GGADMINUSERNAME=GGADMIN
TARGETDATABASE_GGADMINUSERNAME=GGADMIN
#-------------------------------------------------------------------------------#
# G. Object Storage設定
#-------------------------------------------------------------------------------#
DATAPUMPSETTINGS_DATABUCKET_NAMESPACENAME=nr6rghi1lhm3
DATAPUMPSETTINGS_DATABUCKET_BUCKETNAME=zdm-bucket
OCIAUTHENTICATIONDETAILS_REGIONID=ap-tokyo-1
OCIAUTHENTICATIONDETAILS_USERPRINCIPAL_userId=ocid1.user.oc1..<API実行ユーザーのOCID>
OCIAUTHENTICATIONDETAILS_USERPRINCIPAL_tenantId=ocid1.tenancy.oc1..<テナントのOCID>
OCIAUTHENTICATIONDETAILS_USERPRINCIPAL_fingerprint=<APIキーのフィンガープリント>
OCIAUTHENTICATIONDETAILS_USERPRINCIPAL_privateKeyFile=/home/zdmuser/.oci/zdm_oci_api_key.pem
WALLET_OCIAUTHTOKEN=/home/zdmuser/zdm_wallets/oss_token
【構築】ソースDBサーバ
サーバの基本情報については、下図を参照ください。
※本記事では、OracleソフトウェアのインストールやDatabase作成の手順についてはスキップします。

以下、ZDMの「論理オンライン方式」を利用する際のソースDB側の詳細設定手順を記載します。
1.FORCE LOGGINGの有効化
以下のコマンドで、FORCE LOGGINGを有効化します。
--- FORCE LOGGINGの有効化 ---
oracle$ sqlplus / as sysdba
SQL> alter database force logging;
データベースが変更されました。
--- 有効化確認 ---
SQL> select force_logging from v$database;
FORCE_LOGGING
--------------------
YES
2.サプリメンタル・ログの有効化
以下のコマンドで、サプリメンタル・ログを有効化します。
--- SUPPLEMENTAL LOGの有効化 ---
SQL> alter database add supplemental log data;
データベースが変更されました。
--- 有効化確認 ---
SQL> select supplemental_log_data_min from v$database;
SUPPLEMENTAL_LOG_DATA_MIN
-------------------------------------
YES
3.初期化パラメータの設定変更
以下、2つの初期化パラメータについて設定値を変更します。
・ENABLE_GOLDENGATE_REPLICATION
・STREAMS_POOL_SIZE
--- 初期化パラメータの設定変更 ---
SQL> alter system set enable_goldengate_replication=TRUE SCOPE=BOTH;
システムが変更されました。
SQL> alter system set streams_pool_size=2G SCOPE=BOTH;
システムが変更されました。
--- 設定変更確認 ---
SQL> show parameter enable_goldengate_replication;
NAME TYPE VALUE
------------------------------- --------- ------------------------------
enable_goldengate_replication boolean TRUE
SQL> show parameter streams_pool_size;
NAME TYPE VALUE
------------------- ------------- ------------------------------
streams_pool_size big integer 2G
4.GoldenGate用ユーザの作成
以下のコマンドにてGoldenGate用ユーザを作成します。
--- GoldenGate用ユーザの作成 ---
SQL> create tablespace zdm_logical datafile size 1G autoextend off;
表領域が作成されました。
SQL> create user ggadmin identified by <任意のパスワード> default tablespace zdm_logical temporary tablespace temp;
ユーザーが作成されました。
--- 作成確認 ---
SQL> select username, default_tablespace, account_status, created from dba_users where username='GGADMIN';
USERNAME DEFAULT_TABLESPACE ACCOUNT_ST CREATED
-------------------- -------------------- ---------- ----------
GGADMIN ZDM_LOGICAL OPEN 26-04-28
5.GoldenGate用ユーザへの権限付与
以下のコマンドにてGoldenGate用ユーザへ権限付与します。
--- GoldenGate用ユーザへの権限付与 ---
SQL> grant connect, resource to ggadmin;
SQL> grant dba to ggadmin;
SQL> grant datapump_exp_full_database to ggadmin;
SQL> grant unlimited tablespace to ggadmin;
SQL> grant select any dictionary to ggadmin;
SQL> grant select any table to ggadmin;
SQL> grant create view to ggadmin;
SQL> grant logmining to ggadmin;
SQL> grant execute on dbms_lock to ggadmin;
SQL> grant execute on dbms_streams_adm to ggadmin;
権限付与が成功しました。
SQL> exec dbms_goldengate_auth.GRANT_ADMIN_PRIVILEGE('ggadmin');
PL/SQLプロシージャが正常に完了しました。
--- 権限確認 ---
SQL> select grantee, granted_role from dba_role_privs where grantee='GGADMIN';
GRANTEE GRANTED_ROLE
------------ ------------------------------
GGADMIN DATAPUMP_EXP_FULL_DATABASE
GGADMIN DBA
GGADMIN SELECT_CATALOG_ROLE
GGADMIN CONNECT
GGADMIN RESOURCE
SQL> select grantee, privilege from dba_sys_privs where grantee='GGADMIN' order by privilege;
GRANTEE PRIVILEGE
------------ ------------------------------
GGADMIN ALTER ANY TABLE
GGADMIN ALTER SESSION
GGADMIN CREATE EVALUATION CONTEXT
GGADMIN CREATE JOB
GGADMIN CREATE RULE
GGADMIN CREATE RULE SET
GGADMIN CREATE VIEW
GGADMIN DEQUEUE ANY QUEUE
GGADMIN EXECUTE ANY RULE SET
GGADMIN FLASHBACK ANY TABLE
GGADMIN LOGMINING
GGADMIN SELECT ANY DICTIONARY
GGADMIN SELECT ANY TABLE
GGADMIN UNLIMITED TABLESPACE
SQL> exit
6.ディレクトリオブジェクトの作成
以下のコマンドにてディレクトリオブジェクトを作成します。
--- ディレクトリの作成 ---
root# mkdir -p /zdm_datapump
root# chown -R oracle:oinstall /zdm_datapump
root# chmod -R 775 /zdm_datapump
root# ls -ld /zdm_datapump
drwxrwxr-x 2 oracle oinstall 6 5月 1 10:12 /zdm_datapump
--- ディレクトリオブジェクトの作成 ---
root# su - oracle
oracle$ sqlplus / as sysdba
SQL> create directory zdm_datapump as '/zdm_datapump';
ディレクトリが作成されました。
SQL> grant read, write on directory zdm_datapump to ggadmin;
権限付与が成功しました。
--- 作成確認 ---
SQL> select owner, directory_name, directory_path from dba_directories where table_name='ZDM_DATAPUMP';
OWNER DIRECTORY_NAME DIRECTORY_PATH
---------- -------------------- ---------------------
SYS ZDM_DATAPUMP /zdm_datapump
SQL> select grantee, table_name, privilege from dba_tab_privs where table_name='ZDM_DATAPUMP';
GRANTEE TABLE_NAME PRIVILEGE
--------------- -------------------- ---------------
GGADMIN ZDM_DATAPUMP READ
GGADMIN ZDM_DATAPUMP WRITE
【構築】ターゲットDBサーバ
サーバの基本情報については、下図を参照ください。
※本記事では、BaseDBの作成手順についてはスキップします。

以下、ZDMの「論理オンライン方式」を利用する際のソースDB側の詳細設定手順を記載します。
1.初期化パラメータの設定変更
以下の初期化パラメータについて設定値を変更します。
・ENABLE_GOLDENGATE_REPLICATION
--- 初期化パラメータの設定変更 ---
oracle$ sqlplus / as sysdba
SQL> alter session set container=targetpdb1;
SQL> alter system set enable_goldengate_replication=TRUE SCOPE=BOTH;
システムが変更されました。
--- 設定変更確認 ---
SQL> show parameter enable_goldengate_replication;
NAME TYPE VALUE
------------------------------- --------- ------------------------------
enable_goldengate_replication boolean TRUE
2.GoldenGate用ユーザの作成
以下のコマンドにてGoldenGate用ユーザを作成します。
--- GoldenGate用ユーザの作成 ---
SQL> create tablespace zdm_logical datafile size 1G autoextend off;
表領域が作成されました。
SQL> create user ggadmin identified by <任意のパスワード> default tablespace zdm_logical temporary tablespace temp;
ユーザーが作成されました。
--- 作成確認 ---
SQL> select username, default_tablespace, account_status, created from dba_users where username='GGADMIN';
USERNAME DEFAULT_TABLESPACE ACCOUNT_ST CREATED
-------------------- -------------------- ---------- ----------
GGADMIN ZDM_LOGICAL OPEN 26-04-28
3.GoldenGate用ユーザへの権限付与
以下のコマンドにてGoldenGate用ユーザへ権限付与します。
--- GoldenGate用ユーザへの権限付与 ---
SQL> grant connect, resource to ggadmin;
SQL> grant dba to ggadmin;
SQL> grant OGG_APPLY to ggadmin;
SQL> grant unlimited tablespace to ggadmin;
SQL> grant select any dictionary to ggadmin;
SQL> grant select any table to ggadmin;
SQL> grant insert any table to ggadmin;
SQL> grant update any table to ggadmin;
SQL> grant delete any table to ggadmin;
SQL> grant create view to ggadmin;
SQL> grant logmining to ggadmin;
SQL> grant datapump_imp_full_database to ggadmin;
SQL> grant execute on dbms_lock to ggadmin;
権限付与が成功しました。
--- 権限確認 ---
SQL> select grantee, granted_role from dba_role_privs where grantee='GGADMIN';
GRANTEE GRANTED_ROLE
------------ ------------------------------
GGADMIN CONNECT
GGADMIN DATAPUMP_IMP_FULL_DATABASE
GGADMIN DBA
GGADMIN OGG_APPLY
GGADMIN RESOURCE
SQL> select grantee, privilege from dba_sys_privs where grantee='GGADMIN' order by privilege;
GRANTEE PRIVILEGE
------------ ------------------------------
GGADMIN CREATE VIEW
GGADMIN DELETE ANY TABLE
GGADMIN INSERT ANY TABLE
GGADMIN LOGMINING
GGADMIN SELECT ANY DICTIONARY
GGADMIN SELECT ANY TABLE
GGADMIN UNLIMITED TABLESPACE
GGADMIN UPDATE ANY TABLE
SQL> exit
4.ディレクトリオブジェクトの作成
以下のコマンドにてディレクトリオブジェクトを作成します。
--- ディレクトリの作成 ---
root# mkdir -p /zdm_datapump
root# chown -R oracle:oinstall /zdm_datapump
root# chmod -R 775 /zdm_datapump
root# ls -ld /zdm_datapump
drwxrwxr-x 2 oracle oinstall 6 5月 1 10:12 /zdm_datapump
--- ディレクトリオブジェクトの作成 ---
root# su - oracle
oracle$ sqlplus / as sysdba
SQL> create directory zdm_datapump as '/zdm_datapump';
ディレクトリが作成されました。
SQL> grant read, write on directory zdm_datapump to ggadmin;
権限付与が成功しました。
--- 作成確認 ---
SQL> select owner, directory_name, directory_path from dba_directories where table_name='ZDM_DATAPUMP';
OWNER DIRECTORY_NAME DIRECTORY_PATH
---------- -------------------- ---------------------
SYS ZDM_DATAPUMP /zdm_datapump
SQL> select grantee, table_name, privilege from dba_tab_privs where table_name='ZDM_DATAPUMP';
GRANTEE TABLE_NAME PRIVILEGE
--------------- -------------------- ---------------
GGADMIN ZDM_DATAPUMP READ
GGADMIN ZDM_DATAPUMP WRITE
【構築】GoldenGate Hubサーバ
サーバの基本情報については、下図を参照ください。

GoldenGate Hubサーバについては、OCI上のマーケットプレイスよりインスタンス作成を行います。
1.OCIコンソール「マーケットプレイス」→「すべてのアプリケーション」を選択後、「Oracle GoldenGate」で検索します。
「Oracle GoldenGate - Database Migrations」を選択します。

3.コンポーネントとZDMのバージョンを入力した後、「スタックの起動」を選択します。

4.スタックの名前や説明を入力した後、「Next」を選択します。

5.インスタンスの名前や詳細情報等を入力した後、「Next」を選択します。


6.入力した情報に誤りがないことを確認した後、「適用の実行」にチェックを入れて「作成」を選択します。

7.スタックによるインスタンス作成が問題なく完了していることを確認します。

8.スタックによって作成されたインスタンスにSSH接続でログインし、GoldenGateサービス・マネージャのユーザ名とパスワードを確認します。
--- ユーザ名とパスワードの確認 ---
opc$ cat ~/ogg-credentials.json
{"username": "oggadmin", "credential": "<自動生成された初期パスワード>"}
【データ移行】ZDMによる論理オンライン方式
1.【ソースDBサーバ】移行対象となるテストデータ確認
ソースDBサーバにSSH接続して、移行元テストデータを確認します。
本検証では、以下のスキーマオブジェクトを移行対象とします。
・スキーマ:SCHEMA_A, SCHEMA_B
・テーブル:TEST_DATA_A, TEST_DATA_B
・インデックス:SYS_C007293, SYS_C007294
・ビュー:VIEW_TEST_B
--- 移行対象データの確認 ---
zdmuser$ ssh oracle@<ソースDBサーバのIPアドレス>
oracle$ sqlplus / as sysdba
SQL> select username, account_status, created from dba_users where username in ('SCHEMA_A', 'SCHEMA_B');
USERNAME ACCOUNT_STATUS CREATED
---------- ----------------- ---------------------
SCHEMA_A OPEN 26-04-28
SCHEMA_B OPEN 26-04-28
SQL> select owner, object_name, object_type from dba_objects where owner in ('SCHEMA_A', 'SCHEMA_B') order by owner, object_type, object_name
OWNER OBJECT_NAME OBJECT_TYPE
---------- -------------------------- ------------
SCHEMA_A SYS_C007293 INDEX
SCHEMA_A TEST_DATA_A TABLE
SCHEMA_B SYS_C007294 INDEX
SCHEMA_B TEST_DATA_B TABLE
SCHEMA_B VIEW_TEST_B VIEW
SQL> select owner, status, count(*) from dba_objects where owner in ('SCHEMA_A', 'SCHEMA_B') group by owner, status order by owner, status;
OWNER STATUS COUNT(*)
--------------- ---------- -----------
SCHEMA_A VALID 2
SCHEMA_B VALID 3
SQL> select owner, table_name, num_rows, last_analyzed from dba_tables where owner in ('SCHEMA_A', 'SCHEMA_B') order by owner, num_rows desc;
OWNER TABLE_NAME NUM_ROWS
--------------- ------------- -----------
SCHEMA_A TEST_DATA_A 1,000,000
SCHEMA_B TEST_DATA_B 2,000,000
2.【ZDMサービス・ホスト】移行前にZDMの評価コマンドを実行する
移行コマンドである「zdmcli migrate database」に -eval オプションを付与することで、移行の可否を評価します。
--- 移行対象データの確認 ---
zdmuser$ zdmcli migrate database \
> -rsp /home/zdmuser/zdm_rsp/zdm_migration.rsp \
> -sourcedb sourcedb \
> -sourcenode zdmsource \
> -srcauth zdmauth \
> -srcarg1 user:oracle \
> -srcarg2 identity_file:/home/zdmuser/.ssh/id_rsa \
> -srcarg3 sudo_location:/usr/bin/sudo \
> -targetnode zdmtarget \
> -tgtauth zdmauth \
> -tgtarg1 user:opc \
> -tgtarg2 identity_file:/home/zdmuser/.ssh/id_rsa \
> -tgtarg3 sudo_location:/usr/bin/sudo \
> -eval
操作"zdmcli migrate database"がジョブID "XX"でスケジュールされました。
zdmuser$ zdmcli query job -jobid XX
---以下、出力例---
kuno-zdmserver: 監査ID: 765
ジョブID: 15
ユーザー: zdmuser
クライアント: kuno-zdmserver
ジョブ・タイプ: "EVAL"
スケジュール済ジョブ・コマンド: "zdmcli migrate database -rsp /home/zdmuser/zdm_rsp/zdm_migration.rsp -sourcedb sourcedb -sourcenode zdmsource -srcauth zdmauth -srcarg1 user:oracle -srcarg2 identity_file:/home/zdmuser/.ssh/id_rsa -srcarg3 sudo_location:/usr/bin/sudo -targetnode zdmtarget -tgtauth zdmauth -tgtarg1 user:opc -tgtarg2 identity_file:/home/zdmuser/.ssh/id_rsa -tgtarg3 sudo_location:/usr/bin/sudo -eval"
スケジュール済ジョブの実行開始時間: 2026-05-11T13:58:16+09。対応するローカル時間: 2026-05-11 13:58:16
現在のステータス: SUCCEEDED
結果ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-14-2026-05-11-13:58:32.log"
メトリック・ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-14-2026-05-11-13:58:32.json"
除外されたオブジェクト・ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-14-filtered-objects-2026-05-11T13:58:47.118736062.json"
ジョブの実行開始時間: 2026-05-11 13:58:32
ジョブの実行終了時間: 2026-05-11 14:01:57
ジョブの実行経過時間: 3分 24秒
ZDM_VALIDATE_TGT ...................... COMPLETED
ZDM_VALIDATE_SRC ...................... COMPLETED
ZDM_SETUP_SRC ......................... COMPLETED
ZDM_PRE_MIGRATION_ADVISOR ............. COMPLETED
ZDM_VALIDATE_GG_HUB ................... COMPLETED
ZDM_VALIDATE_DATAPUMP_SETTINGS_SRC .... COMPLETED
ZDM_VALIDATE_DATAPUMP_SETTINGS_TGT .... COMPLETED
ZDM_PREPARE_DATAPUMP_SRC .............. COMPLETED
ZDM_DATAPUMP_ESTIMATE_SRC ............. COMPLETED
ZDM_CLEANUP_SRC ....................... COMPLETED
3.【ZDMサービス・ホスト】ZDMの移行コマンドを実行する
「zdmcli migrate database」の評価コマンドから-evalを外して実行します。
すべてのチェック項目において、「COMPLETED」と出力されることを確認します。
--- 移行対象データの確認 ---
zdmuser$ zdmcli migrate database \
> -rsp /home/zdmuser/zdm_rsp/zdm_migration.rsp \
> -sourcedb sourcedb \
> -sourcenode zdmsource \
> -srcauth zdmauth \
> -srcarg1 user:oracle \
> -srcarg2 identity_file:/home/zdmuser/.ssh/id_rsa \
> -srcarg3 sudo_location:/usr/bin/sudo \
> -targetnode zdmtarget \
> -tgtauth zdmauth \
> -tgtarg1 user:opc \
> -tgtarg2 identity_file:/home/zdmuser/.ssh/id_rsa \
> -tgtarg3 sudo_location:/usr/bin/sudo \
操作"zdmcli migrate database"がジョブID "XX"でスケジュールされました。
zdmuser$ zdmcli query job -jobid XX
---以下、出力例---
zdmserver: 監査ID: 913
ユーザー: zdmuser
クライアント: zdmserver
ジョブ・タイプ: "MIGRATE"
スケジュール済ジョブ・コマンド: "zdmcli migrate database -rsp /home/zdmuser/zdm_rsp/zdm_migration.rsp -sourcedb sourcedb -sourcenode zdmsource -srcauth zdmauth -srcarg1 user:oracle -srcarg2 identity_file:/home/zdmuser/.ssh/id_rsa -srcarg3 sudo_location:/usr/bin/sudo -targetnode zdmtarget -tgtauth zdmauth -tgtarg1 user:opc -tgtarg2 identity_
スケジュール済ジョブの実行開始時間: 2026-05-11T14:25:18+09。対応するローカル時間: 2026-05-11 14:25:18
現在のステータス: SUCCEEDED
結果ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-16-2026-05-11-14:25:32.log"
メトリック・ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-16-2026-05-11-14:25:32.json"
除外されたオブジェクト・ファイル・パス: "/home/zdmuser/zdmbase/chkbase/scheduled/job-16-filtered-objects-2026-05-11T14:25:50.011042738.json"
ジョブの実行開始時間: 2026-05-11 14:25:32
ジョブの実行終了時間: 2026-05-11 14:45:53
ジョブの実行経過時間: 20分 20秒
ダンプ接頭辞: ZDM_16_DP_EXPORT_863088_BATCH1_dmp
ZDM_VALIDATE_TGT ...................... COMPLETED
ZDM_VALIDATE_SRC ...................... COMPLETED
ZDM_SETUP_SRC ......................... COMPLETED
ZDM_PRE_MIGRATION_ADVISOR ............. COMPLETED
ZDM_VALIDATE_GG_HUB ................... COMPLETED
ZDM_VALIDATE_DATAPUMP_SETTINGS_SRC .... COMPLETED
ZDM_VALIDATE_DATAPUMP_SETTINGS_TGT .... COMPLETED
ZDM_PREPARE_DATAPUMP_SRC .............. COMPLETED
ZDM_DATAPUMP_ESTIMATE_SRC ............. COMPLETED
ZDM_PREPARE_GG_HUB .................... COMPLETED
ZDM_ADD_HEARTBEAT_SRC ................. COMPLETED
ZDM_ADD_SCHEMA_TRANDATA_SRC ........... COMPLETED
ZDM_CREATE_GG_EXTRACT_SRC ............. COMPLETED
ZDM_PREPARE_DATAPUMP_TGT .............. COMPLETED
ZDM_PARALLEL_EXPORT_IMPORT ............ COMPLETED
ZDM_POST_DATAPUMP_SRC ................. COMPLETED
ZDM_POST_DATAPUMP_TGT ................. COMPLETED
ZDM_ADD_HEARTBEAT_TGT ................. COMPLETED
ZDM_ADD_CHECKPOINT_TGT ................ COMPLETED
ZDM_CREATE_GG_REPLICAT_TGT ............ COMPLETED
ZDM_START_GG_REPLICAT_TGT ............. COMPLETED
ZDM_MONITOR_GG_LAG .................... COMPLETED
ZDM_PREPARE_SWITCHOVER_APP ............ COMPLETED
ZDM_RELOAD_PARALLEL_EXPORT_IMPORT ..... COMPLETED
ZDM_ADVANCE_SEQUENCES ................. COMPLETED
ZDM_REFRESH_MVIEW_TGT ................. COMPLETED
ZDM_SWITCHOVER_APP .................... COMPLETED
ZDM_POST_SWITCHOVER_TGT ............... COMPLETED
ZDM_RM_GG_EXTRACT_SRC ................. COMPLETED
ZDM_RM_GG_REPLICAT_TGT ................ COMPLETED
ZDM_DELETE_SCHEMA_TRANDATA_SRC ........ COMPLETED
ZDM_RM_HEARTBEAT_SRC .................. COMPLETED
ZDM_RM_CHECKPOINT_TGT ................. COMPLETED
ZDM_RM_HEARTBEAT_TGT .................. COMPLETED
ZDM_CLEAN_GG_HUB ...................... COMPLETED
ZDM_POST_ACTIONS ...................... COMPLETED
ZDM_CLEANUP_SRC ....................... COMPLETED
4.【ターゲットDBサーバ】移行対象となるテストデータ確認
ターゲットDBサーバにSSH接続して、移行先テストデータを確認します。
本検証では、オンプレ側のテストデータがOCI側に問題なくクラウドリフトしていることを確認します。
※インデックス名については、Oracle自動命名のため、データ移行時に新しい名前が振りなおされています。
--- 移行対象データの確認 ---
zdmuser$ ssh oracle@<ターゲットDBサーバのIPアドレス>
oracle$ sqlplus / as sysdba
SQL> select username, account_status, created from dba_users where username in ('SCHEMA_A', 'SCHEMA_B');
USERNAME ACCOUNT_STATUS CREATED
---------- ----------------- ---------------------
SCHEMA_A OPEN 26-05-11
SCHEMA_B OPEN 26-05-11
SQL> select owner, object_name, object_type from dba_objects where owner in ('SCHEMA_A', 'SCHEMA_B') order by owner, object_type, object_name
OWNER OBJECT_NAME OBJECT_TYPE
---------- -------------------------- ------------
SCHEMA_A SYS_C008581 INDEX
SCHEMA_A TEST_DATA_A TABLE
SCHEMA_B SYS_C008582 INDEX
SCHEMA_B TEST_DATA_B TABLE
SCHEMA_B VIEW_TEST_B VIEW
SQL> select owner, status, count(*) from dba_objects where owner in ('SCHEMA_A', 'SCHEMA_B') group by owner, status order by owner, status;
OWNER STATUS COUNT(*)
--------------- ---------- -----------
SCHEMA_A VALID 2
SCHEMA_B VALID 3
SQL> select owner, table_name, num_rows, last_analyzed from dba_tables where owner in ('SCHEMA_A', 'SCHEMA_B') order by owner, num_rows desc;
OWNER TABLE_NAME NUM_ROWS
--------------- ------------- -----------
SCHEMA_A TEST_DATA_A 1,000,000
SCHEMA_B TEST_DATA_B 2,000,000
まとめ
本記事では、Oracle Zero Downtime Migration (ZDM) の「論理オンライン方式」を用いた、オンプレミスからOCIへのクラウドリフト検証について解説しました。
実際に検証を通じて、以下の2点がZDMを利用する大きなメリットであると感じました。
1.複雑な工程の自動化
本来であれば、Data Pumpによる初期ロード、SCNの同期、GoldenGateの各種プロセス(Extract/Replicat)の構築など、多くの手作業が必要な工程を、ZDMが1つのジョブとして統合・自動実行してくれる点は非常に強力です。
2.柔軟なフェーズ管理
ジョブ実行中に各フェーズが細かく分かれており、同期状態を確認しながら任意のタイミングで切り替え(Switchover)を行えるため、計画停止時間のコントロールが容易です。
検証を終えてのアドバイス
論理移行を成功させるポイントは、「事前準備(前提条件)の徹底」に尽きます。 今回ご紹介した LC_ALL=C の設定や、ソースDB側でのサプリメンタル・ログの有効化、そしてggadminユーザへの適切な権限付与が一つでも漏れると、ジョブの評価フェーズや初期セットアップでエラーとなります。
本記事の構築手順が、ZDMを利用した際のスムーズなクラウドリフトの一助となれば幸いです。
最後までお読みいただきありがとうございました。


