Autonomous Database(ADB,ADW,ATP)へ、datapumpのダンプファイルをDBMS_DATAPUMPパッケージでimportする（スキーマモード、表領域モード、圧縮）

####概要
Oracle CloudのAutonomous Database(ADB,ADW,ATP)へ、PL/SQLのDBMS_DATAPUMPパッケージを使って、datapumpでexportされたダンプファイルをimportすることができます。簡単なケースをこちらで説明しています。
[Autonomous Data Warehouse Cloud(ADW)へ、DBMS_DATAPUMPパッケージでimportする](https://qiita.com/ts_carp/items/79909ad94764cb57f85c)

上記では「表モード」というオプションでexportしたダンプファイルでの手順を紹介しています。daptapumpには多くのオプションがあります。ここでは**スキーマモードのdatapumpのダンプファイル、表領域モードのdatapumpのダンプファイル、圧縮したダンプファイル**をimportする場合に関して紹介します。上記の手順の応用編なので、先に上の記事を参照するとよいです。
とはいえ、ここで紹介する3つのケースでのダンプファイルでも、基本的な手順（上の記事の手順）とほぼ同じです。**ダンプファイルの圧縮に関しては、exportするときに指定するだけで、あとのimportまでの手順はまったく同じです。**ここでは実際に試したときのexportのオプションと、各ダンプファイルでimportするときのポイントを紹介します。

ADBはAutonomous Data Warehouse(ADW)とAutonomous Transaction Processing(ATP)があります。本記事はADWを使って作成しています。ATPでも同様に動作します。

(参考)Autonomous Database(ADB, ADW, ATP)の使い方に関しては、下記の記事で、さまざまな場面での詳細な手順が紹介されています。使いはじめのユーザーを意識した内容です。実際に実施したいことが下記の記事にないか確認いただくとよいです。(2020/1 追記)
[Autonomous Database ハンズオンラボ（HOL）]( https://community.oracle.com/docs/DOC-1034727 )

####datapumpのモード
datapumpにはいくつかのモードと、さまざまなオプションがあります。ここでは3つのexportのケースでの対応に関して紹介します。今回はオンプレす環境のOracle Database 11gで下記のように実行して取得したダンプファイルをADWへインポートします。

```
スキーマモードでのexport 
expdp system/（パスワード） directory=DATAPUMP_DIR dumpfile=SCOTT_SCHEMA.dmp \
LOGFILE=SCOTT_SCHEMA.log SCHEMAS=SCOTT;

表領域モードでのexport
expdp system/（パスワード） directory=DATAPUMP_DIR dumpfile=TABLESPACE_USERS.dmp \ 
LOGFILE=TABLESPACE_USERS.log TABLESPACES=USERS;

ファイルの圧縮を指定してのexport（スキーマモード）
expdp system/（パスワード） directory=DATAPUMP_DIR dumpfile=SCOTT_SCHEMA_COMPRESS.dmp \
LOGFILE=SCOTT_SCHEMA_COMPRESS.log SCHEMAS=SCOTT compression=all;
```

####datapumpのスキーマモードでexportしたダンプファイルのDBMS_DATAPUMPパッケージでのimport
スキーマモードでexportしたダンプファイルを読み込ませます。下記の手順を参考に実施できます。

[Autonomous Data Warehouse Cloud(ADW)へ、DBMS_DATAPUMPパッケージでimportする : SQL DeveloperでimportのためのPL/SQLスクリプトを生成するウィザードを実行](https://qiita.com/ts_carp/items/79909ad94764cb57f85c#sql-developer%E3%81%A7import%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEplsql%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C)

ウィザードの最初の画面の「インポート・タ...」でimportのモードを指定できます。ダンプファイルがスキーマモードでexportされている場合、「表」あるいは「スキーマ」を選択します。「表」を選択するとimportを表モードで、「スキーマ」を選択するとimportをスキーマモードで実施するためのPL/SQLが生成されます。
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/368742/be12d067-7ffc-2fb1-c778-d1be59f279e2.png)

ウィザードの最初で「表」を選択した場合、２つめの画面が次のようになります。
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/368742/3059eb36-943d-adb7-a6dc-6dec9f8ab89d.png)
ダンプファイルにアクセスし、出力されているSCOTTスキーマのすべての表がリストされます。

ウィザードの最初で「スキーマ」を選択した場合、２つめの画面が次のようになります。
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/368742/8cf98dab-08c8-3d49-ab74-9c3da64d9c10.png)
ダンプファイルにアクセスし、出力されているスキーマである「SCOTT」がリストされます。

importをスキーマモードで実施すると（最初の画面で「スキーマ」を選択すると）、指定したスキーマのすべての表をimportします。またスキーマ（ユーザー）もimportで作成することができます。つまり、ここの例であればimportの前に事前にscottスキーマ（ユーザー）を作成しなくても、importの中で作成されます。事前にスキーマ（ユーザー）を作成しておいても問題ありません。
importを表モードで実施すると（最初の画面で「表」を選択すると）、表を選択してimportを実施します。スキーマ（ユーザー）はimportの実施前に作成しておきます。
今回は、表モードですべての表を選択してimportを実行することにしました。残りのウィザードも指定してPL/SQLスクリプトを生成させると、次のようなものになりました。

