【RDS for Oracle】DataPump(エクスポート)をやってみた

#事前準備
##テストユーザ/データ作成
まずはテストデータ（SCOTT）を作成する。
テストデータなので unlimited tablespaxe と DBAロールでも付与しといた。

```sql
SQL> sho user
USER is "TEST" ★マスターユーザ
SQL>
SQL> create user scott identified by tiger;
SQL> grant unlimited tablespace to scott;
SQL> grant dba to scott;
```

SCOTTでログイン

```sql
SQL> conn scott/tiger@orcl1
Connected.
SQL>
SQL> sho user
USER is "SCOTT"
```

テストデータとして、100万行のデータ作成

```sql
SQL> CREATE TABLE tbl1
(
    id  number(8),
    txt varchar2(250)
);

SQL> set timing on
SQL> declare
       vID     char(8);
       vText   varchar2(250);
     begin
       dbms_random.seed(uid); 
       for i in 1..1000000
       loop
             vID := to_char(i, 'FM00000000');
             vText := dbms_random.string('x', 16);
             insert into tbl1 (id, txt) values (vID, vText);
             if (mod(i, 1000) = 0) then
                     commit;
             end if;
       end loop;
       commit;
     end;
     /

SQL> select count(*) from tbl1;

  COUNT(*)
----------
   1000000
```

##ディレクトリオブジェクトの確認

ディレクトリオブジェクトを確認。今回は検証なので、DATA_PUMP_DIR を使用する。

```sql
SQL> set pages 100 line 200
SQL> col owner for a10
SQL> col directory_name for a20
SQL> col directory_path for a30
SQL> select * from dba_directories;

OWNER	   DIRECTORY_NAME	DIRECTORY_PATH		       ORIGIN_CON_ID
---------- -------------------- ------------------------------ -------------
SYS	   BDUMP		/rdsdbdata/log/trace			   0
SYS	   ADUMP		/rdsdbdata/log/audit			   0
SYS	   OPATCH_LOG_DIR	/rdsdbbin/oracle/QOpatch		   0
SYS	   OPATCH_SCRIPT_DIR	/rdsdbbin/oracle/QOpatch		   0
SYS	   OPATCH_INST_DIR	/rdsdbbin/oracle/OPatch 		   0
SYS	   DATA_PUMP_DIR	/rdsdbdata/datapump			   0
```

#エクスポート

