ADW(Autonomous Data Warehouse) に OCI の Object Storage にアップロードした dmp を インポート(impdp)してみる。

ADW(Autonomous Data Warehouse) は ORACLE が提供する
Full Managed なデータベースの Cloud Service なんやで彡(ﾟ)(ﾟ)

 > Autonomous Data Warehouse
 > https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/

今回はこの ADW に OCI(Oracle Cloud Infrastructure) の Object Storage に
アップロードした dmp をインポート(impdp)してみます。

# 1. データのエクスポート(expdp)

まずはデータをエクスポート(expdp)します。オプションは下記参照彡(ﾟ)(ﾟ)

 > Export Your Existing Oracle Database to Import into Autonomous Data Warehouse
 > https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/load-data.html#GUID-7068E963-C464-4ABB-AC60-BA56DFC98650

実際に流したコマンドは下記です。index は exclude してません。
Object Storage に置けるファイルは 1ファイルあたり5GB までという制限があるので、
FILESIZEパラメータでdmpファイルのサイズを制限します。

```sql
expdp xxxxxxxx/yyyyyyyy@zzzzzzzz \
exclude=cluster,indextype,materialized_view,materialized_view_log,materialized_zonemap,db_link \
data_options=group_partition_table_data \
parallel=4 \
schemas=soe \
directory=DATA_PUMP_DIR \
LOGFILE=exp_soe.log \
DUMPFILE=exp_soe%U.dmp \
FILESIZE=4900MB \
REUSE_DUMPFILES=YES \
VERSION=12.2.0
```

expdpの実行結果は下記の通りです。

```sql
Export: Release 18.0.0.0.0 - Production on Mon Jan 21 16:25:09 2019
Version 18.2.0.0.0

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

Connected to: Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Starting "PDBADMIN"."SYS_EXPORT_SCHEMA_01":  PDBADMIN/********@10.0.2.3:1521/ayspdb2.sub12070931432.vcnayshibat.oraclevcn.com exclude=cluster,indextype,materialized_view,materialized_view_log,materialized_zonemap,db_link data_options=group_partition_table_data parallel=4 schemas=soe directory=DATA_PUMP_DIR LOGFILE=exp_soe.log DUMPFILE=exp_soe%U.dmp FILESIZE=4900MB REUSE_DUMPFILES=YES VERSION=12.2.0
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
:
:
  /u01/app/oracle/product/18.2/dbhome_1/rdbms/log/7C6D751E07A94BB2E0530302000AFD1F/exp_soe01.dmp
  /u01/app/oracle/product/18.2/dbhome_1/rdbms/log/7C6D751E07A94BB2E0530302000AFD1F/exp_soe02.dmp
  /u01/app/oracle/product/18.2/dbhome_1/rdbms/log/7C6D751E07A94BB2E0530302000AFD1F/exp_soe03.dmp
  /u01/app/oracle/product/18.2/dbhome_1/rdbms/log/7C6D751E07A94BB2E0530302000AFD1F/exp_soe04.dmp
Job "xxxxxxxx"."SYS_EXPORT_SCHEMA_01" successfully completed at Mon Jan 21 16:27:24 2019 elapsed 0 00:02:13
```

# 2. dmpファイルの Object Storage へのアップロード

dmpファイルを Object Storage にアップロードします。ブラウザ画面から
アップロードすることも可能なんですが、今回は OCI CLI の
コマンド(oci os object bulk-upload ...)で Object Storage にアップロードしてしまいました。

```shell
oci os object bulk-upload -ns xxxxxxxx -bn yyyyyyyy-objs001 --src-dir /u01/app/oracle/product/18.2/dbhome_1/rdbms/log/7C6D751E07A94BB2E0530302000AFD1F/
Uploaded exp_soe02.dmp  [####################################]  100%
{
  "skipped-objects": [],
  "upload-failures": {},
  "uploaded-objects": {
    "exp_soe01.dmp": {
      "etag": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "last-modified": "Mon, 21 Jan 2019 16:35:00 GMT",
      "opc-multipart-md5": "yyyyyyyyyyyyyyyyyyyyyyyyyyy"
:
}
```

