Oracle Database@AzureのExaDB-XSへData Pumpで移行してみた

## はじめに
本記事では、Oracle Database@AzureのExadata Database Service on Exascale Infrastructure (ExaDB-XS)へ、Oracle Data Pumpを使用してデータ移行を行う方法を紹介します。

今回利用するExaDB-XSの環境は、以下の記事と同様の手順で作成しています。

https://qiita.com/yunagash/items/cd848c4a9b585be561e6

## 今回構成するアーキテクチャ
今回は、以下の図のように、自宅のPCから踏み台サーバーにRDP接続をし、そこからOracle Database@Azure上のExaDB-XSへSSH接続し、SCPコマンドでダンプファイルを転送したうえでインポートを行っていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/f864b69f-3d07-40c2-a201-05c0739bfcc5.png)

## 事前準備
### ①エクスポート済のダンプファイルの準備
事前準備として、まずは手元のPCにエクスポート済のダンプ・ファイルを用意します。
今回は、こちらのリンクの「はじめに」の章にある、以下の4つのダンプファイルを自身のPCにダウンロードしておきます。

https://oracle-japan.github.io/ocitutorials/adb/adb303-datapump/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/f0bddd5b-e366-4c0f-9caf-e35e003e7e14.png)

### ②仮想ネットワークにSSHのイングレス・ルールを追加
OCIに移動して、Network Security GroupにSSHのイングレス・ルールを追加していきます。
Networkingの項目の中の「**Go to OCI**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/241dfcba-7a7f-483e-bba7-a9c8120f630f.png)

OCIにサインインできたら、Network Security Groupの詳細画面に遷移します。
「**ルールの追加**」からSSHの設定を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/25926cec-a484-42aa-961f-1e1c418a6249.png)

以下のようにルールを入力できたら、「**追加**」をクリックします。
ソースCIDRに関しては、セキュリティ要件に応じて設定を絞るなど可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/79aca7d2-1108-4bdb-9892-fefd98fdbabc.png)

SSHのルールが追加されたこの作業は完了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/703fa5f1-73b9-419e-b132-1aedb34aa1eb.png)

### ③踏み台サーバーの構築
再びAzureポータルに戻って、仮想マシンで踏み台サーバーを構築していきます。
構築方法に関しては、以下の記事の「**Database Actionsに接続するまでの手順**」の「**①踏み台サーバーの作成**」をご確認ください。
リソースグループや名前、リージョンなどは、ExaDB-XSに合わせて変更してください。基本的な設定項目はほとんど変わりません。

https://qiita.com/yunagash/items/27001de1a602a59d9225

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/432b7531-593b-4e6d-97b0-f825e842ef50.png)

### ④RDPで踏み台サーバーに接続
踏み台サーバーの作成が完了したら、その作成したWindowsサーバーにRDPで接続していきます。
同様に、以下の記事の「**Database Actionsに接続するまでの手順**」の「**②RDPでコンピュートに接続**」を参考にRDP接続をやってみましょう。

https://qiita.com/yunagash/items/27001de1a602a59d9225

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/752d95e1-d117-4388-8829-84ff1278a96b.png)

## ExaDB-XS@AzureへのData Pump移行フロー
踏み台サーバーにRDP接続が完了したところから説明していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/bdf531c9-3b44-4b40-ac0c-b34fdb150e40.png)
### 1⃣ダンプファイルとSSHの秘密鍵を踏み台サーバーに配置する
手元のPCにダウンロードしてあるダンプファイルと秘密鍵を「**Ctrl + C**」でコピーして、踏み台サーバーのエクスプローラーの「**Download**」フォルダ上で、「**Ctrl + V**」で張り付けします。
これだけで、踏み台サーバー上に使用するファイルを配置することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/cbd0029d-73eb-47c8-955d-533b3e789898.png)

### 2⃣ExaDB-XSにSSH接続する
まずは、OCIコンソールでVMクラスタの詳細を開いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/a4ea7122-a67a-471b-88b0-308dffe04a93.png)