expdpコマンドは使えないので[DBMS_DATAPUMPパッケージ](https://docs.oracle.com/cd/E57425_01/121/ARPLS/d_datpmp.htm)を使用しエクスポートを行う。

```sql
SQL> conn TEST/Passw0rd@orcl1
Connected.
SQL>
SQL> sho user
USER is "TEST"
```

スキーマ単位（SCOTTユーザ）でエクスポート

```sql
SQL> DECLARE
        hdnl NUMBER;
     BEGIN
        hdnl := DBMS_DATAPUMP.open( operation => 'EXPORT', job_mode => 'SCHEMA', job_name => null, version => 'COMPATIBLE');
        DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'scott.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
        DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'exp_scott.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
        DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''SCOTT'')');
        DBMS_DATAPUMP.start_job(hdnl);
    END;
    /
```

- DBMS_DATAPUMP.OPEN
    - データ・ポンプAPIを使用して新規ジョブを設定するために使用
    - operation：実行する操作のタイプ
       - EXPORT：データおよびメタデータをダンプ・ファイル・セットに保存します。または操作に必要なデータの見積りサイズを取得
       - IMPORT：データおよびメタデータをダンプ・ファイル・セットあるいはデータベース・リンクからリストア
       - SQL_FILE：ダンプ・ファイル・セット内あるいはネットワーク・リンクからのメタデータをSQLスクリプトとして表示。SQLスクリプトの場所は、ADD_FILEプロシージャで指定
    - job_mode：実行する操作の有効範囲
       - FULL：Oracle Databaseの内部スキーマを除く、全データベースまたは全ダンプ・ファイル・セットで動作
       - SCHEMA：選択された一連のスキーマで動作
       - TABLE：選択された一連の表で動作
       - TABLESPACE：選択された一連の表領域で動作
       - TRANSPORTABLE：選択された一連の表領域内の表(およびその表が依存するオブジェクト)に関するメタデータで動作し、トランスポータブル表領域のエクスポートおよびインポートを実行
   - version：抽出されるデータベース・オブジェクトのバージョン
       - COMPATIBLE：(デフォルト)データベース互換性レベルおよび機能の互換性リリース・レベルに対応するメタデータのバージョン
       - LATEST：データベース・バージョンに対応するメタデータのバージョン
       - 11.0.0'など特定のデータベース・バージョン

- DBMS_DATAPUMP.ADD_FILE
  - エクスポート、インポートまたはSQL_FILEの各操作に使用されるダンプ・ファイル・セットにファイルを追加します。あるいは、SQL_FILE操作に使用されるログ・ファイルまたは出力ファイルを指定
  - handle：ジョブのハンドル。 現行のセッションは、OPENファンクションまたはATTACHファンクションへのコールを使用して、あらかじめこのハンドルに連結しておく必要があります。
  - filename：追加されるファイルの名前
  - directory：filenameを探すために使用するデータベース内のディレクトリ・オブジェクトの名前
  - filetype：追加されるファイルのタイプ。有効な値は次のとおりで、DBMS_DATAPUMP.を前に付ける必要があります
     - KU$_FILE_TYPE_DUMP_FILE(ジョブのダンプ・ファイル)
     - KU$_FILE_TYPE_LOG_FILE(ジョブのログ・ファイル)
     - KU$_FILE_TYPE_SQL_FILE(SQL_FILEジョブの出力)

- DBMS_DATAPUMP.METADATA_FILTER
  - ジョブに含まれる項目を制限するためのフィルタを提供
  - handle：OPENファンクションから戻されたハンドル
  - name：フィルタ名
  - SCHEMA_LIST：スキーマ・モードでは、処理対象のユーザーを指定

- DBMS_DATAPUMP.START_JOB
  - ジョブの実行を開始または再開
  - handle：ジョブのハンドル。現行のセッションは、OPENファンクションまたはATTACHファンクションへのコールを使用して、あらかじめこのハンドルに連結しておく必要があります

- DBMS_DATAPUMP.WAIT_FOR_JOB
  - 正常に完了するか、またはなんらかの理由で停止するまでジョブを実行
  - handle：ジョブのハンドル。現行のセッションは、OPENファンクションまたはATTACHファンクションへのコールを使用して、あらかじめこのハンドルに連結しておく必要があります。このプロシージャが終了すると、ユーザーはハンドルから連結を解除されます。
  - job_state：実行を停止したときのジョブの状態(STOPPEDまたはCOMPLETEDのどちらか)。


出力されたダンプを確認

```sql
SQL> set pages 100 line 200
SQL> col filename for a20
SQL> select * from TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	         TYPE	    FILESIZE    MTIME
-------------------- ---------- ---------- ---------
expdb_tables.dmp     file	        4096    28-JUN-19
expdb_tables.log     file	    	89      28-JUN-19
exp_scott.log	     file		    88      28-JUN-19 ★出力されたログ
datapump/	         directory	    4096    28-JUN-19
scott.dmp	         file	        24576   28-JUN-19 ★出力されたダンプ
```

出力されたログを確認

```sql
SQL> col text for a100
SQL> SELECT TEXT FROM TABLE(RDSADMIN.RDS_FILE_UTIL.READ_TEXT_FILE('DATA_PUMP_DIR','exp_scott.log'));

TEXT
----------------------------------------------------------------------------------------------------
Starting "TEST"."SYS_EXPORT_SCHEMA_04":
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 30 MB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
. . exported "SCOTT"."TBL1"				 24.78 MB 1000000 rows
Master table "TEST"."SYS_EXPORT_SCHEMA_04" successfully loaded/unloaded
******************************************************************************
Dump file set for TEST.SYS_EXPORT_SCHEMA_04 is:
  /rdsdbdata/datapump/scott.dmp
Job "TEST"."SYS_EXPORT_SCHEMA_04" successfully completed at Fri Jun 28 03:56:29 2019 elapsed 0 00:
03:35


18 rows selected.
```

インポートは[こちら](https://qiita.com/ghogho-seki/items/9834cfa38aa346184b78)

#参考
[RDS for Oracle環境でData Pumpを利用する](https://dev.classmethod.jp/etc/data-pump-on-rds-for-oracle/)
[RDS for Oracle の DataPump](https://qiita.com/nis_nagaid_1984/items/9fd82860c11053b70c56)