1. はじめに
以前、以下の記事でOCI Base Database Service(以下、BaseDB)のOCPU環境からECPU環境への移行を、PDBのリフレッシュ可能クローンを利用して試してみました。
OCI Base Database Service のリフレッシュ可能クローンを使ってOCPU環境からECPU環境へ移行してみた
前回はBaseDB同士でPDBをクローンし、移行元の更新データをリフレッシュによって移行先へ反映させるところまで確認しました。
一方、BaseDBではOCPU課金SKUやEnterprise Edition - Extreme Performance(EE-EP)の提供終了が案内されています。
現時点では既存デプロイメントは引き続き稼働しますが、新規プロビジョニングや今後の影響も鑑み、これまでBaseDBのEE-EPでRACを利用していた場合などは、移行先の検討が必要になります。
共有インフラストラクチャ上でOracle RACを利用したい場合、候補になるのが Oracle Exadata Database Service on Exascale Infrastructure(ExaDB-XS) です。
ExaDB-XSは、Exadataの機能を利用しながら、共有インフラストラクチャ上にVMクラスタを構成できるサービスです。
今回はたまたまExaDB-XSのVMクラスタを借りれる機会があったので、BaseDBのOCPU環境からExaDB-XSへ、PDBのリフレッシュ可能クローンを使ってデータ移行してみます!
参考:
本記事は個人の検証結果をまとめたものであり、所属する組織の公式見解を示すものではありません。
サービスの提供条件やサポート範囲は変更される場合があるため、最新情報は公式ドキュメントをご確認ください。
2. ZDM 26.1でPDBクローンが利用できるようになった
BaseDBではOCIコンソールからPDBをクローンできます。
ただし、BaseDBのGUIから選択できるクローン先はBaseDBのDBシステムです。
今回のようにBaseDBからExaDB-XSへクローンする操作は、GUI上からは実施できません。
そのため、最初はSQLコマンドでDB Linkを作成し、CREATE PLUGGABLE DATABASEでクローンする必要があるのかなと思っていました。
調べてみると、Oracle Zero Downtime Migration(ZDM)26.1では、PDBクローンによる移行がサポートされました。
ZDMは、Oracle DatabaseをOCIなどへ移行する際の作業を自動化するツールです。
ZDM 26.1では、PDBクローンについて以下の方式を利用できます。
| クローン方式 | 特徴 |
|---|---|
| Cold Clone | 移行元をREAD ONLYにしてクローン |
| Hot Clone | 移行元をREAD WRITEのままクローン |
| リフレッシュ可能クローン(Refreshable PDB Clone) | クローン後もREDOを適用して更新を反映 |
今回は、前回の記事と同じくリフレッシュ可能クローンを使ってみます。
さらに、ZDM 26.1ではInstant Deployという新しいデプロイ方式も追加されています。
従来のZDMでは、ZDMサーバーを用意してインストール・起動する構成が一般的でしたが、Instant DeployではZDMキットを展開し、データベースサーバー上から直接zdmcliを実行できます。
専用のZDMサーバーを用意する必要がないため、今回のような検証では便利そうです。
せっかくなので、今回はZDM 26.1 Instant Deploy + リフレッシュ可能クローンを使って、BaseDBからExaDB-XSへの移行を試してみます!
参考にしたドキュメント
- Oracle Zero Downtime Migration 26.1 Documentation
- Migration Using PDB Clone
- Performing Migration Using the Instant Deploy Feature
- ZDM 26.1 Instant DeployによるPDB Cloningの実行例
3. 検証環境
今回使用した環境は以下です。
| 項目 | 移行元 | 移行先 |
|---|---|---|
| OCIサービス | Base Database Service | ExaDB-XS |
| CPUモデル | OCPUベース | ECPUベース |
| DB構成 | シングルインスタンス | 2ノードRAC |
| データベース | Oracle AI Database 26ai | Oracle AI Database 26ai |
| DBバージョン | 23.26.3.0.0 | 23.26.3.0.0 |
| CDB名 | BASEOCPU |
EXACDB |
| DB_UNIQUE_NAME | baseocpu_src |
exacdb |
| PDB名 | BASEPDB |
BASEPDB(今回作成) |
| ZDM | - | ZDM 26.1 Instant Deploy |
移行元と移行先は、同じVCN内に構築しています。
ZDMはExaDB-XSのノード1に配置し、そこから移行処理を実行します。
※ホスト名・クライアント名・サービスのドメイン名、および移行元のDB_UNIQUE_NAMEは匿名化しています。<source-host>は移行元ホスト、<target-node1>/<target-node2>は移行先の各ノード、<target-scan>は移行先のSCAN名を表します。コマンド内の例示値は実際の環境に合わせて置き換えてください。
移行イメージ
移行元PDBにはSwingbenchのSOEスキーマを用意しました。
本記事では、SCNの進行とアラートログから自動リフレッシュの動作を確認し、移行後にSOEスキーマのデータを参照できることを確認します。
なお、移行元への逆同期は行わない構成とします。
4. 事前準備
4-1. データベースの設定確認
リフレッシュ可能クローンを利用するため、移行元と移行先のデータベースで事前に設定を確認します。
ARCHIVE LOG LIST;
SHOW PARAMETER compatible;
SELECT property_name, property_value
FROM database_properties
WHERE property_name = 'LOCAL_UNDO_ENABLED';
今回の環境では、両データベースともデフォルトで設定済みでした。
結果:
SQL> ARCHIVE LOG LIST;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 19
Next log sequence to archive 19
Current log sequence 18
SQL> SHOW PARAMETER compatible;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 23.6.0
noncdb_compatible boolean FALSE
SQL> SELECT property_name, property_value
2 FROM database_properties
3 WHERE property_name = 'LOCAL_UNDO_ENABLED';
PROPERTY_NAME PROPERTY_VALUE
-------------------- --------------------
LOCAL_UNDO_ENABLED TRUE
ZDMが作成したDB Link利用時のORA-02085回避のため、GLOBAL_NAMES=FALSEへ変更します。
SELECT inst_id, name, value
FROM gv$system_parameter
WHERE name = 'global_names';
ALTER SYSTEM SET global_names=FALSE
SCOPE=BOTH SID='*';
SELECT inst_id, name, value
FROM gv$system_parameter
WHERE name = 'global_names';
結果:
SQL> SELECT inst_id, value
2 FROM gv$system_parameter
3 WHERE name = 'global_names'
4 ORDER BY inst_id;
INST_ID VALUE
---------- ----------
1 TRUE
2 TRUE
SQL> ALTER SYSTEM SET global_names=FALSE SCOPE=BOTH SID='*';
System altered.
SQL> SELECT inst_id, value
2 FROM gv$system_parameter
3 WHERE name = 'global_names'
4 ORDER BY inst_id;
INST_ID VALUE
---------- ----------
1 FALSE
2 FALSE
4-2. ネットワークの疎通確認
ZDMから移行元・移行先のDBサーバーへ接続できることに加えて、ExaDB-XSからBaseDBのリスナーへ接続できることを確認します。
今回はExaDB-XSが2ノードRACなので、両ノードから移行元PDBへ接続できることを確認しました。
確認した主な通信は以下です。
| 通信 | 用途 |
|---|---|
| ExaDB-XS → BaseDB:SSH | ZDMによるOS操作 |
| ExaDB-XS → BaseDB:TCP 1521 | DB LinkによるPDBクローン |
| BaseDB → ExaDB-XS:TCP 1521 | Oracle Net疎通確認 |
最初はExaDB-XSからBaseDBのTCP 1521に接続できませんでしたが、OCIのセキュリティリストに必要なルールを追加して解決しました。
実際の環境では、必要な送信元CIDRだけを許可するなど、適切なネットワーク制御を行ってください。
4-3. Swingbenchの準備
移行元のBASEPDBには、SwingbenchのSOEスキーマを作成しています。
SOEスキーマの作成方法については、前回の記事でも紹介しています。
今回はSwingbenchのツールを使用してSOEスキーマを用意しました。
5. ZDM 26.1 Instant Deployのセットアップ
5-1. ZDMのダウンロード
Oracle Software Delivery CloudからZDM 26.1をダウンロードします。
今回利用したファイルは以下です。こちらからダウンロードできます。
V1055491-01.zip
今回はExaDB-XSのノード1にZDMキットを配置しました。
このディレクトリはopcユーザーで操作できるようにしています。
sudo mkdir -p /u02/zdm-instant
sudo chown opc:opc /u02/zdm-instant
sudo chmod 750 /u02/zdm-instant
mv V1055491-01.zip /u02/zdm-instant/
cd /u02/zdm-instant
unzip V1055491-01.zip
5-2. ZDMの起動確認
配置したZDMディレクトリで、以下を実行します。
Instant Deployでは、このタイミングで初期セットアップが行われました。
cd /u02/zdm-instant/zdm26.1
./zdmcli -help
結果:
[opc@<target-node1> zdm26.1]$ ./zdmcli -help
Performing one-time ZDM binary setup... This may take a few minutes.
ZDM binary setup completed successfully.
Performs Zero Downtime Migration operations for the cloud.
Usage:
zdmcli abort Perform abort operation for a migration job.
zdmcli add Adds an image type or user actions.
zdmcli audit Perform audit operation for a migration job.
zdmcli delete Deletes a job, an image type or an user action.
zdmcli migrate Performs migration operation for the cloud.
zdmcli modify Modifies user actions and a migration job.
zdmcli query Gets information of a job, image type, user actions and audit.
zdmcli resume Perform resume operation for a migration job.
zdmcli suspend Suspend the migration job.
For detailed help on each command use:
zdmcli <command> <object> -help
[opc@<target-node1> zdm26.1]$
続いてビルド情報を確認します。
./zdmcli -build
結果:
[opc@<target-node1> zdm26.1]$ ./zdmcli -build
full version: "26.1.0"
patch version: ""
label date: 260410.1
ZDM kit build date: Apr 11 2026 17:13:53 UTC
CPAT build version: 26.3.0
ZDM 26.1が利用できる状態になりました!
6. ZDMレスポンスファイルの作成
次に、移行用のレスポンスファイルを作成します。
今回は以下に配置しました。
/u02/zdm-instant/zdm26.1/rsp/basepdb_refreshable.rsp
内容は次のとおりです。
PLATFORM_TYPE=EXACS
TGT_DB_UNIQUE_NAME=exacdb
MIGRATION_METHOD=ONLINE_PHYSICAL
DATA_TRANSFER_MEDIUM=DBLINK
SRC_DB_HOSTNAME=<source-host>
SRC_DB_PORT=1521
TGT_DB_HOSTNAME=<target-scan>
TGT_DB_PORT=1521
ZDM_PDB_CLONE_METHOD=REFRESHABLE
ZDM_SRC_PDB_NAME=basepdb
ZDM_TGT_PDB_NAME=basepdb
ZDM_PDB_REFRESH_INTERVAL=5
ZDM_SWITCHOVER=FALSE
ZDM_SKIP_TDE_WALLET_MIGRATION=FALSE
今回はZDM_PDB_CLONE_METHOD=REFRESHABLEを指定しています。
また、ZDM_PDB_REFRESH_INTERVAL=5によって、5分間隔での自動リフレッシュを設定します。
ZDM_SWITCHOVER=FALSEは、ZDMのパラメータ上ではFailover方式の指定です。
今回は移行元と移行先のPDBを役割反転させるのではなく、最終的にExaDB-XS側を独立した通常PDBにする構成とします。
7. ZDMの事前評価
ZDMでは、-evalオプションを指定することで、実際に移行する前に環境の事前評価を実行できます。
まずは問題なく移行できそうか確認してみます。
ExaDB-XSのノード1で、opcユーザーから以下を実行しました。
cd /u02/zdm-instant/zdm26.1
./zdmcli migrate database \
-sourcesid baseocpu \
-sourcenode <source-host> \
-targetnode <target-node1> \
-targethome /u02/app/oracle/product/23.0.0.0/dbhome_1 \
-rsp /u02/zdm-instant/zdm26.1/rsp/basepdb_refreshable.rsp \
-srcuser opc \
-tgtuser opc \
-tdekeystorepasswd \
-tgttdekeystorepasswd \
-eval
実行すると、移行元DBのSYSパスワードと、移行元・移行先のTDEキーストアパスワードの入力を求められます。
Enter source database baseocpu SYS password:
Enter source database baseocpu TDE keystore password:
Enter target container database TDE keystore password:
Migration evaluation job started
その後、移行元・移行先の環境情報取得や事前チェック、環境の検証が実行されました。
主な出力は以下のとおりです。
Oracle ZDM (Zero Downtime Migration) Version "26.1.0"
Build date: Apr 11 2026 17:13:53 UTC
Executing phase ZDM_GET_SRC_INFO
Execution of phase ZDM_GET_SRC_INFO completed
Executing phase ZDM_GET_TGT_INFO
Execution of phase ZDM_GET_TGT_INFO completed
Executing phase ZDM_PRECHECKS_SRC
Execution of phase ZDM_PRECHECKS_SRC completed
Executing phase ZDM_PRECHECKS_TGT
Execution of phase ZDM_PRECHECKS_TGT completed
Executing phase ZDM_VALIDATE_SRC
Ensuring source database is running in ARCHIVELOG mode...
Validating Oracle TDE setup
Validating database baseocpu_src role is PRIMARY...
Source environment validated successfully
Execution of phase ZDM_VALIDATE_SRC completed
Executing phase ZDM_VALIDATE_TGT
verifying passwordless connectivity between target nodes
Target environment validated successfully
Execution of phase ZDM_VALIDATE_TGT completed
...
Oracle ZDM ONLINE PHYSICAL evaluation job completed
Job duration: 1 minutes and 50 seconds
約1分50秒で事前評価が正常に完了しました!
ARCHIVELOGモード、TDE構成、移行元DBのロール、移行先RACノード間の接続などの検証が成功しています。
なお、-evalは事前評価のみなので、この時点では移行先にBASEPDBは作成されません。
問題なさそうなので、続いて実際のPDBクローンを実行してみます。
8. ZDMの実行フェーズを確認
事前評価が正常に完了したので、いよいよPDBクローンを実行してみます!
ただし、今回はクローンを作成した後も移行元ではアプリケーションによる更新が続き、リフレッシュ可能クローンで差分を定期的に吸収する想定です。
そのため、ZDMの移行処理を最後まで一気に実行するのではなく、PDBクローン作成後に一時停止させたいです。
ZDMでは-listphasesオプションを指定することで、移行ジョブで実行されるフェーズを事前に確認できます。
まずは、どのようなフェーズがあるのか確認してみます。
./zdmcli migrate database \
-sourcesid baseocpu \
-sourcenode <source-host> \
-targetnode <target-node1> \
-targethome /u02/app/oracle/product/23.0.0.0/dbhome_1 \
-rsp /u02/zdm-instant/zdm26.1/rsp/basepdb_refreshable.rsp \
-srcuser opc \
-tgtuser opc \
-listphases
実行結果は以下のとおりです。
ZDM_GET_SRC_INFO
ZDM_GET_TGT_INFO
ZDM_PRECHECKS_SRC
ZDM_PRECHECKS_TGT
ZDM_SETUP_SRC
ZDM_SETUP_TGT
ZDM_PREUSERACTIONS
ZDM_PREUSERACTIONS_TGT
ZDM_VALIDATE_SRC
ZDM_VALIDATE_TGT
ZDM_DISCOVER_SRC
ZDM_COPYFILES
ZDM_PREPARE_TGT
ZDM_CLONE_PDB_TGT
ZDM_FINALIZE_TGT
ZDM_SWITCHOVER_TGT
ZDM_SWITCHOVER_SRC
ZDM_NONCDBTOPDB_CONVERSION
ZDM_DATAPATCH_TGT
ZDM_POST_DATABASE_OPEN_TGT
ZDM_POSTUSERACTIONS
ZDM_POSTUSERACTIONS_TGT
ZDM_CLEANUP_SRC
ZDM_CLEANUP_TGT
移行元・移行先の情報取得や事前チェックから始まり、PDBのクローン、切替処理、datapatch、クリーンアップまで、さまざまなフェーズがあることが分かります。
今回注目するのはこちらのフェーズです。
ZDM_PREPARE_TGT
ZDM_CLONE_PDB_TGT ★ ここで一時停止したい
ZDM_FINALIZE_TGT
ZDM_SWITCHOVER_TGT
ZDM_SWITCHOVER_SRC
ZDM_NONCDBTOPDB_CONVERSION
ZDM_DATAPATCH_TGT
ZDM_CLONE_PDB_TGTがPDBクローン作成のフェーズです。
ZDMには、指定したフェーズの完了後にジョブを一時停止する-pauseafterオプションが用意されています。
そこで今回は、実際の移行コマンドに以下を追加して実行することにします。
-pauseafter ZDM_CLONE_PDB_TGT
これにより、リフレッシュ可能クローンを作成した状態でZDMジョブを一時停止し、移行元の更新データが5分間隔で移行先へ反映されるかを確認できます。
今回はクローン作成後もアプリケーションが動作し、定期リフレッシュで差分が取り込まれる想定のため、アプリケーションを切り替えることができるタイミングになった段階でzdmcli resume jobでジョブを再開して、最終的な切替処理へ進める予定です。
なお、-listphasesはフェーズを一覧表示するだけなので、このコマンドによって移行ジョブが開始されることはありません。
それでは、停止するフェーズも決まったので、実際にPDBクローンを作成してみます!
9. リフレッシュ可能クローンの作成
クローン作成後にZDMジョブを一時停止させるため、以下のオプションを指定します。
-pauseafter ZDM_CLONE_PDB_TGT
これにより、PDBクローン作成フェーズの完了後にZDMジョブを一時停止できます。
9-1. ZDMによるPDBクローンの実行
ExaDB-XSのノード1にログインし、opcユーザーでZDM Instant Deployのディレクトリから実行します。
cd /u02/zdm-instant/zdm26.1
./zdmcli migrate database \
-sourcesid baseocpu \
-sourcenode <source-host> \
-targetnode <target-node1> \
-targethome /u02/app/oracle/product/23.0.0.0/dbhome_1 \
-rsp /u02/zdm-instant/zdm26.1/rsp/basepdb_refreshable.rsp \
-srcuser opc \
-tgtuser opc \
-tdekeystorepasswd \
-tgttdekeystorepasswd \
-pauseafter ZDM_CLONE_PDB_TGT
第7章の事前評価と同様に、移行元データベースのSYSパスワードと、移行元・移行先のTDEキーストアパスワードの入力を求められます。
Enter source database baseocpu SYS password:
Enter source database baseocpu TDE keystore password:
Enter target container database TDE keystore password:
Migration job started ....
Result file path: /u02/zdm-instant/zdm26.1/zdmbase/chkbase/scheduled/job-5-2026-10-10-13:57:59.log
無事に移行ジョブが開始されました!
今回のジョブIDは5です。
9-2. ZDMの実行結果
ジョブが開始されると、ZDMによって移行元・移行先の情報取得や環境検証、接続設定などが順番に実行されました。
主な実行ログを抜粋します。
Oracle ZDM (Zero Downtime Migration) Version "26.1.0"
Build date: Apr 11 2026 17:13:53 UTC
Starting zero downtime migrate operation ...
Executing phase ZDM_GET_SRC_INFO
Execution of phase ZDM_GET_SRC_INFO completed
Executing phase ZDM_GET_TGT_INFO
Execution of phase ZDM_GET_TGT_INFO completed
Executing phase ZDM_PRECHECKS_SRC
Execution of phase ZDM_PRECHECKS_SRC completed
Executing phase ZDM_PRECHECKS_TGT
Execution of phase ZDM_PRECHECKS_TGT completed
Executing phase ZDM_SETUP_SRC
TNS aliases successfully setup on the source node <source-host>...
Execution of phase ZDM_SETUP_SRC completed
Executing phase ZDM_SETUP_TGT
TNS aliases successfully setup on the target node <target-node1>...
Execution of phase ZDM_SETUP_TGT completed
続いて、移行元・移行先の環境検証が実行されます。
Executing phase ZDM_VALIDATE_SRC
Validating source environment...
Ensuring source database is running in ARCHIVELOG mode...
Validating Oracle TDE setup
Validating database baseocpu_src role is PRIMARY...
Source environment validated successfully
Execution of phase ZDM_VALIDATE_SRC completed
Executing phase ZDM_VALIDATE_TGT
verifying passwordless connectivity between target nodes
Target environment validated successfully
Execution of phase ZDM_VALIDATE_TGT completed
移行元のARCHIVELOGモードやTDE構成、データベースのロールなどの検証が成功し、移行先RACノード間の接続も問題ないことが確認できました。
その後、移行に必要な準備処理が進みます。
Executing phase ZDM_DISCOVER_SRC
Successfully discovered database exacdb
Enabling force logging on database baseocpu_src...
Creating standby logs on database baseocpu_src...
Source environment set up successfully
Execution of phase ZDM_DISCOVER_SRC completed
Executing phase ZDM_COPYFILES
Source database "baseocpu_src" credentials exported successfully
Execution of phase ZDM_COPYFILES completed
Executing phase ZDM_PREPARE_TGT
Target environment set up successfully
Execution of phase ZDM_PREPARE_TGT completed
ログを見ると、ZDMが移行元でForce Loggingの有効化やStandby Redo Logの作成なども実施していることが分かります。
9-3. PDBクローン作成とジョブの一時停止
準備処理が完了すると、いよいよZDM_CLONE_PDB_TGTフェーズが実行されました。
2026-10-10T14:01:42.983Z : Executing phase ZDM_CLONE_PDB_TGT
2026-10-10T14:02:46.212Z : Cloning a pluggable database (PDB) basepdb to a pluggable database basepdb on the target multitenant container database (CDB) exacdb ...
2026-10-10T14:02:51.754Z : Execution of phase ZDM_CLONE_PDB_TGT completed
2026-10-10T14:02:51.775Z : Job execution paused after phase "ZDM_CLONE_PDB_TGT".
PDBクローン作成フェーズが正常に完了しました!
そして、-pauseafter ZDM_CLONE_PDB_TGTを指定していたため、想定どおりジョブが一時停止しています。
実行結果をまとめると、以下のとおりです。
| 項目 | 結果 |
|---|---|
| ZDMバージョン | 26.1.0 |
| ジョブID | 5 |
| 移行元 | BaseDB / BASEOCPU / BASEPDB |
| 移行先 | ExaDB-XS / EXACDB / BASEPDB |
| 実行開始 | 2026/10/10 13:57:59 UTC |
| 一時停止 | 2026/10/10 14:02:51 UTC |
| 所要時間 | 4分52秒 |
| 停止フェーズ | ZDM_CLONE_PDB_TGT |
| 結果 | クローン作成フェーズ完了後に一時停止 |
思っていたよりも短時間でクローン作成フェーズまで進みました。
ただし、ここで完了したのはPDBクローン作成フェーズまでです。ZDMの移行ジョブ全体が完了したわけではありません。
9-4. ZDMジョブの状態を確認
続いて、query jobコマンドでジョブの状態を確認してみます。
./zdmcli query job -jobid 5
実行結果は以下のとおりです。
※実行時のコマンド全文とファイルパスの一部は省略しています。
Job ID: 5
User: opc
Client: <zdm-client>
Job Type: "MIGRATE"
Scheduled job execution start time: 2026-10-10T13:57:58Z. Equivalent local time: 2026-10-10 13:57:58
Current status: PAUSED
Current Phase: "ZDM_CLONE_PDB_TGT"
Result file path: "/u02/zdm-instant/zdm26.1/zdmbase/chkbase/scheduled/job-5-2026-10-10-13:57:59.log"
Metrics file path: "/u02/zdm-instant/zdm26.1/zdmbase/chkbase/scheduled/job-5-2026-10-10-13:57:59.json"
Job execution start time: 2026-10-10 13:57:59
Job execution end time: 2026-10-10 14:02:51
Job execution elapsed time: 4 minutes 52 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_CLONE_PDB_TGT ............. COMPLETED
ZDM_FINALIZE_TGT .............. PENDING
ZDM_SWITCHOVER_TGT ............ PENDING
ZDM_SWITCHOVER_SRC ............ PENDING
ZDM_NONCDBTOPDB_CONVERSION .... PENDING
ZDM_DATAPATCH_TGT ............. PENDING
ZDM_POST_DATABASE_OPEN_TGT .... PENDING
ZDM_POSTUSERACTIONS ........... PENDING
ZDM_POSTUSERACTIONS_TGT ....... PENDING
ZDM_CLEANUP_SRC ............... PENDING
ZDM_CLEANUP_TGT ............... PENDING
Pause After Phase: "ZDM_CLONE_PDB_TGT"
ここで注目したいのが、以下の部分です。
Current status: PAUSED
Current Phase: "ZDM_CLONE_PDB_TGT"
ジョブの状態がPAUSEDになっており、指定したZDM_CLONE_PDB_TGTで停止していることが確認できました。
また、各フェーズの状態を見ると、
-
ZDM_CLONE_PDB_TGTまで:COMPLETED -
ZDM_FINALIZE_TGT以降:PENDING
となっています。
つまり、PDBクローンの作成までは完了していますが、最終的な切替処理やdatapatchなどはまだ実行されていません。
第8章で確認したフェーズ一覧と比較すると、ZDMがどこまで実行され、どこから処理を再開するのかがよく分かります。
9-5. 次の検証へ
これで、ZDMによるPDBクローン作成フェーズが正常に完了し、指定したタイミングで一時停止できることを確認しました。
ここではまだZDMジョブを再開しません。
この後ジョブを再開すると、切替前の最終リフレッシュを行い、切替処理に入ります。
現状はBaseDB側にアプリケーションの更新が続いているという想定で、定期的にリフレッシュが行われているか確認します。
10. リフレッシュ可能クローンの定期同期を確認
第9章では、ZDMによるPDBクローンの作成が完了し、ジョブがZDM_CLONE_PDB_TGTフェーズで一時停止したことを確認しました。
ここからは、ExaDB-XS側に作成されたBASEPDBがリフレッシュ可能クローンとして構成され、移行元からの差分同期が動作しているか確認してみます!
今回、ZDMのレスポンスファイルでは以下のように指定しています。
ZDM_PDB_CLONE_METHOD=REFRESHABLE
ZDM_PDB_REFRESH_INTERVAL=5
5分間隔で自動リフレッシュする設定です。
10-1. リフレッシュ可能クローンの状態を確認
ExaDB-XSのノード1でoracleユーザーからEXACDBのCDB$ROOTに接続します。
SELECT pdb_name,
status,
refresh_mode,
refresh_interval,
last_refresh_scn
FROM dba_pdbs
WHERE pdb_name = 'BASEPDB';
実行結果はこちらです。
PDB_NAME STATUS REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
---------- ---------- ------ ---------------- ----------------
BASEPDB REFRESHING AUTO 5 5024024
BASEPDBの状態はREFRESHING、REFRESH_MODEはAUTOとなっています。
さらにREFRESH_INTERVAL=5なので、レスポンスファイルで設定した5分間隔の自動リフレッシュが構成されていることを確認できました。
続いて、RACの両インスタンスでPDBの状態を確認してみます。
SELECT inst_id,
name,
open_mode
FROM gv$pdbs
WHERE name = 'BASEPDB'
ORDER BY inst_id;
INST_ID NAME OPEN_MODE
---------- --------------- ---------------
1 BASEPDB MOUNTED
2 BASEPDB MOUNTED
どちらのインスタンスでもMOUNTEDになっています。
この時点では、移行先PDBをアプリケーション向けにREAD WRITEでオープンする段階ではなく、リフレッシュ可能クローンとして差分同期を続ける状態です。
10-2. LAST_REFRESH_SCNの変化を確認
次に、リフレッシュが実際に進んでいるのか確認します。
しばらく時間を置いて、再度DBA_PDBSを確認しました。
SELECT pdb_name,
status,
refresh_mode,
refresh_interval,
last_refresh_scn
FROM dba_pdbs
WHERE pdb_name = 'BASEPDB';
結果はこちらです。
PDB_NAME STATUS REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
---------- ---------- ------ ---------------- ----------------
BASEPDB REFRESHING AUTO 5 6029741
LAST_REFRESH_SCNが5024024から6029741へ進んでいることを確認できました。
| 項目 | SCN |
|---|---|
| 1回目の確認 | 5024024 |
| 2回目の確認 | 6029741 |
10-3. アラートログでリフレッシュ処理を確認
SQLの結果だけでなく、ExaDB-XS側のアラートログも確認してみます。
今回のログには、次の記録がありました。
2026-10-10T14:32:42.044580+00:00
alter pluggable database BASEPDB refresh
2026-10-10T14:32:43.458542+00:00
Recovering pdb-4099 from SCN 5024024 to SCN 6029741
・・・
2026-10-10T14:32:47.408508+00:00
BASEPDB(4):.... (PID:37364): Media Recovery Complete [dbsdrv.c:15840]
Completed: alter pluggable database BASEPDB refresh
・・・
2026-10-10T14:37:42.024058+00:00
alter pluggable database BASEPDB refresh
2026-10-10T14:37:43.633635+00:00
Recovering pdb-4099 from SCN 6029741 to SCN 6031272
・・・
2026-10-10T14:37:46.786304+00:00
BASEPDB(4):.... (PID:171200): Media Recovery Complete [dbsdrv.c:15840]
Completed: alter pluggable database BASEPDB refresh
掲載したログでは、5分間隔でリフレッシュが正常に完了していることを確認できました。
その後もアラートログを眺めている限り、RAC環境のどちらのノードで実行されるかは毎回ランダムのようでした。
10-4. 自動リフレッシュの確認を終えて切替へ進む
これで、ZDMによって作成されたリフレッシュ可能クローンが、5分間隔で自動リフレッシュされていることを確認できました!
ZDMジョブを一時停止している間も、移行元から移行先への差分同期が継続しています。
それでは、ZDMジョブを再開してリフレッシュ可能クローンを通常PDBに切り替え、ExaDB-XS側でREAD WRITEでオープンできる状態にしていきます。
11. ZDMジョブの再開と移行先PDBへの切替
第10章では、リフレッシュ可能クローンが5分間隔で自動リフレッシュされていることを確認しました。
それでは、ZDMジョブを再開し、移行先のBASEPDBを通常PDBへ切り替えてみます!
本番移行では、この再開前に移行元へのアプリケーション更新を停止し、実行中のトランザクションを完了させます。その後、最終リフレッシュの完了と更新データの反映を確認してから、移行先への接続切替と更新再開を行います。本記事に掲載したログでは、更新停止と最終データ照合の詳細は省略しています。
11-1. 切替フェーズまでZDMジョブを再開
第8章で確認したフェーズ一覧を見ると、ZDM_DATAPATCH_TGTの前にZDM_SWITCHOVER_SRCがあります。
今回使用したZDM 26.1.0のビルドと検証環境では、ジョブを最後まで実行しようとしたところ、通常PDBへの切替後もBASEPDBがMOUNTEDのままで、ZDM_DATAPATCH_TGTが失敗しました。
そこで本検証では、ZDM_SWITCHOVER_SRCの完了後に一時停止し、対象PDBを両インスタンスでREAD WRITEでオープンしてから再開しました。詳細はおまけ3に記載します。
通常PDBへの切替後、datapatchの実行前に一時停止してPDBをREAD WRITEでオープンするため、次のように指定してジョブを再開します。
./zdmcli resume job -jobid 5 \
-pauseafter ZDM_SWITCHOVER_SRC
実行ログを確認すると、切替処理が正常に完了しています。
2026-10-10T14:50:31.890Z : Executing phase ZDM_FINALIZE_TGT
2026-10-10T14:50:31.945Z : Execution of phase ZDM_FINALIZE_TGT completed
2026-10-10T14:50:32.256Z : Executing phase ZDM_SWITCHOVER_TGT
2026-10-10T14:51:00.008Z : Switchover actions in the target environment executed successfully
2026-10-10T14:51:00.436Z : Execution of phase ZDM_SWITCHOVER_TGT completed
2026-10-10T14:51:00.585Z : Executing phase ZDM_SWITCHOVER_SRC
2026-10-10T14:51:13.326Z : Switchover actions in the source environment executed successfully
2026-10-10T14:51:15.772Z : Execution of phase ZDM_SWITCHOVER_SRC completed
2026-10-10T14:51:15.830Z : Job execution paused after phase "ZDM_SWITCHOVER_SRC".
指定したZDM_SWITCHOVER_SRCの完了後に、ZDMジョブが一時停止しました!
11-2. ZDMジョブの状態を確認
念のため、query jobで状態を確認します。
./zdmcli query job -jobid 5
主な実行結果は以下のとおりです。
Job ID: 5
Job Type: "MIGRATE"
Current status: PAUSED
Current Phase: "ZDM_SWITCHOVER_SRC"
Job execution elapsed time: 6 minutes 33 seconds
ZDM_CLONE_PDB_TGT ............. COMPLETED
ZDM_FINALIZE_TGT .............. COMPLETED
ZDM_SWITCHOVER_TGT ............ COMPLETED
ZDM_SWITCHOVER_SRC ............ COMPLETED
ZDM_NONCDBTOPDB_CONVERSION .... PENDING
ZDM_DATAPATCH_TGT ............. PENDING
ZDM_POST_DATABASE_OPEN_TGT .... PENDING
ZDM_POSTUSERACTIONS ........... PENDING
ZDM_POSTUSERACTIONS_TGT ....... PENDING
ZDM_CLEANUP_SRC ............... PENDING
ZDM_CLEANUP_TGT ............... PENDING
Pause After Phase: "ZDM_SWITCHOVER_SRC"
ZDM_SWITCHOVER_SRCまでCOMPLETEDになっており、ZDM_DATAPATCH_TGTはまだPENDINGです。
想定どおり、切替処理後、datapatchの前で停止できました。
11-3. 移行先PDBの状態を確認
次に、ExaDB-XS側のEXACDBに接続し、BASEPDBの状態を確認します。
SELECT pdb_name,
status,
refresh_mode,
refresh_interval,
last_refresh_scn
FROM dba_pdbs
WHERE pdb_name = 'BASEPDB';
PDB_NAME STATUS REFRES REFRESH_INTERVAL LAST_REFRESH_SCN
---------- ---------- ------ ---------------- ----------------
BASEPDB NEW NONE 6032544
REFRESH_MODEがAUTOからNONEへ変化していました。
つまり、リフレッシュ可能クローンから通常PDBへの切替が行われ、自動リフレッシュが解除された状態になっています。
続いて、RACの両インスタンスでの状態を確認します。
SELECT inst_id,
name,
open_mode
FROM gv$pdbs
WHERE name = 'BASEPDB'
ORDER BY inst_id;
INST_ID NAME OPEN_MODE
---------- --------------- ---------------
1 BASEPDB MOUNTED
2 BASEPDB MOUNTED
両方ともMOUNTED状態です。
今回はREFRESH_MODE=NONEになり、ZDMジョブも一時停止していることを確認できたので、BASEPDBを手動でオープンします。
11-4. BASEPDBをRAC両ノードでREAD WRITEでオープン
EXACDBのCDB$ROOTで、以下を実行します。
ALTER PLUGGABLE DATABASE BASEPDB
OPEN READ WRITE INSTANCES=ALL;
実行結果:
Pluggable database altered.
再度、PDBの状態を確認してみます。
SELECT pdb_name, status, refresh_mode
FROM dba_pdbs
WHERE pdb_name = 'BASEPDB';
PDB_NAME STATUS REFRES
---------- ---------- ------
BASEPDB NORMAL NONE
STATUSがNORMALになりました。続いてRACの両インスタンスも確認します。
SELECT inst_id, name, open_mode
FROM gv$pdbs
WHERE name = 'BASEPDB'
ORDER BY inst_id;
INST_ID NAME OPEN_MODE
---------- --------------- ---------------
1 BASEPDB READ WRITE
2 BASEPDB READ WRITE
両ノードでREAD WRITEになりました!
これで、ExaDB-XSの2ノードRAC上でBASEPDBをオープンできたことを確認できました。
今回はZDM_SWITCHOVER_SRCの完了後に一時停止させたことで、後続のdatapatchが始まる前にPDBの状態を確認し、必要なオープン処理を実施できました。
11-5. ZDMジョブを再開して移行を完了
移行先BASEPDBがRACの両インスタンスでREAD WRITEになったので、残りのZDM処理を実行します。
今度は-pauseafterを指定せず、そのまま最後まで実行してみます。
./zdmcli resume job -jobid 5
実行すると、すでに完了している切替フェーズなどはスキップされ、後続の処理が実行されました。
2026-10-10T14:54:39.541Z : Resuming zero downtime migrate operation ...
Skipping phase ZDM_CLONE_PDB_TGT on resume
Skipping phase ZDM_FINALIZE_TGT on resume
Skipping phase ZDM_SWITCHOVER_TGT on resume
Skipping phase ZDM_SWITCHOVER_SRC on resume
Executing phase ZDM_NONCDBTOPDB_CONVERSION
Skipping 'ZDM_NONCDBTOPDB_CONVERSION' actions as no further operations are needed ...
Execution of phase ZDM_NONCDBTOPDB_CONVERSION completed
今回はPDBからPDBへの移行なので、非CDBからPDBへの変換処理自体はスキップされています。
続いて、ZDM_DATAPATCH_TGTフェーズに進みます。
2026-10-10T14:55:32.243Z : Executing phase ZDM_DATAPATCH_TGT
2026-10-10T14:55:36.246Z : Target environment prepared for datapatch successfully
<target-node1>: trying datapatch run for exacdb1, attempt### 1 ###
<target-node1>: datapatch command ... -pdbs basepdb -db exacdb1 datapatch completed successfully for database : exacdb
<target-node2>: trying datapatch run for exacdb1, attempt### 1 ###
<target-node2>: datapatch command ... -pdbs basepdb -db exacdb1 datapatch completed successfully for database : exacdb
2026-10-10T14:56:53.431Z : Execution of phase ZDM_DATAPATCH_TGT completed
datapatchも正常に完了しました!続いて、後処理とクリーンアップが実行されます。
Executing phase ZDM_POST_DATABASE_OPEN_TGT
Post database open actions at the target executed successfully
Execution of phase ZDM_POST_DATABASE_OPEN_TGT completed
Executing phase ZDM_CLEANUP_SRC
Removed the Oracle Data Guard configuration successfully
Cleanup steps performed at the source host
Execution of phase ZDM_CLEANUP_SRC completed
Executing phase ZDM_CLEANUP_TGT
Removed the Oracle Data Guard configuration successfully
Standby log file groups dropped successfully from database exacdb
Cleanup steps performed at the target host
Execution of phase ZDM_CLEANUP_TGT completed
最後に、以下のメッセージが表示されました。
2026-10-10T14:57:30.574Z : Oracle ZDM ONLINE PHYSICAL migration completed
2026-10-10T14:57:30.578Z : Job duration: 2 minutes and 53 seconds
無事にZDMによるBaseDBからExaDB-XSへのPDB移行が完了しました!
今回は、リフレッシュ可能クローンを作成した後にジョブを一時停止し、差分同期を確認してから最終切替を実施しました。
さらに、切替後のZDM_SWITCHOVER_SRCフェーズでも一時停止させることで、datapatch実行前に移行先PDBの状態を確認し、RAC両ノードでREAD WRITEでオープンしてから残りの処理を実行しています。
11-6. ZDMジョブの最終状態を確認
最後に、ZDMジョブが正常に終了したか確認します。
./zdmcli query job -jobid 5
実行結果はこちらです。
※実行コマンド全文やログファイルのパスは一部省略しています。
Job ID: 5
User: opc
Client: <zdm-client>
Job Type: "MIGRATE"
Current status: SUCCEEDED
Job execution start time: 2026-10-10 13:57:59
Job execution end time: 2026-10-10 14:57:30
Job execution elapsed time: 9 minutes 26 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_CLONE_PDB_TGT ............. COMPLETED
ZDM_FINALIZE_TGT .............. COMPLETED
ZDM_SWITCHOVER_TGT ............ COMPLETED
ZDM_SWITCHOVER_SRC ............ COMPLETED
ZDM_NONCDBTOPDB_CONVERSION .... COMPLETED
ZDM_DATAPATCH_TGT ............. COMPLETED
ZDM_POST_DATABASE_OPEN_TGT .... COMPLETED
ZDM_POSTUSERACTIONS ........... COMPLETED
ZDM_POSTUSERACTIONS_TGT ....... COMPLETED
ZDM_CLEANUP_SRC ............... COMPLETED
ZDM_CLEANUP_TGT ............... COMPLETED
Current status: SUCCEEDEDになりました!
すべてのフェーズがCOMPLETEDとなっており、PDBクローン作成から切替、datapatch、後処理、クリーンアップまで正常に終了しています。
ちなみに、今回は途中で2回ジョブを一時停止しています。
| 処理 | 実行時間 |
|---|---|
| クローン作成まで | 4分52秒 |
| 最終切替まで | 約1分41秒 |
| datapatch・後処理 | 2分53秒 |
| 合計 | 9分26秒 |
ジョブの開始時刻は13:57:59、終了時刻は14:57:30なので、全体では約1時間かかっています。
ただし、その大部分はリフレッシュ可能クローンの自動リフレッシュを確認したり、移行先PDBの状態を確認したりするための一時停止時間です。
ZDMが実際に処理していた時間は合計9分26秒でした。
今回は検証用の小規模なPDBなので、もちろんデータ量や環境によって実行時間は異なります。
これで、ZDM 26.1のInstant Deployとリフレッシュ可能クローンを使ったBaseDBからExaDB-XSへの移行が完了しました!
次は、移行先のExaDB-XSでPDBの状態やRAC両ノードからの利用、アプリケーション接続を確認してみます。
12. 移行後の動作確認
第11章で、ZDMジョブがSUCCEEDEDとなり、BaseDBからExaDB-XSへのPDB移行が正常に完了しました!
最後に、移行先PDBが両RACインスタンスでREAD WRITEになっていることを確認し、SCAN経由のSQL*Plus接続とSOEスキーマのデータ参照を確認します。
12-1. 移行先データベースとPDBの状態を確認
まずはExaDB-XSのノード1で、oracleユーザーからEXACDBに接続します。
CDBの情報を確認します。
SHOW CON_NAME;
SELECT name, db_unique_name, database_role
FROM v$database;
実行結果:
CON_NAME
------------------------------
CDB$ROOT
NAME DB_UNIQUE_NAME DATABASE_ROLE
--------------- ------------------------------ ----------------
EXACDB exacdb PRIMARY
移行先のEXACDBに接続しており、データベースロールはPRIMARYになっています。
続いて、BASEPDBの状態を確認します。
SELECT pdb_name,
status,
refresh_mode,
refresh_interval,
last_refresh_scn
FROM dba_pdbs
WHERE pdb_name = 'BASEPDB';
実行結果:
PDB_NAME STATUS REFRESH_MODE REFRESH_INTERVAL LAST_REFRESH_SCN
--------------- --------------- --------------- ---------------- ----------------
BASEPDB NORMAL NONE 6032544
STATUS=NORMAL、REFRESH_MODE=NONEであり、通常PDBとして構成されていることを確認できました。
次に、RACの両インスタンスにおけるPDBの状態を確認してみます。
SELECT inst_id,
name,
open_mode
FROM gv$pdbs
WHERE name = 'BASEPDB'
ORDER BY inst_id;
実行結果:
INST_ID NAME OPEN_MODE
---------- --------------- ---------------
1 BASEPDB READ WRITE
2 BASEPDB READ WRITE
両インスタンスともREAD WRITEになっています。
これで、ExaDB-XSの2ノードRAC上でBASEPDBがオープンされていることを確認できました。
データベース再起動後もPDBが自動的にオープンされるよう、状態を保存しておきます。
ALTER PLUGGABLE DATABASE BASEPDB
SAVE STATE INSTANCES=ALL;
SELECT con_name,
instance_name,
state
FROM dba_pdb_saved_states
WHERE con_name = 'BASEPDB';
実行結果:
CON_NAME INSTANCE_N STATE
---------- ---------- --------------
BASEPDB exacdb1 OPEN
BASEPDB exacdb2 OPEN
exacdb1とexacdb2の両方でOPENが保存されました。
12-2. リスナーへのサービス登録を確認
PDBがオープンできていても、接続に使用するサービスがリスナーに登録されていなければ、アプリケーションから接続できません。
そこで、ExaDB-XSのノード1でgridユーザーに切り替えて、リスナーの状態を確認します。
sudo su - grid
lsnrctl status
出力されたサービス一覧を確認すると、次のサービスが登録されていました。
Services Summary...
Service "basepdb.example.oraclevcn.com" has 1 instance(s).
Instance "exacdb1", status READY, has 1 handler(s) for this service...
The command completed successfully
BASEPDBのサービスが自動的に登録され、インスタンスの状態がREADYであることを確認できました。
12-3. SCAN経由でBASEPDBへ接続
最後に、移行先のExaDB-XSへSQL*Plusで接続してみます!
今回はExaDB-XSのノード1から、SCAN名とPDBサービス名を指定して接続しました。
sqlplus -L 'soe@//<target-scan>:1521/basepdb.example.oraclevcn.com'
SHOW USER;
SHOW CON_NAME;
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service_name,
SYS_CONTEXT('USERENV', 'INSTANCE_NAME') AS instance_name
FROM dual;
SELECT COUNT(*) AS customer_count
FROM soe.customers;
USER is "SOE"
CON_NAME
------------------------------
BASEPDB
SERVICE_NAME INSTANCE_NAME
-------------------------------------------------- --------------------
basepdb.example.oraclevcn.com exacdb1
CUSTOMER_COUNT
--------------
1051319
SCAN経由でBASEPDBへ接続し、接続先インスタンスがexacdb1であることと、SOE.CUSTOMERSを参照できることを確認しました。
13. まとめ
今回は、ZDM 26.1のInstant Deployとリフレッシュ可能クローンを使って、BaseDBのOCPU環境からExaDB-XSの2ノードRAC環境へPDBを移行してみました!
以前はOCIコンソールからBaseDB間でリフレッシュ可能クローンを作成してみましたが、今回はZDMを使うことで、BaseDBからExaDB-XSへの移行も実現できました。
実際に試してみて、特に印象に残ったのは以下の点です。
-
Instant Deployが便利!
ExaDB-XSのノード1にZDMを配置して実行できたので、今回の検証では専用のZDMサーバーを別途用意する必要がありませんでした。 -
リフレッシュ可能クローンの差分同期が問題なく動作した!
ZDM_PDB_REFRESH_INTERVAL=5を指定することで、5分間隔の自動リフレッシュを構成できました。実際にアラートログを確認すると、14:32と14:37にリフレッシュが実行され、SCNが進んでいることも確認できました。 -
-pauseafterで移行処理を段階的に進められた!
今回はZDM_CLONE_PDB_TGTで一度停止して自動リフレッシュを確認し、その後ZDM_SWITCHOVER_SRCでも停止させました。各段階でPDBの状態を確認しながら進められるのは便利ですね。 -
ExaDB-XSの2ノードRACでPDBを利用できた!
切替後はBASEPDBがNORMAL / NONEとなり、exacdb1とexacdb2の両インスタンスでREAD WRITEになりました。さらに、SCAN経由でSOEユーザーによる接続とデータ参照にも成功しています。
今回のZDMジョブは、最終的に以下の結果となりました。
| 項目 | 結果 |
|---|---|
| 移行元 | BaseDB OCPU / BASEPDB |
| 移行先 | ExaDB-XS 2ノードRAC / BASEPDB |
| ZDMバージョン | 26.1.0 |
| 移行方式 | リフレッシュ可能クローン |
| 自動リフレッシュ間隔 | 5分 |
| ZDMジョブの最終状態 | SUCCEEDED |
| ZDMの実行時間 | 9分26秒 |
| ジョブ開始から終了まで | 約59分31秒(検証のための一時停止時間を含む) |
途中で自動リフレッシュの動作確認などを行ったため、開始から終了までは約1時間かかりましたが、ZDMに記録された処理時間の合計は9分26秒でした。
もちろん、実行時間はPDBのサイズやシステムの構成などによって変わりますし、実際の本番移行ではアプリケーションの更新停止、最終同期、接続先の切替なども計画する必要があります。
また、今回の検証では切替後のPDBがMOUNTEDのままとなったため、ZDM_SWITCHOVER_SRCの完了後に一時停止し、両インスタンスでREAD WRITEでオープンしてからZDMを再開することで、datapatchも正常に完了できました。
検証中に発生したトラブルと対処内容は、記事末尾のおまけ1〜3にまとめています。
ZDM 26.1ではPDBクローンによる移行ができるようになり、Instant Deployも組み合わせることで、BaseDBからExaDB-XSへの移行を比較的シンプルな手順で実施できることが分かりました!
BaseDBからExaDB-XSへの移行を検討している方の参考になれば幸いです。
おまけ1. ZDMのセットアップ時に容量不足でエラー
発生した事象
最初はZDMを、空き容量の少ないファイルシステムに配置していました。
その状態でzdmcliを実行したところ、初期セットアップでエラーになりました。
原因
setup.logを確認すると、ZDMの配置先には10GiB以上の空き容量が必要であることが分かりました。
minimum required free storage space 10485760 kb for '/home/opc/zdm/zdm26.1/zdmhome'
検証環境では、当初配置しようとしていた領域の空き容量が足りませんでした。
対処
十分な空き容量がある/u02へZDMキットを移動しました。
/u02/zdm-instant/zdm26.1
移動後、再度zdmcliを実行すると初期セットアップが正常に完了しました。
Instant Deployとはいえ、ZDMの展開先にある程度の空き容量が必要なので注意が必要です。
おまけ2. GLOBAL_NAMES=TRUEでORA-02085
発生した事象
最初のZDM移行ジョブでは、ZDM_PREPARE_TGTフェーズでエラーが発生しました。
Failed at phase: ZDM_PREPARE_TGT
PRGO-4086:
failed to query the "DB_LINK" details
SELECT count(*) FROM dual@ZDM_DBLINK_2
ORA-02085:
database link ZDM_DBLINK_2...
connects to BASEPDB...
原因
調べてみると、ExaDB-XS側のGLOBAL_NAMES初期化パラメータがTRUEになっていました。
GLOBAL_NAMES=TRUEでは、DB Link名と接続先データベースのグローバル名の一致が要求されます。
今回、ZDMが作成したDB Link名と接続先データベースのグローバル名が一致しておらず、ORA-02085となっていました。
対処
ExaDB-XSのCDB$ROOTでGLOBAL_NAMESを確認します。
SELECT inst_id, name, value
FROM gv$system_parameter
WHERE name = 'global_names';
今回のExaDB-XS側ではGLOBAL_NAMESがTRUEで、ZDMが生成したDB Link名と接続先のグローバル名が一致せず、ORA-02085が発生しました。
この検証では、移行先EXACDBのCDB$ROOTでGLOBAL_NAMESをFALSEに変更し、両RACインスタンスの値を確認しました。既存のDB Link運用に対する影響を確認してから変更してください。
ALTER SYSTEM SET global_names=FALSE
SCOPE=BOTH SID='*';
変更後、ZDMジョブを再開します。
./zdmcli resume job -jobid 2
今度はZDM_PREPARE_TGTが正常に完了し、PDBクローンの作成まで進みました。
既存のDB Linkの運用ルールがある環境では、GLOBAL_NAMESの変更による影響を確認する必要があります。
おまけ3. PDBをオープンしないままdatapatchが実行されてエラー
発生した事象
リフレッシュ可能クローンの動作確認後、ZDMジョブを再開したところ、ZDM_DATAPATCH_TGTでエラーになりました。
Failed at phase: ZDM_DATAPATCH_TGT
Some of the -pdbs containers were not open.
Bad containers: BASEPDB
原因
このとき、ExaDB-XS側のPDBは通常PDBへの変換が完了していました。
PDB_NAME STATUS REFRESH_MODE
--------- ---------- ------------
BASEPDB NEW NONE
しかし、RACの両インスタンスでPDBはまだMOUNTEDでした。
INST_ID NAME OPEN_MODE
------- -------- ----------
1 BASEPDB MOUNTED
2 BASEPDB MOUNTED
つまり、リフレッシュ可能クローンから通常PDBへの変換は完了していたものの、PDBをREAD WRITEでオープンする前にdatapatchが実行されたという状態です。
対処
REFRESH_MODE=NONEになっていることを確認してから、CDB$ROOTで以下を実行しました。
ALTER PLUGGABLE DATABASE BASEPDB
OPEN READ WRITE INSTANCES=ALL;
両ノードでREAD WRITEになったことを確認します。
SELECT inst_id, name, open_mode
FROM gv$pdbs
WHERE name = 'BASEPDB'
ORDER BY inst_id;
INST_ID NAME OPEN_MODE
------- -------- ----------
1 BASEPDB READ WRITE
2 BASEPDB READ WRITE
その後、ZDMジョブを再開しました。
./zdmcli resume job -jobid 2
今度はdatapatchが正常に完了し、ZDMジョブもSUCCEEDEDとなりました。
参考資料
- Oracle Zero Downtime Migration 26.1 Documentation
- Oracle Zero Downtime Migration 26.1 Release Notes
- Preparing for a Physical Database Migration — Migration Using PDB Clone
- Performing Migration Using the Instant Deploy Feature
- Migrating Your Database with Zero Downtime Migration — Pause/Resume
- Zero Downtime Migration Physical Migration Response File Parameters Reference
- Oracle ZDM 26.1 Instant Deploy End-to-End Physical PDB Cloning
- OCI Base Database Serviceについて
- ExaDB-XSの概要