下の方にスクロールして、リソースの中から「**仮想マシン**」を選択後、「**プライベートIPアドレスおよびDNS名**」のIPアドレスをメモします。
今回、2つのノードで構成されているので2つありますが、どちらに接続しても問題ありません。
ExaDB-XSはRAC構成なので、どちらのノードも同じデータベースクラスタの一部となっているからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/304d0211-3d20-4269-bcb0-3e5a3fb97160.png)

今度は、踏み台サーバーのRDPの画面に戻り、コマンドプロンプトを起動して、SSH接続のコマンドを入力します。
```bash:ExaDB-XSにSSH接続
ssh -i "<秘密鍵ファイルのフルパス>" opc@<ExaDB-XSノードのIPアドレス>
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/455a81bc-9297-4c12-aa03-67197bc9dd19.png)

### 3⃣ExaDB-XS上で保存ディレクトリとパラメータファイルを作成する
Data Pumpで使用するダンプファイルを配置するためのディレクトリをExaDB-XS上に作成していきます。
このディレクトリは、SCPコマンドでファイルを転送したり、impdp実行時に参照するOracle Directoryオブジェクトとして利用されます。
一旦、opcユーザーのホームに以下にディレクトリを作り、パラメータファイルを配置した後、Oracleユーザーのディレクトリにそれらを移動させていきます。
```bash:ダンプファイルの保存ディレクトリを作成
mkdir -p /home/opc/dump
chmod 755 /home/opc/dump
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/04284436-862f-4d32-980b-519e0f60ed83.png)

あわせて、ダンプファイルをインポートする用のパラメータファイル (inpdp_hr.par)もこのディレクトリに作成しておきます。
```bash:パラメータファイルの作成
vi /home/opc/dump/impdp_hr.par
```
impdp_hr.parの編集画面が表示されるので、以下のパラメータを入力し、「**:wq**」で保存して閉じます。
※hrスキーマに関しては、後述するので一旦このように入力してください。
```bash:パラメータファイルの中身
directory=dpdir
schemas=HR
dumpfile=export_hr_%U.dmp
logfile=import_hr.log
```
これらのディレクトリをopcからoracleに移動させていきます。
```bash:ディレクトリをopcからoracleへ移動
sudo mv /home/opc/dump /home/oracle/
sudo chown -R oracle:oinstall /home/oracle/dump
```

### 4⃣踏み台サーバーからExaDB-XSへダンプファイルをSCPで転送
一度SSH接続を切断し、踏み台サーバーからExaDB-XSへダンプファイルをSCPで転送します。
以下のbashのフォルダやファイル名は、自分用にカスタマイズしてお使いください。
また、ダンプファイルのファイルが複数あるので、ワイルドカード(*)を使ってパターン化しています。
```bash:ダンプファイルの保存ディレクトリを作成
scp -i "C:\Users\ExaDB-XS\Downloads\Exascale_Key.pem" ^
"C:\Users\ExaDB-XS\Downloads\export_hr_0*.dmp" opc@10.0.1.204:/home/opc/dump/ 
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/0ecea7f6-b41e-428a-a44d-58ec58b3e3a2.png)

### 5⃣Oracleユーザーに切り替えて環境変数を設定
もう一度、ExaDB-XSにSSH接続し、ocpユーザーからOracleユーザーに切り替えて環境変数を設定していきます。
ExaDB-XSの23aiの場合だと、以下のコマンドで問題ありません。
```bash:Oracleユーザーに切り替えて環境変数を設定
sudo su - oracle
export ORACLE_HOME=/u02/app/oracle/product/23.0.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/d7a18f5d-3ae7-42e4-942d-332398b2a80b.png)

:::note info
**<参考>**
もし他のDBバージョンで、パスを調べたい場合は、以下のコマンドを実行して確認可能です。
sqlplusの位置を探せば、対応するORACLE_HOME がわかります。
```bash
find / -name sqlplus 2>/dev/null
```
:::

