オブジェクト・ストレージからデータを Oracle Base DB/ADB にロードする方法のまとめ

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
オブジェクト・ストレージから<strong>Oracle Base DB</strong> や <strong>Autonomous DB</strong>へデータをロードする方法にはさまざまな選択肢があります。本記事では、特によく使われる手法をまとめて紹介します。  

どの手法を選ぶべきか迷っている方にとって、本記事が参考となり、最適な方法を選択する一助となれば幸いです。  

OCI オブジェクト・ストレージを例に解説しますが、利用方法によっては AWS S3 や Azure Blob などの他のデータソースにも対応可能です。  

なお、本記事ではオラクルの<strong>公式製品とサービス</strong>に焦点を当てます。サードパーティー製のツールも多数存在しますが、選択肢が多岐にわたるため、本記事では割愛します。  

__目次__
- [1. オブジェクト・ストレージから、データを Oracle Base DB/ADB にロード](#1-オブジェクトストレージからデータを-oracle-base-dbadb-にロード)
  - [1-1. ローカルにコピーしてから、Oracle Base DBへ](#1-1-ローカルにコピーしてからoracle-base-dbへ)
  - [1-2. オブジェクト・ストレージをローカルにマウントし、Oracle Base DBへ](#1-2-オブジェクトストレージをローカルにマウントしoracle-base-dbへ)
  - [1-3. DBMS_CLOUD プロシージャの利用](#1-3-dbms_cloud-プロシージャの利用)
  - [1-4. DBMS_CLOUD_PIPELINE プロシージャを利用し、ADBへ](#1-4-dbms_cloud_pipeline-プロシージャを利用しadbへ)
  - [1-5. ODI Marketplace の利用](#1-5-odi-marketplace-の利用)
  - [1-6. OCI Data Integration の利用](#1-6-oci-data-integration-の利用)
- [2. 各種方法の比較](#2-各種方法の比較)
- [サマリー](#サマリー)

# 1. オブジェクト・ストレージから、データを Oracle Base DB/ADB にロード
## 1-1. ローカルにコピーしてから、Oracle Base DBへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9cd51b29-ae56-e8f9-ea75-5749b11904d4.png)

__ネットワーク構成について__
- Oracle Base DBインスタンスが、パブリック/プライベート・サブネットのどちらに存在してもこの方法が適用する。（下記他方法も同様）
  - パブリック・サブネット：<strong>Internet GW</strong>を経由しオブジェクト・ストレージへアクセスする。
  - プライベート・サブネット：<strong>NAT GWか、Service GW</strong>を経由する。
- 一般的に、Oracle Base DB はプライベート・サブネット内に配置され、OCI オブジェクト・ストレージへのアクセスには <strong>Service GW</strong>を経由することが推奨されます。  

__作業ステップ__
 - STEP-1. データをローカルに転送。
   - OCI Object Storageからの場合：<strong>OCI CLI</strong>の利用を推奨  (最新版のOracle Base DBに実装済、前のバージョンのDBインスタンスにもインストール可能)
   - <strong>AWS S3, Azure Blob</strong>からの場合：例 rcloneを利用
 - STEP-2. ローカルからDBへロード （従来通りのやり方）
   - 2-1) テキストファイル：例 SQL Loader
   - 2-2) Data Pumpファイル：impdp

__メリット__
✅ ローカルにコピーした後、<strong>従来通りの方法</strong>で処理できるため、他のツールやサービスを利用する必要がない。
✅ DBMS_CLOUDと比較して、Oracle DBのバージョンに制限がない。
✅ <strong>OCI CLI</strong>はOracle Base DBに<strong>実装済</strong>で、データ転送が便利。

__デメリット__
- ローカルへの一時保存は必要で、ストレージの容量が少ない時、収まらない可能性がある。

## 1-2. オブジェクト・ストレージをローカルにマウントし、Oracle Base DBへ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b365d169-5eb7-1f65-4ad3-7d13ad54f9b3.png)

__作業ステップ__
 - STEP-1:  オブジェクト・ストレージをDBインスタンスにマウントする  （例：s3fs-fuseを利用）
 - STEP-2:  マウントポイントからデータDBへロード（従来通りのやり方）
   - 2-1) テキストファイル：例 SQL Loader
   - 2-2) Data Pumpファイル：impdp

__メリット__
✅ マウントの設定は比較的に簡単である。マウント後、従来通りのやり方と同じ。
✅ DBのバージョンに依存せず、<strong>DBMS_CLOUD</strong>プロシージャの<strong>インストールは不要</strong>。（Base DBにDBMS_CLOUDをインストールする際に、DBバージョンの制限がある）
✅ 直接にオブジェクト・ストレージからインポートするため、ローカルへの一時保存は不要。

__注意点__
DBインスタンス再起動後、マウント・ポイントが切れないように再マウントするか`/etc/fstab`を編集してください。

実施方法の詳細について、次の記事をご参照ください。
[マウント・ポイントを経由して、Oracle Base DBからオブジェクト・ストレージへデータをエクスポートする手順](https://qiita.com/letian/items/3b28dcae87f704ba134b)

## 1-3. DBMS_CLOUD プロシージャの利用
__Oracle Base DB の場合__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/26a7d7aa-ad4b-d3e6-cd88-77ddca77a103.png", width="450">

__作業ステップ__
 - STEP-1. Oracle Base DBに、DBMS_CLOUDプロシージャをインストールし、関連設定を実施。
 - STEP-2. クレデンシャルの作成  ( DBMS_CLOUD.<font color=blue>CREATE_CREDENTIAL</font> )
 - STEP-3. データロード
   - 3-1) テキストファイル： DBMS_CLOUD.<font color=blue>COPY_DATA</font>を利用 
   - 3-2) Data Pumpファイル： `impdp User/Password credential=XXXX dumpfile= https://<Object_File_URL>`

Oracle Base DBの実施例は、次のステップ・バイ・ステップの手順を提供していますので、ご参考ください。（下記記事の<font color=blue>STEP-1からSTEP-8まで</font>は、DBMS_CLOUDのインストールと関連設定の作業に当たる。）
[オブジェクト・ストレージからOracle DB 19c/21cにデータを導入する](https://qiita.com/liu-wei/items/398c91fd79a63eec6e7a)

__Autonomous DB の場合__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/385be8e3-c82f-2174-e2bb-af89792763a0.png", width="450">
DBMS_CLOUDプロシージャは、ADBに既に<strong>実装済</strong>で、クレデンシャルの作成から実施すればOKです。

__メリット__
✅ DBMS_CLOUDを使用してクレデンシャルを作成すれば、オブジェクト・ストレージに直接アクセスできる。（ローカルへの一時保存やマウントは不要）
✅ この方法は、Oracle Base DB と Autonomous DB の両方に適用される。
✅ OCI Object Storage以外、<strong>AWS S3, Azure Blob</strong> などのデータ・ソースも対応。マルチクラウドのユーザーに適している。

__デメリット__
- Oracle DB の場合、DBMS_ClOUDのインストールと権限まわりの設定は必要、手順はやや複雑。
- Oracle DB のバージョン制限がある  (19c, 21c のみ)。

## 1-4. DBMS_CLOUD_PIPELINE プロシージャを利用し、ADBへ
これは、2022年12月にリリースされたAutonomous DB の新機能です。機能の詳細は、[ドキュメント](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/autonomous-pipelines.html)をご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/59e1b2d5-7b1f-8cd6-14e7-9750ee25cb0a.png)

__作業流れ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7956e2c9-0969-9d6a-0875-a682c8730f06.png)

__メリット__
✅ 指定間隔で実行し、新しいデータが来たら、直ぐにソースとターゲット間の連携は可能。
✅ オブジェクト・ストレージからADBへのロードだけではなく、ADBからオブジェクト・ストレージへのエクスポートも可能。

__利用制限__
- 現在(2023年1月)、ADB特有な機能で、Oracle Base DBを対応していない。

## 1-5. ODI Marketplace の利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/9708eb60-9b13-6558-7212-741be05b83e1.png)
__ネットワーク構成について__
 - ODI MPインスタンスを作成する時、必ずVCNの指定は必要。ターゲットDBと同じVCNにするか、別々のVCNにするかどちらでもOK。
 - ODI MPは、<strong>Autonomous Linuxベース</strong>のComputeインスタンスで、クライアント側から<strong>VNCツール</strong>で接続すれば、GUIが利用できる。

__作業ステップ__
 - STEP-1. Marketplaceから、ODI インスタンスを立てる
 - STEP-2. VNCツールでOCI MPに接続し、ODI Studioを起動
 - STEP-3. レポジトリDBの作成  (ターゲットDBと同じでもよい)
 - STEP-4. ソースとターゲットへの物理接続を立てる
 - STEP-5. モデルの作成 (物理接続を論理化に)
 - STEP-6. プロジェクトとマッピングの作成
 - STEP-7. マッピング実行及びモニタリング

__メリット__
✅ OCIオブジェクト・ストレージやOracle Base DB/ADBだけでなく、多くの種類のデータソースに対応している。
✅ データ編集や複数ファイルのマージなど、複雑なデータフローを作成できる。
✅ スケジューリング実行が可能で、管理・監視機能が豊富。
✅ コスト面でのメリットがある。（Classic版は無料で使用でき、OCPUあたりのソフトウェア価格は<font color=blue>$0.00</font>）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5f0ba834-2c33-8718-0421-1f38a9fb2905.png)

__デメリット__
 - レポジトリDBの設定は必須である。
 - マッピングが実施できるまでの設定が複雑。（初心者が慣れるまでの時間を考慮する必要がある）

## 1-6. OCI Data Integration の利用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/bbbf26ff-8b7a-8e02-4fbe-acb4d313532c.png", width="450">
__ネットワーク構成について__
- OCI DIのワークスペースは、VCN内部か外部の2種類があり、<strong>デフォルトはVCN内部</strong>で作成する。
- VCN内部で作成する場合、オブジェクト・ストレージとDBインスタンスに接続するため、関連セキュリティ・リスト及びルート表の設定は必要である。
<strong>Egress ルール</strong>の参考例： 
          Object Storage 接続用： 宛先 0.0.0.0/0   TCP 443
          DB 接続用： 宛先 DBのプライベートIP   TCP 1521

__作業ステップ__
- STEP-1.  OCI DI のワークスペースの作成
- STEP-2.  データ・アセットの作成　（ソースとターゲット両方）
- STEP-3.  プロジェクトとデータフローの作成
- STEP-4.  統合タスクとアプリケーションの作成
- STEP-5.  アプリケーションへのタスクの公開
- STEP-6.  タスク実行およびモニタリング

※、OCI DI <strong>ワークスペース</strong>は、機能的に <strong>ODI Studio</strong> (On-P or MP) と相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/591c43ae-d45a-7583-7e41-9734a04742fe.png)

Oracle DBの実施例は、次のステップ・バイ・ステップの手順をご参考ください。
[OCI Data Integrationを使用しオブジェクト・ストレージからOracle DBにデータをロードする](https://qiita.com/liu-wei/items/3e6e768549763d3f77fa)

__メリット__
✅ OCI マネージド サービスで、従来のODI On-P、ODI Marketplaceと比べて、使いやすくなる。（レポジトリDBの管理は不要）
✅ OCIオブジェクト・ストレージ、Oracle DB/ADBだけではなく、たくさんの種類のデータ・ソースを対応している。（対応一覧は、[こちら](https://docs.oracle.com/ja-jp/iaas/data-integration/using/data-assets.htm#data-sources)へ）
✅ データ編集、複数ファイルのマージなど、複雑なデータフローを作成できる。
✅ スケジューリング実行は可能、管理・監視の機能は豊富。
✅ OCI DIからOCI Functionsの呼び出しも可能。

__デメリット__
- 他方法と比べて、サービス料金がかかる。(内訳は以下の通り)
  - ワークスペース料金 (時間単位) 
  - データ処理料金 (時間×GB単位) 
  - パイプライン・オペレーターの実行料金  (時間単位)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/aa635b58-8bd9-54ce-d53c-67084b7011f1.png)
パイプライン・オペレーターの部分はオプションです。それが発生しない前提で、毎月の概算見積もりは、次のようです。（<strong>１個</strong>ワークスペースのみ、１時間あたり<strong>１GB</strong>のデータを処理すると想定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/19799bd3-ca20-dccb-8aa0-6f38febcdd1e.png)

# 2. 各種方法の比較
上記各種方法のメリットとデメリットを抜粋して、一覧表を作りましたので、ご参考ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e6e37a63-6b51-d2dd-47a7-0f0e16bab5d4.png)