```
set scan off
set serveroutput on
set escape off
whenever sqlerror exit 
DECLARE
    s varchar2(1000); 
    h1 number;
    errorvarchar varchar2(100):= 'ERROR';
    tryGetStatus number := 0;
begin
    h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', job_name => 'IMP_SD_158-07_44_02_suga', version => 'COMPATIBLE'); 
    tryGetStatus := 1;
    dbms_datapump.set_parameter(h1, 'TRACE', 167144-96) ; 
    dbms_datapump.set_parameter (h1, 'PARTITION_OPTIONS', 'MERGE'); 
    dbms_datapump.metadata_transform(h1, 'SEGMENT_ATTRIBUTES', 0); 
    dbms_datapump.metadata_transform(h1, 'DWCS_CVT_IOTS', 1); 
    dbms_datapump.metadata_transform(h1, 'DWCS_CVT_CONSTRAINTS', 1); 
    dbms_datapump.metadata_filter(h1, 'EXCLUDE_PATH_EXPR',         'IN (''INDEX'',''INDEXTYPE'', ''MATERIALIZED_VIEW'',''MATERIALIZED_VIEW_LOG'',         ''MATERIALIZED_ZONEMAP'', ''CLUSTER'', ''CLUSTERING'')'); 
    dbms_datapump.set_parallel(handle => h1, degree => 1); 
    dbms_datapump.add_file(handle => h1, filename => 'IMPORT-'||to_char(sysdate,'hh24_mi_ss')||'.LOG', directory => 'DATA_PUMP_DIR', filetype=>DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 1); 
    dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''SCOTT'')'); 
    dbms_datapump.metadata_filter(handle => h1, name => 'NAME_EXPR', value => 'IN(''ADDRESS_PART1'',''ADDRESS_PART2'', 「・・・インポートする表のリスト」)'); 
    dbms_datapump.add_file(handle => h1, filename => 'https://swiftobjectstorage.（リージョンの名前）.oraclecloud.com/v1/（テナントの名前）/（バケットの名前）/SCOTT_SCHEMA.dmp', directory => 'TEST_CRED', filetype => 5); 
    dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1); 
    dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC'); 
    dbms_datapump.set_parameter(handle => h1, name => 'SKIP_UNUSABLE_INDEXES', value => 0);
    dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0); 
    dbms_datapump.detach(handle => h1); 
    errorvarchar := 'NO_ERROR'; 
EXCEPTION
    WHEN OTHERS THEN
    BEGIN 
        IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN 
            DBMS_DATAPUMP.DETACH(h1);
        END IF;
    EXCEPTION 
    WHEN OTHERS THEN 
        NULL;
    END;
    RAISE;
END;
/
````

上記の表モードでのimportのPL/SQLスクリプトと、スキーマモードのimportのPL/SQLスクリプトの違いは次の２点でした。

```
job_modoの指定が「TABLE」になっている。（スキーマモードでは「SCHEMA」になる）
    h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', job_name => 'IMP_SD_158-07_44_02_suga', version => 'COMPATIBLE'); 

importする表を追加で指定する。（スキーマモードではこの行はありません。）
    dbms_datapump.metadata_filter(handle => h1, name => 'NAME_EXPR', value => 'IN(''ADDRESS_PART1'',''ADDRESS_PART2'', 「・・・インポートする表のリスト」)'); 