成功するとアップロードされたファイルの情報がJSON形式で返ってきます。

OCI CLIのセットアップ方法は下記のブログ群が参考になります。

 > コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastructureアドバンスド
 > https://community.oracle.com/docs/DOC-1019624#jive_content_id_3_CLI
 >
 > Oracle Cloud Infrastructure CLIの導入 (後編：環境設定)
 > https://cloudii.atomitech.jp/entry/2018/08/01/104038
 >
 > [Oracle Cloud] OCI DatabaseにCLIを設定してみた
 > http://itedge.stars.ne.jp/http-itedge-stars-ne-jp-oracle-cloud-oci-database-cli/

# 3. Object Storage にアップロードしたdmpファイルの Pre-authenticated URL生成

※(追記)2019年8月現在では Object Storage の Native な URL で impdp できるようになったため、本手順によるPRA-URLの生成は不要です。  
下記ドキュメント(※要アカウント)の記載の通り、Object Storage に
アップロードした dmpファイル の Pre-authenticated URL を生成します。

 > ATP : Import to ATP From Object Store Fails with
 > 'ORA-17500: ODM Err:ODM HTTP Unauthorized' (ドキュメントID 2446550.1)
 > https://support.oracle.com/epmos/faces/DocumentDisplay?id=2446550.1

これもブラウザ画面から生成可能なんですが、今回は OCI CLI の
コマンド(oci os preauth-request create ...)で生成してしまいました。

```shell
oci os preauth-request create -ns xxxxxxxx -bn yyyyyyyy-objs001 --access-type ObjectRead --name prauth_exp_soe01 --time-expires 2099-12-31 -on exp_soe01.dmp
oci os preauth-request create -ns xxxxxxxx -bn yyyyyyyy-objs001 --access-type ObjectRead --name prauth_exp_soe02 --time-expires 2099-12-31 -on exp_soe02.dmp
oci os preauth-request create -ns xxxxxxxx -bn yyyyyyyy-objs001 --access-type ObjectRead --name prauth_exp_soe03 --time-expires 2099-12-31 -on exp_soe03.dmp
oci os preauth-request create -ns xxxxxxxx -bn yyyyyyyy-objs001 --access-type ObjectRead --name prauth_exp_soe04 --time-expires 2099-12-31 -on exp_soe04.dmp

```

下記が実行ログです。成功すると生成された Pre-authenticated URL が
JSON形式で出力されます。後からは参照不可なので、テキストファイル等に保全しておきます。

```shell
oci os preauth-request create -ns xxxxxxxx -bn yyyyyyyy-objs001 --access-type ObjectRead --name prauth_exp_soe01 --time-expires 2099-12-31 -on exp_soe01.dmp
{
  "data": {
    "access-type": "ObjectRead",
    "access-uri": "/p/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/n/xxxxxxx/b/yyyyyyyy-objs001/o/exp_soe01.dmp",
    "id": "...exp_soe01.dmp",
    "name": "prauth_exp_soe01",
    "object-name": "exp_soe01.dmp",
    "time-created": "2019-01-21T16:38:20.118000+00:00",
    "time-expires": "2099-12-31T00:00:00+00:00"
  }
}
:
}
```

# 4. OCIユーザーの作成とGROUP設定、Auth Token生成

Menu => Identity => Users => Create User で OCIユーザーを作成します。
![002_User_Create2.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/81648ad1-b008-e100-813b-38b1129c7372.jpeg)

作成したOCIユーザーをクリック => Groups で Administrator を付与します。
![003_Group_Add.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/ba36dc5f-b7e6-753d-2081-79ea291327f2.jpeg)