# サマリー
- 各方法には、それぞれ適用場面と制限があります。ユーザーケースに応じて、いつどの方法を使うべきかを判断することが重要です。<strong>データ転送量</strong>、<strong>転送頻度</strong>(一時か定期か)、<strong>データ編集の必要性</strong>、<strong>データ・ソースのタイプと場所</strong>、<strong>DBバージョン</strong>、<strong>コスト面</strong>（製品・サービス価格、学習時間）などが重要な考慮事項です。
- ODI On-P版も技術的には実現可能ですが、今回のケース（ソースとターゲットの両方がクラウド上にある場合）にはベストプラクティスではないため、候補から外します。

以上です。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[オブジェクト・ストレージからOracle DB 19c/21cにデータを導入する](https://qiita.com/liu-wei/items/398c91fd79a63eec6e7a)
[マウント・ポイントを経由して、データ・ポンプ・ファイルをOracle DBCSからオブジェクト・ストレージにエクスポートする](https://qiita.com/liu-wei/items/3b28dcae87f704ba134b)
[OCI Data Integrationを利用し、オブジェクト・ストレージからOracle DBにデータをロードする](https://qiita.com/liu-wei/items/3e6e768549763d3f77fa)
[ODI On-PとODI MarketplaceとOCI Data Integrationの比較](https://qiita.com/liu-wei/items/dc527ad423fbd2f1742d)

----
__オフィシャル・リンク__
[OCI Data Integration  サービス・ホームページ](https://www.oracle.com/jp/integration/data-integration/) (価格表、見積もりを含める)
[OCI Data Integration ドキュメント・ホームページ](https://docs.oracle.com/ja-jp/iaas/data-integration/home.htm)