[OCI]DBMS_CLOUDパッケージに追加されたクラウド・ストレージ内のファイルの一括操作（コピー/移動/削除）機能を試してみた

# はじめに

DBMS_CLOUDパッケージに、クラウド・ストレージ上にあるファイルの一括操作を行うための以下のプロシージャが追加されました。
- DBMS_CLOUD.BULK_COPY
- DBMS_CLOUD.BULK_MOVE
- DBMS_CLOUD.BULK_DOWNLOAD
- DBMS_CLOUD.BULK_UPLOAD
- DBMS_CLOUD.BULK_DELETE

ということで、早速検証してみました。

こちらのプロシージャを使用すると、
**・クラウド・ストレージ（バケット）からのデータロード終了後に、ファイルを別のクラウド・ストレージ（バケット）に移動する
・クラウド・ストレージ（バケット）からのデータロード終了後に、バケット内のファイル全て削除する
・OCI以外のクラウド・ストレージからOCI Object Storageへのデータの移動を、サーバやローカルストレージを介さずに行える**
といったことが簡単に行えるようになります。

こちらの検証では、OCI Object Storageのアクセスにリソース・プリンシパル、Amazon S3のアクセスにARNを用いたロールベースの認証を使用しています。
それぞれの設定方法の詳細は、以下のマニュアルおよび記事をご参照ください。
- リソース・プリンシパル

https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/resource-principal.html#GUID-E283804C-F266-4DFB-A9CF-B098A21E496A

- AWS ARNを用いたロールベースの認証

https://qiita.com/500InternalServerError/items/bf5917270c1291a3558f

# 1. DBMS_CLOUD.BULK_COPYプロシージャ

DBMS_CLOUD.BULK_COPYプロシージャを使用して、Object Storageのバケット間でデータをコピーしてみます。

コピー元となるSourceBucketというバケットを作成し、以下の5つのファイルをアップロードしました。
testdata1.txt
testdata2.txt
testdata3.txt
testdata4.txt
testdata5.txt
![スクリーンショット 2022-11-02 11.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/e7d5f546-6927-62a0-758a-2b90d44d9515.png)

![スクリーンショット 2022-11-02 11.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/57dec367-4be6-6a83-0e3a-bf7dd6115779.png)

また、コピー先となるTargetBucketというバケットを作成しました。
![スクリーンショット 2022-11-02 11.02.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/d329dcd5-92ed-94e5-3175-6a1532dd9aa0.png)

では、早速DBMS_CLOUD.BULK_COPYプロシージャを実行して、SourceBucket内にあるファイルを一括でTargetBucket内にコピーしてみます。

Object Storageバケット間でファイルのコピーを行うには、source_credential_nameにクレデンシャル、source_location_uriにコピー元となるバケット、target_location_uriにコピー先となるバケットを指定して、DBMS_CLOUD.BULK_COPYを実行します。
```
SQL> BEGIN 
  2  	DBMS_CLOUD.BULK_COPY (
  3  		source_credential_name => 'OCI$RESOURCE_PRINCIPAL',
  4  		source_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/SourceBucket/o',
  5  		target_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/TargetBucket/o'
  6  	);
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```

TargetBucketの内容を確認します。
「他のアクション」から「リフレッシュ」をクリックして、表示内容を更新します。
![スクリーンショット 2022-11-02 11.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ad2fbedf-dc3e-d796-cd02-7d980a1ce0c1.png)
5つのファイルがコピー元に指定したSourceBucketからコピーされていることが確認できました。
![スクリーンショット 2022-11-02 11.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/9169dd86-1178-aebc-f3af-4f1cc6825b29.png)

# 2. DBMS_CLOUD.BULK_DELETEプロシージャ

次に、DBMS_CLOUD.BULK_DELETEプロシージャを利用して、バケット内のファイルを一括で削除してみます。

Object Storageバケット内のファイルの一括削除を行うには、credential_nameにクレデンシャル、location_uriに対象を指定して、DBMS_CLOUD.BULK_DELETEを実行します。
ここでは、TargetBucketを指定して実行してみます。

```
SQL> BEGIN
  2  DBMS_CLOUD.BULK_DELETE (
  3       credential_name => 'OCI$RESOURCE_PRINCIPAL',
  4       location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/TargetBucket/o'
  5  );
  6  END;
  7  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
TargetBucketの詳細ページで、「他のアクション」から「リフレッシュ」をクリックします。
![スクリーンショット 2022-11-02 11.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5706bc07-4862-30b0-e114-cb3159d59fad.png)

TargetBucket内の全てのファイルが削除されていることが確認できました。
![スクリーンショット 2022-11-02 11.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2ffd90bf-7481-2973-704d-ab05290cb041.png)

# 3. DBMS_CLOUD.BULK_MOVEプロシージャ

DBMS_CLOUD.BULK_MOVEプロシージャを使用して、Object Storageのバケット間でデータを移動してみます。

Object Storageバケット間でファイルの移動を行うには、source_credential_nameにクレデンシャル、source_location_uriに移動元となるバケット、target_location_uriに移動先となるバケットを指定して、DBMS_CLOUD.BULK_MOVEを実行します。

では、早速DBMS_CLOUD.BULK_MOVEプロシージャを実行して、SourceBucket内にあるファイルを一括でTargetBucket内に移動してみます。

```
SQL> BEGIN
  2  DBMS_CLOUD.BULK_MOVE (
  3  	source_credential_name => 'OCI$RESOURCE_PRINCIPAL',
  4  	source_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/SourceBucket/o',
  5  	target_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/TargetBucket/o'
  6  );
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。