作成したOCIユーザーをクリック => Auth Tokens で Auth Token を生成します。
後から参照する事はできないので、テキストファイル等に保全しておきます。
![004_Generate_Token.jpg](https://qiita-image-store.s3.amazonaws.com/0/110066/10e6799c-7fcb-7d56-7570-14f8e241d584.jpeg)

# 5. DBMS_CLOUDパッケージで ADW に Credential を作成

下記マニュアルの手順を元に ADW に Credantial を作成します。

 > Import Data Using Oracle Data Pump Version 18.3 or Later
 > https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/load-data.html#GUID-297FE3E6-A823-4F98-AD50-959ED96E6969

ADW に接続して DBMS_CLOUD.CREATE_CREDENTIALプロシージャを実行します。

credential_name には任意の文字列、username には上記 4. で作成したOCIユーザー名、
passwordには上記 4. で生成した Auth Token をセットします。

```sql
CONNECT ADMIN/xxxxxxxxxxxxx@yyyyyy_high

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'OCI_CLI_AYS_ADW', -- 任意の文字列
    username => 'aysapi',                 -- OCIユーザー名
    password => 'xxxxxxxxxxxxxxxxxxxx'    -- 生成したAuth Token
  );
END;
/

PL/SQL procedure successfully completed.
```

# 6. インポート(impdp)の実行

impdpを実行してADWにデータをロードします。dumpfileパラメータには
3. で生成した Pre-authenticated URL を ,(カンマ)区切りで指定します。

```sql
impdp ADMIN/xxxxxxxxxxxxx@yyyyyy_high \
  credential=OCI_CLI_AYS_ADW \
  directory=data_pump_dir \
  dumpfile=https://objectstorage.us-ashburn-1.oraclecloud.com/p/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/n/xxxxxxxx/b/yyyyyyyy-objs001/o/exp_soe01.dmp,\
  https://objectstorage.us-ashburn-1.oraclecloud.com/p/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/n/xxxxxxxx/b/yyyyyyyy-objs001/o/exp_soe02.dmp,\
  https://objectstorage.us-ashburn-1.oraclecloud.com/p/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/n/xxxxxxxx/b/yyyyyyyy-objs001/o/exp_soe03.dmp,\
  https://objectstorage.us-ashburn-1.oraclecloud.com/p/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/n/xxxxxxxx/b/yyyyyyyy-objs001/o/exp_soe04.dmp \
  parallel=2 \
  partition_options=merge \
  transform=segment_attributes:n \
  exclude=cluster, indextype, materialized_view, materialized_view_log, materialized_zonemap, db_link \
  logfile=impdp_schema_SOE.log
```

impdpの実行結果は以下の通りです。

```sql
Import: Release 18.0.0.0.0 - Production on Tue Jan 22 06:24:47 2019
Version 18.3.0.0.0

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

Connected to: Oracle Database 18c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "ADMIN"."SYS_IMPORT_FULL_03" successfully loaded/unloaded
:
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
:
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SOE"."ORDERS"                              1.289 GB 14298586 rows
. . imported "SOE"."ORDER_ITEMS"                         2.236 GB 42511747 rows
:

Job "ADMIN"."SYS_IMPORT_FULL_03" completed with 1 error(s) at Tue Jan 22 06:42:27 2019 elapsed 0 00:17:25
```

データを確認してみると。。。

```sql
sqlplus /nolog
connect SOE/yyyyyyyy@xxxxxx_high

SELECT COUNT(*) FROM ORDERS;

  COUNT(*)
----------
  14298586
```

データがセットされてるで！彡(^)(^)

# 7. まとめ

上記 3. の ~~Pre-authenticated URL生成がハマりポイント~~ かも。つかワイはハマった彡(-)(-)
※(追記)2019年8月現在では Object Storage の Native な URL で impdp できるようになったため、本手順によるPRA-URLの生成は不要です。 
だがコレでexpdp/impdpでデータ移行して、ADWをバリバリ(死語)使うんや！彡(ﾟ)(ﾟ)