[Oracle Cloud] SQLcl のdatapumpを使って Base Database Serviceから Object Storage への エクスポート/インポートしてみた。

# はじめに

SQLclリリース21.4以降では、PL/SQLパッケージDBMS_DATAPUMPを使用するデータ・ポンプ機能が提供されています。
この機能では、ダンプ・ファイル用にOCI Object Storageを使用することができます。
OCI Base Database ServiceのスキーマをObject Storageへエクスポートし、Object Storageのダンプ・ファイルをインポーとしてみました。

今回はDBシステム・バージョン19.17/データベースのバージョン:19.17.0.0.0のBase Database Serviceを使用しました（SQLclは21.4が利用可能）

# 事前準備

- SQLcl リリース21.4 の準備
Base Database 19.17 であれば導入済み
- oci cli のconfigファイルの準備
Base Database DBシステム・バージョン19.17 であれば oci cli が導入済みなので、oci setup config で生成可能
- データ・ポンプを使用するデータベース・ユーザの準備
    - DATA_PUMP_DIRディレクトリへのREAD/WRITE権限 `grant read, write on directory DATA_PUMP_DIR to <USER>;` 
- Object Storage バケットの作成

# SQLcl での エクスポート

- SQLclでデータベースに接続
    - `sql [Username]@[host]:[port]/[Service]'

```
$ sql scott@10.0.0.2:1521/pdb1.subnet1.vcn1.oraclevcn.com


SQLcl: Release 21.4 Production on Fri Jan 20 10:00:00 2023

Copyright (c) 1982, 2023, Oracle.  All rights reserved.

Password? (**********?) ********
Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL>
```

- 使用するociプロファイルとObject Storageバケットをセット
    - oci プロファイル：DEFAULT
        - oci profile DEFAULT
    - Object Storageバケットとして以下を利用した場合
        - リージョン：ap-tokyo-1
        - namespace：XXXXXXX
        - バケット名：dumpdir
        - `cs https://objectstorage.ap-tokyo-1.oraclecloud.com/n/XXXXXXX/b/dumpdir/o/`

```
SQL> oci profile DEFAULT
Region set to: ap-tokyo-1
OCI Profile set to DEFAULT
Transfer method set to oci
SQL>
SQL> cs https://objectstorage.ap-tokyo-1.oraclecloud.com/n/XXXXXXX/b/dumpdir/o/
DBMS_CLOUD Credential: Not Set
OCI Profile: DEFAULT
Transfer Method: oci
URI as specified: https://objectstorage.us-phoenix-1.oraclecloud.com/n/XXXXXXX/b/dumpdir/o/
SQL>
```

- 接続しているスキーマをエクスポート
    - dpdmp.dmpというファイルとして出力
    - `dp export -copycloud -dumpfile dpdmp.dmp`

```
SQL> dp export -copycloud -dumpfile dpdmp.dmp

** Datapump Command Start ** at 2023.01.20-10.00.00
Initiating DATA PUMP
DATABASE TIME ZONE: VERSION:39 CON_ID:0
Log Location: DATA_PUMP_DIR:ESQL_01.LOG
FLASHBACK automatically enabled to preserve database integrity.
Starting "SCOTT"."ESQL_01":
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
. . exported "SCOTT"."PRODUCTS"                          6.023 KB       3 rows
ORA-39173: Encrypted data has been stored unencrypted in dump file set.
Master table "SCOTT"."ESQL_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.ESQL_84 is:
  /u01/app/oracle/product/19.0.0.0/dbhome_1/rdbms/log/EFEB62421EC8378AE0539800000A8B43/dpdemo.dmp
Job "SCOTT"."ESQL_84" successfully completed at Fri Jan 20 05:53:22 2023 elapsed 0 00:00:38
DataPump Operation Status 'COMPLETED'
Jobname = ESQL_84
File DATA_PUMP_DIR/dpdemo.dmp copied to https://objectstorage.us-sanjose-1.oraclecloud.com/n/orasejapan/b/dumpdir/o/dpdemo.dmp
** Datapump Command End ** at 2023.01.20-10.03.00
```

# SQLcl での インポート

- SQLclでデータベースに接続
    - `sql [Username]@[host]:[port]/[Service]'
- 接続しているスキーマにインポート
    - 上述のダンプ・ファイルをインポートする例
    - `dp import -copycloud -dumpfile dpdemo.dmp`

```
SQL> dp import -copycloud -dumpfile dpdemo.dmp

** Datapump Command Start ** at 2023.01.20-11.00.00
File https://objectstorage.us-sanjose-1.oraclecloud.com/n/orasejapan/b/dumpdir/o/dpdemo.dmp copied to DATA_PUMP_DIR/dpdemo.dmp
Initiating DATA PUMP
DATABASE TIME ZONE: VERSION:36 CON_ID:0
Log Location: DATA_PUMP_DIR:ISQL_2.LOG
Master table "SCOTT"."ISQL_2" successfully loaded/unloaded
Starting "SCOTT"."ISQL_2":
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."PRODUCTS"                          6.148 KB       6 rows
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
Job "SCOTT"."ISQL_2" successfully completed at Fri Jan 20 11:01:00 2023 elapsed 0 00:00:12
DataPump Operation Status 'COMPLETED'
Jobname = ISQL_2
** Datapump Command End ** at 2023.01.20-11.02.00

SQL>
```

# 補足
### エクスポート

- スキーマ、またはスキーマのリストが指定されていない場合は、現在のスキーマがエクスポートされます。
- ダンプ・ファイルは、OracleディレクトリまたはObject Storageに格納できます。
- -copycloudオプションを使用して、エクスポートの最後の手順として、Object Storageにダンプ・ファイルをコピーできます。

### インポート

- スキーマ、またはスキーマのリストが指定されていない場合は、ダンプ・ファイル内のすべてのオブジェクトがインポートされます(デフォルトではFULLインポート)。
- OracleディレクトリまたはObject Storageに格納されている、以前にエクスポートされたダンプ・ファイルからインポートします。



# おわりに

SQLcl によって設定すくなくObject Storageを使ったエクスポート/インポートできました。

# 参考情報

- [SQLclでのデータ・ポンプ・サポート](https://docs.oracle.com/cd/F59264_01/sqcug/data-pump.html#GUID-60A99040-20F7-42A1-9544-DEAC0B211C85)
- [Easy Oracle Database Migration with SQLcl](https://blogs.oracle.com/developers/post/easy-oracle-database-migration-with-sqlcl)
- [Oracle Cloud：Autonomous DatabaseにSQLcl接続してみてみた](https://qiita.com/shirok/items/86355be72a47a840d10e)