```

表モードのimportのPL/SQLスクリプトを実施する前に、importする先のスキーマ（SCOTT）を作成します。次のSQLを実行しました。

```
create user scott identified by （パスワード）;
grant dwrole to scott;
```

ここで指定しているロール「dwrole」はADWで事前に作成されているロールです。実際にimportされるにあたっては、データベースの設計にあわせていただくとよいと思います（オンプレミスのDBとは異なる箇所もでてくることも考えられます）。
ロール「dwrole」に関しては、下記を参照ください。

[Using Oracle Autonomous Data Warehouse : Manage User Privileges with Autonomous Data Warehouse](https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/manage.html#GUID-50450FAD-9769-4CF7-B0D1-EC14B465B873)

生成されたPL/SQLスクリプトを、SQL Developerからadminで接続して、実行するとimportが実施されます。下記を参考に実施できます。

[Autonomous Data Warehouse Cloud(ADW)へ、DBMS_DATAPUMPパッケージでimportする : DBMS_DATAPUMPパッケージを利用するPL/SQLスクリプトを実行](https://qiita.com/ts_carp/items/79909ad94764cb57f85c#dbms_datapump%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8Bplsql%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C)

ダンプファイルにはスキーマ定義に関連した情報があり、importのログに関連したエラー（今回は無視できるもの）も出力されると考えられます。ログの中身を確認して、内容から判断するとよいです。

####datapumpの表領域モードでexportしたダンプファイルのDBMS_DATAPUMPパッケージでのimport
表領域でexportしたダンプファイルを読み込ませます。下記の手順を参考に実施できます。

[Autonomous Data Warehouse Cloud(ADW)へ、DBMS_DATAPUMPパッケージでimportする : SQL DeveloperでimportのためのPL/SQLスクリプトを生成するウィザードを実行](https://qiita.com/ts_carp/items/79909ad94764cb57f85c#sql-developer%E3%81%A7import%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEplsql%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C)

ウィザードの最初の画面の「インポート・タ...」でimportのモードを指定できます。
ADWでは事前に作成されている表領域以外に、表領域を追加することはできません。したがってimportの際のモードは表モードがよいと考えらえます。（通常のデータベースで、表領域モードのimportする場合は表領域の作成ができます）
ウィザードの最初の画面の「インポート・タ...」で「表」を選択します。次の画面で、ダンプファイルに含まれている表のすべて（該当の表領域に含まれていたすべての表）がリストされるので、必要なものを選択します。
ウィザードの「再マップ」の指定で、**なにも指定しなくても大丈夫**です。（ADWへのインポートでは表領域が変わることになると思われますが、再マップの指定をしなくても大丈夫です）
ウィザードの指定が完了すると、次のようなPL/SQLスクリプトが生成されます。これは「表モード」でexportしたダンプファイルをimportするときのスクリプトと同じです。（importを表モードに指定しているから当然）

```
set scan off
set serveroutput on
set escape off
whenever sqlerror exit 
DECLARE
    s varchar2(1000); 
    h1 number;
    errorvarchar varchar2(100):= 'ERROR';
    tryGetStatus number := 0;
begin
    h1 := dbms_datapump.open (operation => 'IMPORT', job_mode => 'TABLE', job_name => 'IMP_SD_206-03_30_17', version => 'COMPATIBLE'); 
    tryGetStatus := 1;
    dbms_datapump.set_parameter(h1, 'TRACE', 167144-96) ; 
    dbms_datapump.set_parameter (h1, 'PARTITION_OPTIONS', 'MERGE'); 
    dbms_datapump.metadata_transform(h1, 'SEGMENT_ATTRIBUTES', 0); 
    dbms_datapump.metadata_transform(h1, 'DWCS_CVT_IOTS', 1); 
    dbms_datapump.metadata_transform(h1, 'DWCS_CVT_CONSTRAINTS', 1); 
    dbms_datapump.metadata_filter(h1, 'EXCLUDE_PATH_EXPR',         'IN (''INDEX'',''INDEXTYPE'', ''MATERIALIZED_VIEW'',''MATERIALIZED_VIEW_LOG'',         ''MATERIALIZED_ZONEMAP'', ''CLUSTER'', ''CLUSTERING'')'); 
    dbms_datapump.set_parallel(handle => h1, degree => 1); 
    dbms_datapump.add_file(handle => h1, filename => 'IMPORT-'||to_char(sysdate,'hh24_mi_ss')||'.LOG', directory => 'DATA_PUMP_DIR', filetype=>DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); 
    dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 1); 
    dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''SCOTT'')'); 
    dbms_datapump.metadata_filter(handle => h1, name => 'NAME_EXPR', value => 'IN(''ADDRESS_PART1'',''ADDRESS_PART2'')'); 
    dbms_datapump.add_file(handle => h1, filename => 'https://swiftobjectstorage.（リージョンの名前）.oraclecloud.com/v1/（テナントの名前）/（バケットの名前）/USERS_TABLESPACE.dmp', directory => 'TEST_CRED', filetype => 5); 
    dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1); 
    dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC'); 
    dbms_datapump.set_parameter(handle => h1, name => 'SKIP_UNUSABLE_INDEXES', value => 0);
    dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0); 
    dbms_datapump.detach(handle => h1); 
    errorvarchar := 'NO_ERROR'; 
EXCEPTION
    WHEN OTHERS THEN
    BEGIN 
        IF ((errorvarchar = 'ERROR')AND(tryGetStatus=1)) THEN 
            DBMS_DATAPUMP.DETACH(h1);
        END IF;
    EXCEPTION 
    WHEN OTHERS THEN 
        NULL;
    END;
    RAISE;
END;
/
```

このimportのPL/SQLスクリプトを実施する前に、importする先のスキーマ（SCOTT）を作成します。次のSQLを実行しました。

```
create user scott identified by （パスワード）;
grant dwrole to scott;
```

PL/SQLスクリプトをSQL Developerからadminユーザーで実行すれば、指定した表がimportされます。下記を参考に実施できます。

[Autonomous Data Warehouse Cloud(ADW)へ、DBMS_DATAPUMPパッケージでimportする : DBMS_DATAPUMPパッケージを利用するPL/SQLスクリプトを実行](https://qiita.com/ts_carp/items/79909ad94764cb57f85c#dbms_datapump%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8Bplsql%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C)

####圧縮されたダンプファイルのimport
ダンプファイルが圧縮されていてもimportの手順には違いはありません。ここの記事で紹介した手順でダンプファイルが圧縮されたものでも、そのまま実行することができます。