【RDS for Oracle】DataPump(インポート)をやってみた

*エクスポートは[こちら](https://qiita.com/ghogho-seki/items/3ab2dd085115d62c4307)

#ダンプファイルの転送
前回、ORCL1でエクスポートしたダンプをORCL2に転送します。

##データベース・リンクの作成
ORCL1でデータベース・リンクを作成

```sql
SQL> sho user
USER is "TEST"
SQL>
SQL> select * from user_db_links;

no rows selected

SQL>
SQL> create database link dblink_orcl connect to test identified by Passw0rd using '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = orcl2.cueblzomfczc.xxxxxx.rds.amazonaws.com)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl2)))';

Database link created.

SQL>
SQL> set pages 100 line 200
SQL> col db_link for a15
SQL> col username for a10
SQL> col password for a10
SQL> col host for a10
SQL> select * from user_db_links;

DB_LINK 	USERNAME   PASSWORD   HOST	 CREATED
--------------- ---------- ---------- ---------- ---------
DBLINK_ORCL	TEST		      ORCL2	 01-JUL-19
```
`※メモ DBLINKの削除は　"drop database link dblink_orcl;"`

##ダンプファイルの転送
ORCL1からORCL2へダンプファイルを転送

```sql
SQL> BEGIN
       DBMS_FILE_TRANSFER.PUT_FILE(
         source_directory_object       => 'DATA_PUMP_DIR',
         source_file_name              => 'scott.dmp',
         destination_directory_object  => 'DATA_PUMP_DIR', 
         destination_file_name         => 'scott_copy.dmp',
         destination_database          => 'dblink_orcl'
       );
     END;
     /

PL/SQL procedure successfully completed.
```


- [DBMS_FILE_TRANSFER.PUT_FILEプロシージャ](https://docs.oracle.com/cd/E57425_01/121/ARPLS/d_ftran.htm)
   - ローカル・ファイルまたはASMを読み取り、リモート・データベースに接続して、リモート・ファイル・システムにそのファイルのコピーを作成。

   - source_directory_object
     - ローカル・ソース・サイトにある、ファイルのコピー元のディレクトリ・オブジェクト。このディレクトリ・オブジェクトはソース・サイトに存在している必要があります。
   - source_file_name
     - ローカル・ファイル・システムからコピーされるファイルの名前。このファイルは、ローカル・ファイル・システムのソース・ディレクトリ・オブジェクトに関連付けられたディレクトリに存在している必要があります。
  - destination_directory_object
     - 宛先サイトにある、ファイルのコピー先となるディレクトリ・オブジェクト。このディレクトリ・オブジェクトはリモート・ファイル・システムに存在している必要があります。
  - destination_file_name
     - リモート・ファイル・システムにおいてコピーされるファイルの名前。同じ名前のファイルがリモート・ファイル・システムの宛先ディレクトリに存在しないようにしてください。
  - destination_database
     - ファイルのコピー先となるリモート・データベースへのデータベース・リンクの名前

##ダンプファイルの確認
ORCL2で転送されたダンプファイルを確認。

```sql
SQL> col filename for a20
SQL> SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	     TYPE	  FILESIZE MTIME
-------------------- ---------- ---------- ---------
scott_copy.dmp	     file	  26267648 02-JUL-19 ★転送された
datapump/	     directory	      4096 02-JUL-19
```

##DBMS_DATAPUMPでインポート
ORCL2側でテストデータ（SCOTT）を作成

```sql
SQL> create user scott identified by tiger;

User created.

SQL> grant unlimited tablespace to scott;

Grant succeeded.

SQL> grant dba to scott;

Grant succeeded.

SQL> conn scott/tiger@orcl2
Connected.
SQL>
SQL> sho user
USER is "SCOTT"
SQL> conn TEST/Passw0rd@orcl2
Connected.
SQL> 
SQL> sho user
USER is "TEST"
```

ORCL2側でインポートを実施

```sql
SQL> DECLARE
       hdnl NUMBER;
     BEGIN
       hdnl := DBMS_DATAPUMP.open( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null, version => 'COMPATIBLE');
       DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'scott_copy.dmp', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
       DBMS_DATAPUMP.add_file( handle => hdnl, filename => 'imp_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;
     /

PL/SQL procedure successfully 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
-------------------- ---------- ---------- ---------
scott_copy.dmp	     file	  26267648 02-JUL-19
datapump/	     directory	      4096 02-JUL-19
imp_scott.log	     file	      1096 02-JUL-19 ★ログが生成されてる

SQL> SELECT TEXT FROM TABLE(RDSADMIN.RDS_FILE_UTIL.READ_TEXT_FILE('DATA_PUMP_DIR','imp_scott.log'));

TEXT
--------------------------------------------------------------------------------
Master table "TEST"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "TEST"."SYS_IMPORT_SCHEMA_01":
```

テストデータを確認

```sql
SQL> conn scott/tiger@orcl2
Connected.
SQL>
SQL> sho user
USER is "SCOTT"
SQL>
SQL> select count(*) from user_objects;

  COUNT(*)
----------
	 1 ★SCOTTユーザのオブジェクトは１つ

SQL>
SQL> select OBJECT_NAME from user_objects;

OBJECT_NAME
--------------------------------------------------------------------------------
TBL1　★TBL１テーブルが移行されてる

SQL>
SQL> select count(*) from tbl1;

  COUNT(*)
----------
   1000000 ★１００万行のデータ
```

移行が完了したらダンプとインポート時のログは不要になるので削除

```sql
SQL> exec UTL_FILE.FREMOVE('DATA_PUMP_DIR','imp_scott.log');

PL/SQL procedure successfully completed.

SQL> exec UTL_FILE.FREMOVE('DATA_PUMP_DIR','scott_copy.dmp');

PL/SQL procedure successfully completed.

SQL>
SQL> select * from TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY MTIME;

FILENAME	     TYPE	  FILESIZE MTIME
-------------------- ---------- ---------- ---------
datapump/	     directory	      4096 02-JUL-19
```