SQL>
```
TargetBucketの内のファイルを確認してみます。
TargetBucketの詳細ページで、「他のアクション」から「リフレッシュ」をクリックします。
![スクリーンショット 2022-11-02 11.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7348274d-3b73-05b0-5e28-1e7fc1de76c8.png)
SourceBucketにあった5つのファイルがあることが確認できました。
![スクリーンショット 2022-11-02 11.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0bdabf3d-2ee5-a5cd-a5a0-f4b91a2efb3b.png)

次に、SourceBucketの内のファイルを確認してみます。
SourceBucketの詳細ページで、「他のアクション」から「リフレッシュ」をクリックします。
![スクリーンショット 2022-11-02 11.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/047b18d8-f032-5447-dd27-293e0135613c.png)
SourceBucketにあった5つのファイルがTargetBucketに移動していることが確認できました。
![スクリーンショット 2022-11-02 11.15.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1e9c3073-5dea-1cfd-1e07-0120307f2e36.png)

# 4. DBMS_CLOUD.BULK_COPYプロシージャによる異なるクラウド・ストレージ間でのファイルのコピー
DBMS_CLOUDパッケージは、OCI Object Storage以外のクラウド・ストレージも操作対象にすることが可能です。

OCI Object StorageのTaargetBucketからAWS S3のmy-s3-bucket-for-adbにファイルを一括コピーしてみます。

コピー元となるクラウド・ストレージにアクセスするためのクレデンシャルをsource_credential_nameに、コピー先となるクラウド・ストレージにアクセスするためのクレデンシャルをtarget_credential_nameに設定します。
また、コピー元となるバケットをsource_location_uri に、コピー先となるバケットをtarget_location_uriに指定して、DBMS_CLOUD.BULK_COPYを実行します。

では、早速DBMS_CLOUD.BULK_COPYプロシージャを実行して、 OCI Object StorageのバケットTargetBucket内にあるファイルを一括でAWS S3のバケットmy-s3-bucket-for-adb内にコピーしてみます。

```
SQL> BEGIN
  2  DBMS_CLOUD.BULK_COPY (
  3  	source_credential_name => 'OCI$RESOURCE_PRINCIPAL',
  4  	target_credential_name => 'AWS_S3_CRED',
  5  	source_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/TargetBucket/o',
  6  	target_location_uri    => 'https://my-s3-bucket-for-adb.s3.ap-northeast-1.amazonaws.com/'
  7  );
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。

SQL> 
```

バケットmy-s3-bucket-for-adbのオブジェクトのタブを表示します。
更新ボタンをクリックして、表示内容を更新します。
![スクリーンショット 2022-11-02 11.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ce4c8840-d217-e632-9dcf-e09695ad574e.png)
OCI Object StorageのバケットSourceBucket内にあるファイルが一括でAWS S3のバケットmy-s3-bucket-for-adb内にコピーされたことが確認できました。
![スクリーンショット 2022-11-02 11.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/3f79a8df-f049-bcbf-f300-94eea5a3971f.png)

# 5. DBMS_CLOUD.BULK_MOVEプロシージャによる異なるクラウド・ストレージ間でのファイルの移動

最後に、AWS S3のバケットmy-s3-bucket-for-adbにあるファイルをOCI Object StorageのバケットSourceBucketに一括で移動してみます。

```
SQL> BEGIN
  2  DBMS_CLOUD.BULK_MOVE (
  3  	source_credential_name => 'AWS_S3_CRED',
  4  	target_credential_name => 'OCI$RESOURCE_PRINCIPAL',
  5  	source_location_uri    => 'https://my-s3-bucket-for-adb.s3.ap-northeast-1.amazonaws.com/',
  6  	target_location_uri    => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrhnlrqdttaw/b/SourceBucket/o'
  7  );
  8  END;
  9  /

PL/SQLプロシージャが正常に完了しました。

SQL> 
```
バケットmy-s3-bucket-for-adbのオブジェクトのタブを表示します。
更新ボタンをクリックして、表示内容を更新します。
![スクリーンショット 2022-11-02 11.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/1e09b5ac-0232-a3db-18e1-c7c62a8fbd61.png)
バケットmy-s3-bucket-for-adb内から全てのファイルがなくなっていることが確認できました。
![スクリーンショット 2022-11-02 11.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/8885dadf-3c34-0bf3-1212-665839be7e13.png)
SourceBucketの詳細ページで、「他のアクション」から「リフレッシュ」をクリックします。
![スクリーンショット 2022-11-02 11.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/39921b26-f719-f755-4bc9-18417ce122bb.png)
S3バケットmy-s3-bucket-for-adb内の全てのファイルが、Object StorageのバケットSourceBucketに移動されていることが確認できました。
![スクリーンショット 2022-11-02 11.49.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/912168a2-9e10-9d1b-0960-543186e1b31d.png)

# まとめ
DBMS_CLOUDパッケージを使用して、クラウド・ストレージ内のファイルの一括操作（コピー/移動/削除）ができることが確認できました。

実際には、処理の並列度を制御したり、正規表現を使用してバケット内の一部のファイルのみを処理の対象とするといったことも可能なので、今後いろいろと試してみたいと思います。


# 参考資料
[Using Oracle Autonomous Database on Shared Exadata Infrastructure：Bulk Operations for Files in the Cloud](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/load-data-bulk.html#GUID-DE5D8BFA-3E17-4214-8C7C-0CA78B14766E)