### 6⃣リスナー経由でSQL*PlusでPDBに接続
Oracleユーザーに切り替えます。
その後、ディレクトリ作成やData PumpをPDB内で操作するため、SQL*PlusでPDBに接続していきます。
```bash:SQL*PlusでPDBに接続
sqlplus sys/<パスワード>@//<接続文字列> as sysdba
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/da29c14d-af23-48f3-ab9f-0f30d7edb4b1.png)

**接続文字列**に関しては、OCIコンソール上の「**プラガブル・データベースの詳細**」から確認することができます。
まずは、OCIコンソールでVMクラスタの詳細を開いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/a4ea7122-a67a-471b-88b0-308dffe04a93.png)

下の方にスクロールして、リソースの中から「**コンテナ・データベース**」を選択後、作成したCDBをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/a1e7147f-1dc9-48c2-8c86-367f2e67dc74.png)

CDBの詳細画面に遷移したら、また下の方へスクロールし、リソースの中から「**プラガブル・データベース**」を選択後、作成したPDBをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/90a921c0-a2ef-49c0-b129-5f98fe70ac02.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/f1af77a1-5e3b-4ad0-b35d-a28b960bf061.png)

「**PDB接続**」をクリック後、「**簡易接続**」の行の「**接続文字列**」をコピーして先ほどのコマンド部分に貼り付けます。
今回、2つのノードで構成されているので2つありますが、どちらに接続しても問題ありません。
ExaDB-XSはRAC構成なので、どちらのノードも同じデータベースクラスタの一部となっているからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/304d0211-3d20-4269-bcb0-3e5a3fb97160.png)

### 7⃣SQL*PlusでOracle Directoryオブジェクトを作成します
SQL*Plusに接続てきたら、以下のコマンドを入力していきます。
内容としては、ディレクトリ・オブジェクトを作成し、ダンプファイルの出力先をデータベースに登録します。
```SQL:Oracle Directoryオブジェクトの作成
CREATE OR REPLACE DIRECTORY dpdir AS '/home/oracle/dump';
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/9c33fb3e-ddcc-416d-862f-06467788ed90.png)


### 8⃣インポート先のユーザー (HR)を作成し、ディレクトリ・オブジェクトに対する操作権限を付与します
以下の内容に沿って、Data Pumpインポートの受け皿である「**HR**」スキーマを作成し、操作権限の付与を行っていきます。
※今回のダンプファイルであるexport_hr_01.dmpの中身がHRスキーマのテーブルのため、インポート先にも HRスキーマが必要になるからです。
```SQL:HRというユーザーをパスワード付きで作成
CREATE USER HR IDENTIFIED BY <任意のパスワード>;
```
```SQL:データベースにログインできる最低限の権限を付与
GRANT CONNECT, RESOURCE TO HR;
```
```SQL:テーブルスペース使用制限を無効化
GRANT UNLIMITED TABLESPACE TO HR;
```
```SQL:ディレクトリ・オブジェクトに対する操作権限をHRスキーマに付与
GRANT READ, WRITE ON DIRECTORY dpdir TO HR;
```
<実行例>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/8411813c-9785-4048-b109-8f21590722cd.png)

### 9⃣impdpを実行してインポートします
SQL*Plusからexitしたら、Oracleユーザーでimpdpを実行して、ダンプファイルをインポートしていきます。
<パスワード>にはHRスキーマを作成したときのパスワードを、<接続文字列>には6⃣でOCI上で確認した接続文字列を入力してください。
```bash:ダンプファイルをインポート
impdp HR/<パスワード>//<接続文字列> parfile=/home/oracle/dump/impdp_hr.par
```

