Autonomous DBをエクスポート・インポートする方法のまとめ

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
Autonomous Database (ADB)で<strong>Data Pump</strong>ファイルをエクスポート・インポートするのに、いくつかの方法があります。各種の方法をまとめてみたいと思います。

本ブログでは、オフィシャルな製品・サービスのみを含め、サードパーティーの製品については言及しません。

__索引__
- [エクスポート・インポート方法](#エクスポートインポート方法)
  - [expdp/impdpコマンド](#expdpimpdpコマンド)
  - [SQLcl の "dp export/import" コマンド](#sqlcl-の-dp-exportimport-コマンド)
  - [SQL Developer (GUI)](#sql-developer-gui)
  - [データベース・アクション (OCIコンソール)](#データベースアクション-ociコンソール)
  - [Oracle Data Pump API](#oracle-data-pump-api)
- [エクスポートの出力先](#エクスポートの出力先)
  - [ローカル・ファイル・システム](#ローカルファイルシステム)
  - [OCIオブジェクト・ストレージへ](#ociオブジェクトストレージへ)
  - [OCIファイル・ストレージへ](#ociオブジェクトストレージへ)
  - [出力先の比較](#出力先の比較)

# エクスポート・インポート方法
## expdp/impdpコマンド
__前提__
- ADBに接続できる端末から実施（例: OCI VM, On-Pクライアント）
- 実施端末に、Oracle Clientのインストールは必要。インストール手順は、次の記事の"STEP 1-5"をご参照ください。(OS: Oracle Linux 8)
[Autonomous DBからOCIオブジェクト・ストレージへデータ・ポンプをエクスポートする手順](https://qiita.com/letian/items/c6117d784b55b210403c)

__コマンド例__
次の例の出力先は、OCIオブジェクト・ストレージです。

エクスポート：
```
expdp DATA_PUMP_USER/<password>@adw_high \
  credential=<credential_name> \
  dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/<bucket_name>/o/data_pump_file.dmp \
  logfile=export.log \
  directory=data_pump_dir
  ```
インポート：
```
impdp DATA_PUMP_USER/<password>adw_high \
  credential=<credential_name> \
  dumpfile=https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<ObjectStorageNamespace>/b/<bucket_name>/o/data_pump_file.dmp \
  tables=<table_name> \
  table_exists_action=append \
  logfile=import.log \
  directory=data_pump_dir
```

※、事前にクレデンシャルとディレクトリを作成してください。

## SQLcl の "dp export/import" コマンド
この例では、<font color=blue>OCI Cloud Shell</font>からSQLclを実行する。
※、Coud Shellに<strong>インストール済</strong>で、直接に使える。

__ステップ__
1. OCI Cloud Shellを開く。
2. ADBウォレットをCloud Shellにアップロードする。
3. SQLclを起動し、エクスポート対象ユーザーでADBへ接続する。
コマンド例：`sql -cloudconfig Wallet_adw01.zip <username>/<password>@adw01_high`
4. `dp export`を実行し、スキーマをエクスポートする。
```
<username>@cloudshell:~ (ap-tokyo-1)$ sql -cloudconfig Wallet_adw01.zip DATA_PUMP_USER/<password>@adw01_high
<中略>
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> show user;
USER is "DATA_PUMP_USER"
SQL> dp export
Initiating DATA PUMP
Database Time Zone: VERSION:42 CON_ID:0
Log Location: DATA_PUMP_DIR:ESQL_46.LOG
Starting "DATA_PUMP_USER"."ESQL_46":  
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA
. . exported "DATA_PUMP_USER"."ZIPCODEJP"                6.006 MB  124523 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table "DATA_PUMP_USER"."ESQL_46" successfully loaded/unloaded
******************************************************************************
Dump file set for DATA_PUMP_USER.ESQL_46 is:
  /u03/dbfs/0A6784B0EE797006E0635A10000A776A/data/dpdump/ESQL_46.DMP
Job "DATA_PUMP_USER"."ESQL_46" successfully completed at Mon Nov 20 02:56:55 2023 elapsed 0 00:00:27
DataPump Operation Status 'COMPLETED'
Jobname = ESQL_46
SQL>
```

__インポート__
`dp import -dumpfile <dumpfile_name>`でスキーマをインポートする（結果を省略）。

__備考__
- dp export/importコマンドの詳細は、[SQlcl リファレンス](https://docs.oracle.com/cd/F87166_01/sqcug/using-data-pump.html#GUID-63909F44-9B4F-4180-B588-45C70B50DD53)をご参照ください。
- SQLclをインストールするのに、次の記事をご参照ください。
[LinuxとWindowsインスタンスに SQLcl をインストール](https://qiita.com/letian/items/8c159bf430eb3d581443)


## SQL Developer (GUI)
SQL Developerは、オラクルが提供する便利なGUIツールで、ざまざまなDBに接続できます。

__前提__
ADBに接続できる端末に、SQL Developerのインストールが必要です。

インストール手順: (次の記事をご参照)
Windows OS: [SQL Developerで様々なDBに接続する方法](https://qiita.com/letian/items/08f2e2f6d90c08549cbf)
Linux OS: [Oracle LinuxでSQL Developerを利用する方法](https://qiita.com/liu-wei/items/46eb16dbd4f2d665c67f)

__ステップ__
1) DBAパネルを開く
メニュー → View → DBA
2) ADBへの接続を追加 
  既存の接続があれば、それを選択する。既存の接続がなければ、新規作成する（接続方法の詳細は、上記Windows版の記事を参照）。
3) 接続後、"Data Pump"を右クリックし、Wizardを起動する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/24a2e0e9-a253-9bed-7565-ef509aa8f575.png", width="300">
4) Wizardの指示に従って、進んでください（後続のステップを省略）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8f022d76-dbed-0a3a-bc71-0df5fb273db9.png", width="550">

## データベース・アクション (OCIコンソール)
__入口__
1. ADB起動中の時、ADB詳細画面より、「データベース・アクション」をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/141e898d-1e42-338a-ca7e-562cf1b69302.png", width="550">
※、プライベートADBの場合、同プライベート・サブネットの端末より実施してください。

2. ユーザーとパスワードを入力し、ログインする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1dca29fa-c65f-d9ad-8643-3783d99b1585.png", width="350">

3. Administration > "<font color=blue>DATA PUMP</font>"をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/46c259ee-e4f7-fb27-6126-7d0242bf475f.png", width="500">

4. 右上の<font color=blue>IMPORT</font>をクリック。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/69f011e1-f67b-4b24-4460-f1dd35f9d2f8.png", width="550">
5. 画面の指示に従って、インポート・ジョブを新規作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/67e0ec7c-320e-4f90-8325-a8a0c1066861.png)

__できること__
- ジョブ監視（Export/Import両方）
- DUMPファイルのダウンロード
- <font color=blue>インポート</font>・ジョブの作成

__できないこと__
<font color=blue>エクスポート</font>・ジョブの作成

## Oracle Data Pump API
開発者向き。<font color=blue>DBMS_DATAPUMP</font>パッケージを利用する。
詳細はドキュメントをご参照ください。
[Using the Oracle Data Pump API](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/using-oracle_datapump-api.html)

# エクスポートの出力先
## ローカル・ファイル・システム
デフォルトの出力先は、ADBローカルのファイル・システムとなる。
```
SQL> select owner, directory_name, directory_path FROM dba_directories where directory_name='DATA_PUMP_DIR';

OWNER      DIRECTORY_NAME       DIRECTORY_PATH
---------- -------------------- ----------------------------------------------------------------------
SYS        DATA_PUMP_DIR        /u03/dbfs/FFA038E37518AFA8E0534310000AC205/data/dpdump

SQL>
```


直接にADBローカル・ファイル・システムにログインできないから、DUMPファイルを外に出したい時、出力先をオブジェクト・ストレージか、ファイル・ストレージに変更するのは可能。

## OCIオブジェクト・ストレージへ
DUMPファイルをオブジェクト・ストレージに格納するのは、一般的なケースとなる。サービスGWを経由する場合、OCI内部通信で済み、インターネットを経由しない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f6b97514-88a4-7dc8-763b-20675eb2570a.png", width="500">
手順の詳細は、次の記事をご参照ください。
[Autonomous DBからOCIオブジェクト・ストレージへデータ・ポンプをエクスポートする手順](https://qiita.com/letian/items/c6117d784b55b210403c)

※、上記の構成図と手順は、プライベートADBを例にしたけど、この方法はパブリックADBにも適用する。
## OCIファイル・ストレージへ
ファイル・ストレージも選択肢の一つであるけど、制限事項がある。
サイズの大きいDUMPファイルを転送する場合、性能面がよくて、代わりにストレージ料金がオブジェクト・ストレージより<font color=blue>約11倍</font>ほど高くなる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/60d2122a-322a-7ea1-9d56-21d806eb6391.png", width="450">

__制限事項__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c100bdf2-d24f-1af4-ca34-7fa93dee780f.png", width="400">
※、この方法は<strong><strong>パブリックADB</strong>には適用できない</strong>。

## 出力先の比較
ローカル以外の２つを比較してみましょう。
|出力先|OCI Object Storage|OCI FSS|
|:--|:--|:--|
|ADBのアクセス・タイプ|パブリック or プライベート・エンドポイント|<font color=blue>プライベート・エンドポイント</font>のみ|
|認証トークン|必要|不要|
|関連プロシージャ|[DBMS_CLOUD.<font color=black>CREATE_CREDENTIAL</font>](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-742FC365-AA09-48A8-922C-1987795CF36A)|[DBMS_CLOUD_<strong>ADMIN</strong>.<font color=black>ATTACH_FILE_SYSTEM</font>](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-admin.html#GUID-1C562DE9-066C-4D8B-B058-53F30E9061C3)|
||[DBMS_CLOUD.<font color=black>DROP</font>_CREDENTIAL](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-7373D043-C3AE-4D86-87BE-4F7ACC8B3EB5)|[DBMS_CLOUD_<strong>ADMIN</strong>.<font color=black>DETACH</font>_FILE_SYSTEM](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-admin.html#GUID-DCDEDC04-BA2C-4FE0-82AF-28203521ECAB)|
||[DBMS_CLOUD.<font color=black>UPDATE</font>_CREDENTIAL](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-5104A4E5-DCD8-4899-96EC-A9758BA03FC5)|-|
||[DBMS_CLOUD.<font color=black>LIST_OBJECTS</font>](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-52801F96-8280-4FE0-8782-E194F4360E6F)|[DBMS_CLOUD.<font color=black>LIST_FILES</font>](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-78F49B25-C072-45E1-BE83-E306ACC998EE)|
|価格<br>(2023年11月)|標準の場合：3.57円 (GB per month) |42円 (GB per month)|

※、DBMS_CLOUD_<strong>ADMIN</strong>を実行するためには、管理者ユーザーでログインする必要がある。

----
__オフィシャル・ドキュメント__
[Access Network File System from Autonomous Database](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/load-oci-file-storage.html)
[SQlcl リファレンス](https://docs.oracle.com/cd/F87166_01/sqcug/using-data-pump.html#GUID-63909F44-9B4F-4180-B588-45C70B50DD53)