```:実行結果
[oracle@azurexs1-nvnfn ~]$ impdp HR/WelCome123##@//azurexs-scan-eyewb.ociclientsubne.ociexascalevne.oraclevcn.com:1521/AzureCDB_AZUREPDB1.paas.oracle.com parfile=/home/oracle/dump/impdp_hr.par

Import: Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems on Mon Apr 14 21:14:15 2025
Version 23.7.0.25.01

Copyright (c) 1982, 2025, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 23ai EE Extreme Perf Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
Master table "HR"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "HR"."SYS_IMPORT_SCHEMA_01":  HR/********@//azurexs-scan-eyewb.ociclientsubne.ociexascalevne.oraclevcn.com:1521/AzureCDB_AZUREPDB1.paas.oracle.com parfile=/home/oracle/dump/impdp_hr.par



　　　～～～～～一部省略～～～～～


Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HR"."EMPLOYEES"                              8.7 KB     107 rows
. . imported "HR"."LOCATIONS"                                6 KB      23 rows
. . imported "HR"."JOB_HISTORY"                            5.3 KB      10 rows
. . imported "HR"."JOBS"                                   5.4 KB      19 rows
. . imported "HR"."DEPARTMENTS"                            5.4 KB      27 rows
. . imported "HR"."COUNTRIES"                              5.2 KB      25 rows
. . imported "HR"."REGIONS"                                4.9 KB       4 rows
. . imported "HR"."NG_TAB_4ADW"                              0 KB       0 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "HR"."SYS_IMPORT_SCHEMA_01" completed with 12 error(s) at Mon Apr 14 21:15:22 2025 elapsed 0 00:00:58
```

最後に、実際にデータ移行ができているか確認するために、SQL*Plusでログインして確認してみます。
例として、以下のコマンドで、HRスキーマのCOUNTRIES表の件数を見てみます。25件であれば大丈夫です！
```SQL:HRスキーマのCOUNTRIES表の件数確認
select count(1) from hr.COUNTRIES;
```
```:実行結果
  COUNT(1)
----------
        25
```

※ところどころエラーが起きている個所はありますが、データは全て正常にインポートされています。
出ているエラーは、権限不足による一部のDDL失敗 (ユーザー作成やGRANTなど)によるものです。

## まとめ
今回は、Oracle Database@AzureのExaDB-XSへData Pumpによる移行作業を実施しました。
他にもOracleのマルチクラウドに関する記事を発信しているので、以下の関連記事も合わせてご参考ください。

## 関連記事
:::note info
**Oracle Database@Azureに関して**
* [Oracle Database@Azureについてまとめてみた](https://qiita.com/yunagash/items/e603ef227928824921a3)
* [Oracle Database@AzureをPAYGで利用する手順](https://qiita.com/yunagash/items/1073a8a69cf4f0448960)
* [Oracle Database@AzureでADBをプロビジョニングしてみた](https://qiita.com/yunagash/items/4e17c84c8af4335f8465)
* [Oracle Database@AzureでADBのDatabase Actionsに接続してみた](https://qiita.com/yunagash/items/27001de1a602a59d9225)
* [Oracle Database@AzureのADBへData Pumpで移行してみた](https://qiita.com/yunagash/items/037d00df68d8f17fc144)
* [Oracle Database@Azureでのリージョン数のService Limit引き上げ方法](https://qiita.com/yunagash/items/60036ef2f585d8ab75bf)
* [Oracle Database@AzureでExaDB-XSをプロビジョニングしてみた](https://qiita.com/yunagash/items/cd848c4a9b585be561e6)
* [Oracle Database@AzureのExaDB-XSへData Pumpで移行してみた](https://qiita.com/yunagash/items/e8886945aa33e249132d)
:::

:::note info
**Oracle Database@AWSに関して**
* [Oracle Database@AWSについてまとめてみた](https://qiita.com/yunagash/items/5f6565db017e20d20a34)
:::

:::note info
**Oracle Database@Googleに関して**
* [Oracle Database@Google Cloudについてまとめてみた](https://qiita.com/yunagash/items/478e9a10f80ebcc45804)
* [Oracle Database@Google CloudでADBをプロビジョニングしてみた](https://qiita.com/yunagash/items/e44bde42f1bcebacceba)
* [Oracle Database@Google CloudでADBのDatabase Actionsに接続してみた](https://qiita.com/yunagash/items/c9443e866bbaa15d4ce8)
* [Oracle Database@Google CloudのADBでコンソール上でできる操作をまとめてみた](https://qiita.com/yunagash/items/5eb02f8482c5724582dd)
* [Oracle Database@Google CloudでCloud DNSの課金が発生する理由](https://qiita.com/yunagash/items/899b05803aae4103c042)
:::


## 編集履歴
* 2025/04/15 記事公開