

# Oracle Data Pump を使用したインポート
<a name="Oracle.Procedural.Importing.DataPump"></a>

Oracle Data Pump は、Oracle データのダンプファイルへのエクスポートおよび別の Oracle データベースへのインポートを行うことができるユーティリティです。Oracle Data Pump は、Oracle エクスポート/インポートユーティリティとして長期間使用されてきました。Oracle Data Pump は、Oracle データベースから Amazon RDS DB インスタンスに大量のデータを移行する際に推奨される方法でもあります。

このセクションの例では、Oracle データベースにデータをインポートする 1 つの方法を示していますが、Oracle Data Pump では他の手法もサポートしています。詳細については、[Oracle Database のドキュメント](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html#GUID-501A9908-BCC5-434C-8853-9A6096766B5A)を参照してください。

このセクションの例では `DBMS_DATAPUMP` パッケージを使用します。同じタスクは、Oracle Data Pump コマンドラインユーティリティの `impdp` および `expdp` を使用して実行できます。これらのユーティリティは、Oracle インスタントクライアントを含む Oracle クライアントインストールの一部としてリモートホストにインストールできます。詳細については、「[Oracle Instant Client を使用した Amazon RDS for Oracle DB インスタンスの Data Pumpのインポートまたはエクスポートを実行する方法](https://aws.amazon.com/premiumsupport/knowledge-center/rds-oracle-instant-client-datapump/)」を参照してください。

**Topics**
+ [Oracle Data Pump の概要](#Oracle.Procedural.Importing.DataPump.Overview)
+ [Oracle Data Pump と Amazon S3 バケットを使用したデータのインポート](#Oracle.Procedural.Importing.DataPump.S3)
+ [Oracle Data Pump とデータベースリンクを使用したデータのインポート](#Oracle.Procedural.Importing.DataPump.DBLink)

## Oracle Data Pump の概要
<a name="Oracle.Procedural.Importing.DataPump.Overview"></a>

Oracle Data Pump は、次のコンポーネントで構成されています。
+ コマンドラインクライアントの `expdp` および `impdp`
+ `DBMS_DATAPUMP` PL/SQL パッケージ
+ `DBMS_METADATA` PL/SQL パッケージ

以下のシナリオで Oracle Data Pump を使用できます。
+ Oracle データベース (オンプレミスまたは Amazon EC2 インスタンス) から RDS for Oracle DB インスタンスにデータをインポートする。
+ RDS for Oracle DB インスタンスから Oracle データベース (オンプレミスまたは Amazon EC2 インスタンス) にデータをインポートする。
+ RDS for Oracle DB インスタンス間でデータをインポートする (例: EC2-Classic から VPC へのデータ移行)。

Oracle Data Pump ユーティリティをダウンロードするには、Oracle Technical Network ウェブサイトの「[Oracle Database ソフトウェア・ダウンロード](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)」を参照してください。Oracle Database のバージョン間で移行する場合の互換性に関する考慮事項については、[Oracle Database のドキュメント](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-BAA3B679-A758-4D55-9820-432D9EB83C68)を参照してください。

### Oracle Data Pump のワークフロー
<a name="Oracle.Procedural.Importing.DataPump.Overview.how-it-works"></a>

通常、Oracle Data Pump は、以下の段階を踏んで使用します。

1. ソースデータベースのダンプファイルにデータをエクスポートします。

1. ダンプファイルを、ターゲットの RDS for Oracle DB インスタンスにアップロードします。ダンプファイルを転送するには、Amazon S3 バケットを使用するか、2 つのデータベース間のデータベースリンクを使用します。

1. ダンプファイルから RDS for Oracle DB インスタンスにデータをインポートします。

### Oracle Data Pump のベストプラクティス
<a name="Oracle.Procedural.Importing.DataPump.Overview.best-practices"></a>

Oracle Data Pump を使用して RDS for Oracle インスタンスにデータをインポートする場合は、次のベストプラクティスをお勧めします。
+ 特定のスキーマやオブジェクトをインポートするには、`schema` または `table` モードでインポートを実行します。
+ インポートするスキーマをアプリケーションに必要なスキーマに制限します。
+ `full` モードでのインポートまたはシステムが管理するコンポーネントのスキーマのインポートは行わないでください。

  RDS for Oracle では `SYS` または `SYSDBA` 管理ユーザーへのアクセスが許可されていないため、これらのアクションによって Oracle データディレクトリが損傷し、データベースの安定性が影響を受ける可能性があります。
+ 大量のデータをロードする場合は、以下の操作を実行します。

  1. ダンプファイルを、ターゲットの RDS for Oracle DB インスタンスに転送します。

  1. インスタンスのDB スナップショットを取得します。

  1. インポートをテストして、これが成功することを確認します。

  データベースコンポーネントが無効の場合は、DB インスタンスを削除後、DB スナップショットから再作成します。復元された DB インスタンスには、DB スナップショットの作成時に DB インスタンス上でステージングされたダンプファイルがすべて含まれています。
+ Oracle Data Pump エクスポートパラメータ `TRANSPORT_TABLESPACES`、`TRANSPORTABLE`、または `TRANSPORT_FULL_CHECK` を使用して作成されたダンプファイルはインポートしないでください。RDS for Oracle DB インスタンスでは、これらのダンプファイルのインポートはサポートされていません。
+ `SYS`、`SYSTEM`、`RDSADMIN`、`RDSSEC`、`RDS_DATAGUARD` の Oracle スケジューラオブジェクトを含み、以下のカテゴリに属するダンプファイルをインポートしないでください。
  + ジョブ
  + プログラム
  + スケジュール
  + チェーン
  + Rules
  + 評価コンテキスト
  + ルールセット

  RDS for Oracle DB インスタンスでは、これらのダンプファイルのインポートはサポートされていません。
+ サポートされていない Oracle Scheduler オブジェクトを除外するには、Data Pump エクスポート時に追加のディレクティブを使用します。`DBMS_DATAPUMP` を使用する場合は、`METADATA_FILTER` の前に `DBMS_METADATA.START_JOB` をさらに追加します。

  ```
  DBMS_DATAPUMP.METADATA_FILTER(
    v_hdnl,
    'EXCLUDE_NAME_EXPR',
    q'[IN (SELECT NAME FROM SYS.OBJ$ 
           WHERE TYPE# IN (66,67,74,79,59,62,46) 
           AND OWNER# IN
             (SELECT USER# FROM SYS.USER$ 
              WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
              )
          )
    ]',
    'PROCOBJ'
  );
  ```

  `expdp` を使用する場合は、次の例に示す `exclude` ディレクティブを含むパラメータファイルを作成します。その後、`PARFILE=parameter_file` コマンドで `expdp` を使用します。

  ```
  exclude=procobj:"IN 
    (SELECT NAME FROM sys.OBJ$
     WHERE TYPE# IN (66,67,74,79,59,62,46) 
     AND OWNER# IN 
       (SELECT USER# FROM SYS.USER$ 
        WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
       )
    )"
  ```

## Oracle Data Pump と Amazon S3 バケットを使用したデータのインポート
<a name="Oracle.Procedural.Importing.DataPump.S3"></a>

次のインポートプロセスでは、Oracle Data Pump と Amazon S3 バケットを使用します。ステップは次のとおりです。

1. Oracle [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) パッケージを使用して、ソースデータベースのデータをエクスポートします。

1. ダンプファイルを Amazon S3 バケットに配置します。

1. Amazon S3 バケットから、ターゲットの Amazon RDS for Oracle DB インスタンスの `DATA_PUMP_DIR` ディレクトリにダンプファイルをダウンロードします。

1. `DBMS_DATAPUMP` パッケージを使用して、コピーしたダンプファイルのデータを RDS for Oracle DB インスタンス内にインポートします。

**Topics**
+ [Oracle Data Pump と Amazon S3 バケットを使用したデータのインポートの要件](#Oracle.Procedural.Importing.DataPumpS3.requirements)
+ [ステップ 1: RDS for Oracle のターゲットの DB インスタンスのデータベースユーザーに特権を付与する](#Oracle.Procedural.Importing.DataPumpS3.Step1)
+ [ステップ 2: DBMS\$1DATAPUMP を使用してデータをダンプファイルにエクスポートする](#Oracle.Procedural.Importing.DataPumpS3.Step2)
+ [ステップ 3: Amazon S3 バケットにダンプファイルをアップロードする](#Oracle.Procedural.Importing.DataPumpS3.Step3)
+ [ステップ 4: ダンプファイルを Amazon S3 バケットからターゲット DB インスタンスにダウンロードする](#Oracle.Procedural.Importing.DataPumpS3.Step4)
+ [ステップ 5: DBMS\$1DATAPUMP を使用してダンプファイルをターゲット DB インスタンスにインポートする](#Oracle.Procedural.Importing.DataPumpS3.Step5)
+ [ステップ 6: クリーンアップ](#Oracle.Procedural.Importing.DataPumpS3.Step6)

### Oracle Data Pump と Amazon S3 バケットを使用したデータのインポートの要件
<a name="Oracle.Procedural.Importing.DataPumpS3.requirements"></a>

このプロセスには、次の要件があります。
+ Amazon S3 バケットをファイル転送に使用でき、この Amazon S3 バケットが、DB インスタンスと同じ AWS リージョン リージョン内にあることを確認します。手順については、*Amazon Simple Storage Service 入門ガイド*の「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)」を参照してください。
+ Amazon S3 バケットにアップロードするオブジェクトは、5 TB 以下にする必要があります。Amazon S3 でオブジェクトを操作する方法については、[Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html)を参照してください。
**注記**  
ダンプファイルが5 TBを超える場合、並列オプションを使用して Oracle Data Pump エクスポートを実行できます。このオペレーションは、個々のファイルの 5 TB の制限を超えないように複数のダンプファイルにデータを分散します。
+ Amazon RDS 統合用の Amazon S3 バケットは、「[Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定](oracle-s3-integration.preparing.md)」の手順に従って準備してください。
+ 移行元のインスタンスと移行先の DB インスタンスにダンプファイルを保存するための十分なストレージ領域が必要です。

**注記**  
このプロセスでは、`DATA_PUMP_DIR` ディレクトリ (すべての Oracle DB インスタンスで事前に設定されているディレクトリ) にダンプファイルをインポートします。このディレクトリはデータファイルと同じストレージボリュームにあります。ダンプファイルをインポートした場合、既存の Oracle データファイルのスペース占有率は高くなります。そのため、DB インスタンスではスペースの追加占有に対応できることを確認する必要があります。インポートしたダンプファイルは、`DATA_PUMP_DIR` ディレクトリから自動的に削除またはパージされることはありません。インポートしたダンプファイルを削除するには、Oracle ウェブサイトにある [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF) を使用します。

### ステップ 1: RDS for Oracle のターゲットの DB インスタンスのデータベースユーザーに特権を付与する
<a name="Oracle.Procedural.Importing.DataPumpS3.Step1"></a>

このステップでは、データのインポート先となるスキーマを作成し、ユーザーに必要な特権を付与します。

**RDS for Oracle ターゲットインスタンスでユーザーを作成し、必要な特権を付与するには**

1. SQL\$1Plus や Oracle SQL Developer を使用して、データをインポートする先の RDS for Oracle DB インスタンスにマスターユーザーとしてログインします。DB インスタンスへの接続方法については、「[Oracle DB インスタンスへの接続](USER_ConnectToOracleInstance.md)」を参照ください。　　　

1. データをインポートする前に、必要なテーブルスペースを作成します。詳細については、「[RDS for Oracle でのテーブルスペースの作成とサイズ設定](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)」を参照してください。

1. データのインポート先のユーザーアカウントが存在しない場合は、ユーザーアカウントを作成し、必要なアクセス許可とロールを付与します。データを複数のユーザースキーマにインポートする場合は、各ユーザーアカウントを作成し、それぞれ必要な権限およびロールを付与します。

   例えば、以下の SQL ステートメントでは、新しいユーザーを作成して、ユーザーが所有するスキーマ内にデータをインポートするために必要な特権とロールを付与します。`schema_1` を、このステップおよび次のステップのスキーマ名に置き換えます。

   ```
   CREATE USER schema_1 IDENTIFIED BY my_password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

   前のステートメントでは、新規ユーザーに特権 `CREATE SESSION` とロール `RESOURCE` を付与します。インポートするデータベースオブジェクトによっては、特権とロールの追加が必要になる場合があります。

### ステップ 2: DBMS\$1DATAPUMP を使用してデータをダンプファイルにエクスポートする
<a name="Oracle.Procedural.Importing.DataPumpS3.Step2"></a>

ダンプファイルを作成するには、`DBMS_DATAPUMP` パッケージを使用します。

**Oracle データをダンプファイルにエクスポートするには**

1. 管理ユーザーとして、SQL Plus または Oracle SQL Developer を使用してソースの RDS for Oracle DB インスタンスに接続します。移行元のデータベースが RDS for Oracle DB インスタンスである場合は、Amazon RDS マスターユーザーとして接続します。

1. `DBMS_DATAPUMP` プロシージャを呼び出して、データをエクスポートします。

   次のスクリプトでは、`DATA_PUMP_DIR` ディレクトリ内の `sample.dmp` という名前のダンプファイルに `SCHEMA_1` スキーマをエクスポートします。`SCHEMA_1` をエクスポートするスキーマの名前に置き換えます。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN(
       operation => 'EXPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl         , 
       filename  => 'sample.dmp'   , 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_exp.log', 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM SYS.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注記**  
Data Pump は非同期的にジョブを開始します。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「[ジョブステータスのモニタリング](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)」を参照してください。

1. (オプション) `rdsadmin.rds_file_util.read_text_file` プロシージャを呼び出してエクスポートログの内容を表示します。詳細については、「[DB インスタンスディレクトリ内のファイルの読み取り](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)」を参照してください。

### ステップ 3: Amazon S3 バケットにダンプファイルをアップロードする
<a name="Oracle.Procedural.Importing.DataPumpS3.Step3"></a>

Amazon RDS プロシージャ `rdsadmin.rdsadmin_s3_tasks.upload_to_s3` を使用して、Amazon S3 バケットにダンプファイルをコピーします。次の例では、`DATA_PUMP_DIR` ディレクトリのすべてのファイルを、`amzn-s3-demo-bucket` という名前の Amazon S3 バケットにアップロードします。

```
SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
  p_bucket_name    =>  'amzn-s3-demo-bucket',       
  p_directory_name =>  'DATA_PUMP_DIR') 
AS TASK_ID FROM DUAL;
```

`SELECT` ステートメントでは、データ型 `VARCHAR2` のタスクの ID が返ります。詳細については、「[RDS for Oracle DB インスタンスから Amazon S3 バケットにファイルをアップロードする](oracle-s3-integration.using.md#oracle-s3-integration.using.upload)」を参照してください。

### ステップ 4: ダンプファイルを Amazon S3 バケットからターゲット DB インスタンスにダウンロードする
<a name="Oracle.Procedural.Importing.DataPumpS3.Step4"></a>

Amazon RDS プロシージャ `rdsadmin.rdsadmin_s3_tasks.download_from_s3` を使用して、このステップを実行します。ファイルをディレクトリにダウンロードするとき、ディレクトリに同じ名前のファイルが既に存在する場合、プロシージャ `download_from_s3` はダウンロードをスキップします。ダウンロードディレクトリからファイルを削除するには、Oracle ウェブサイトにある [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF) を使用します。

**ダンプファイルをダウンロードするには**

1. SQL\$1Plus または Oracle SQL Developer を起動し、Amazon RDS ターゲットの Oracle DB インスタンスにマスターとしてログインします。

1. Amazon RDS プロシージャ `rdsadmin.rdsadmin_s3_tasks.download_from_s3` を使用してダンプファイルをダウンロードします。

   次の例では、`amzn-s3-demo-bucket` という名前の Amazon S3 バケットからディレクトリ `DATA_PUMP_DIR` にすべてのファイルをダウンロードします。

   ```
   SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
     p_bucket_name    =>  'amzn-s3-demo-bucket',
     p_directory_name =>  'DATA_PUMP_DIR')
   AS TASK_ID FROM DUAL;
   ```

   `SELECT` ステートメントでは、データ型 `VARCHAR2` のタスクの ID が返ります。詳細については、「[Amazon S3 バケットから Oracle DB インスタンスにファイルをダウンロードする](oracle-s3-integration.using.md#oracle-s3-integration.using.download)」を参照してください。

### ステップ 5: DBMS\$1DATAPUMP を使用してダンプファイルをターゲット DB インスタンスにインポートする
<a name="Oracle.Procedural.Importing.DataPumpS3.Step5"></a>

`DBMS_DATAPUMP` を使用して、RDS for Oracle DB インスタンスにスキーマをインポートします。`METADATA_REMAP` などの追加オプションが必要になる場合があります。

**ターゲット DB インスタンスにデータをインポートするには**

1. SQL\$1Plus または SQL Developer を起動し、RDS for Oracle DB インスタンスにマスターユーザーとしてログインします。

1. `DBMS_DATAPUMP` プロシージャを呼び出して、データをインポートします。

   次の例では、`sample_copied.dmp` からターゲット DB インスタンスに *SCHEMA\$11* データをインポートします。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'IMPORT', 
       job_mode  => 'SCHEMA', 
       job_name  => null);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_copied.dmp', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_dump_file);
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample_imp.log', 
       directory => 'DATA_PUMP_DIR', 
       filetype  => dbms_datapump.ku$_file_type_log_file);
     DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注記**  
Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「[ジョブステータスのモニタリング](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)」を参照してください。インポートログの内容は、`rdsadmin.rds_file_util.read_text_file` の手順を使用して表示できます。詳細については、「[DB インスタンスディレクトリ内のファイルの読み取り](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)」を参照してください。

1. ターゲット DB インスタンスのスキーマテーブルを一覧表示して、データのインポートを検証します。

   例えば、次のクエリでは、`SCHEMA_1` のテーブル数が返ります。

   ```
   SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1';
   ```

### ステップ 6: クリーンアップ
<a name="Oracle.Procedural.Importing.DataPumpS3.Step6"></a>

データをインポートしたら、保管が不要になったファイルは削除できます。

**不要なファイルを削除するには**

1. SQL\$1Plus または SQL Developer を起動し、RDS for Oracle DB インスタンスにマスターユーザーとしてログインします。

1. 次のコマンドを使用して `DATA_PUMP_DIR` のファイルを一覧表示します。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
   ```

1. `DATA_PUMP_DIR` 内の不要になったファイルを削除するには、次のコマンドを使用します。

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','filename');
   ```

   例えば、次のコマンドは、`sample_copied.dmp` という名前のファイルが削除されます。

   ```
   EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
   ```

## Oracle Data Pump とデータベースリンクを使用したデータのインポート
<a name="Oracle.Procedural.Importing.DataPump.DBLink"></a>

次のインポートプロセスでは、Oracle Data Pump と Oracle [DBMS\$1FILE\$1TRANSFER](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_FILE_TRANSFER.html) パッケージを使用します。ステップは次のとおりです。

1. ソースの Oracle データベース (オンプレミスデータベース、Amazon EC2 インスタンス、または RDS for Oracle DB インスタンス) に接続します。

1. [DBMS\$1DATAPUMP](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html) を使用してデータをエクスポートします。

1. `DBMS_FILE_TRANSFER.PUT_FILE` を使用して、Oracle インスタンスのダンプファイルを、データベースリンクを使用して接続されているターゲットの RDS for Oracle DB インスタンスの `DATA_PUMP_DIR` ディレクトリにコピーします。

1. ` DBMS_DATAPUMP` パッケージを使用して、コピーしたダンプファイルのデータを RDS for Oracle DB インスタンス内にインポートします。

Oracle Data Pump と `DBMS_FILE_TRANSFER` バケットを使用したインポートプロセスでは、次のステップを使用します。

**Topics**
+ [Oracle Data Pump とデータベースリンクを使用したデータのインポートの要件](#Oracle.Procedural.Importing.DataPumpDBLink.requirements)
+ [ステップ 1: RDS for Oracle のターゲットの DB インスタンスのユーザーに特権を付与する](#Oracle.Procedural.Importing.DataPumpDBLink.Step1)
+ [ステップ 2: ソースデータベースのユーザーに特権を付与する](#Oracle.Procedural.Importing.DataPumpDBLink.Step2)
+ [ステップ 3: DBMS\$1DATAPUMP を使用してダンプファイルを作成する](#Oracle.Procedural.Importing.DataPumpDBLink.Step3)
+ [ステップ 4: 移行先の DB インスタンスへのデータベースリンクを作成する](#Oracle.Procedural.Importing.DataPumpDBLink.Step4)
+ [ステップ 5: DBMS\$1FILE\$1TRANSFER を使用して、エクスポートされたダンプファイルをターゲットの DB インスタンスにコピーする](#Oracle.Procedural.Importing.DataPumpDBLink.Step5)
+ [ステップ 6: DBMS\$1DATAPUMP を使用してターゲットの DB インスタンスにデータファイルをインポートする](#Oracle.Procedural.Importing.DataPumpDBLink.Step6)
+ [ステップ 7: クリーンアップ](#Oracle.Procedural.Importing.DataPumpDBLink.Step7)

### Oracle Data Pump とデータベースリンクを使用したデータのインポートの要件
<a name="Oracle.Procedural.Importing.DataPumpDBLink.requirements"></a>

このプロセスには、次の要件があります。
+ `DBMS_FILE_TRANSFER` パッケージと `DBMS_DATAPUMP` パッケージに対する実行権限が必要です。
+ 移行元の DB インスタンスの `DATA_PUMP_DIR` ディレクトリに対する書き込み権限が必要です。
+ 移行元のインスタンスと移行先の DB インスタンスにダンプファイルを保存するための十分なストレージ領域が必要です。

**注記**  
このプロセスでは、`DATA_PUMP_DIR` ディレクトリ (すべての Oracle DB インスタンスで事前に設定されているディレクトリ) にダンプファイルをインポートします。このディレクトリはデータファイルと同じストレージボリュームにあります。ダンプファイルをインポートした場合、既存の Oracle データファイルのスペース占有率は高くなります。そのため、DB インスタンスではスペースの追加占有に対応できることを確認する必要があります。インポートしたダンプファイルは、`DATA_PUMP_DIR` ディレクトリから自動的に削除またはパージされることはありません。インポートしたダンプファイルを削除するには、Oracle ウェブサイトにある [UTL\$1FILE.FREMOVE](https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/UTL_FILE.html#GUID-09B09C2A-2C21-4F70-BF04-D0EEA7B59CAF) を使用します。

### ステップ 1: RDS for Oracle のターゲットの DB インスタンスのユーザーに特権を付与する
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step1"></a>

RDS for Oracle のターゲットの DB インスタンスのユーザーに特権を付与するには、次のステップを行います。

1. SQL Plus または Oracle SQL Developer を使用して、データをインポートする RDS for Oracle DB インスタンスに接続します。Amazon RDS マスターユーザーとして接続します。DB インスタンスへの接続方法については、「[Oracle DB インスタンスへの接続](USER_ConnectToOracleInstance.md)」を参照してください。

1. データをインポートする前に、必要なテーブルスペースを作成します。詳細については、「[RDS for Oracle でのテーブルスペースの作成とサイズ設定](Appendix.Oracle.CommonDBATasks.TablespacesAndDatafiles.md#Appendix.Oracle.CommonDBATasks.CreatingTablespacesAndDatafiles)」を参照してください。

1. データのインポート先のユーザーアカウントが存在しない場合は、ユーザーアカウントを作成し、必要なアクセス許可とロールを付与します。データを複数のユーザースキーマにインポートする場合は、各ユーザーアカウントを作成し、それぞれ必要な特権およびロールを付与します。

   例えば、以下のコマンドでは、*schema\$11* という名前の新しいユーザーを作成して、このユーザーのスキーマ内にデータをインポートするために必要なアクセス許可とロールを付与します。

   ```
   CREATE USER schema_1 IDENTIFIED BY my-password;
   GRANT CREATE SESSION, RESOURCE TO schema_1;
   ALTER USER schema_1 QUOTA 100M ON users;
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

   この前の例では、新規ユーザーに特権 `CREATE SESSION` とロール `RESOURCE` を付与します。インポートするデータベースオブジェクトによっては、特権とロールの追加が必要になる場合があります。
**注記**  
`schema_1` を、このステップおよび次のステップのスキーマ名に置き換えます。

### ステップ 2: ソースデータベースのユーザーに特権を付与する
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step2"></a>

SQL \$1Plus または Oracle SQL Developer を使用して、インポートするデータが含まれている RDS for Oracle DB インスタンスに接続します。必要に応じて、ユーザーアカウントを作成し、必要なアクセス許可を付与します。

**注記**  
移行元のデータベースが Amazon RDS インスタンスの場合、このステップは省略できます。エクスポートを行うには、Amazon RDS マスターユーザーアカウントを使用します。

次のコマンドでは、新しいユーザーを作成し、必要なアクセス許可を付与します。

```
CREATE USER export_user IDENTIFIED BY my-password;
GRANT CREATE SESSION, CREATE TABLE, CREATE DATABASE LINK TO export_user;
ALTER USER export_user QUOTA 100M ON users;
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO export_user;
GRANT SELECT_CATALOG_ROLE TO export_user;
GRANT EXECUTE ON DBMS_DATAPUMP TO export_user;
GRANT EXECUTE ON DBMS_FILE_TRANSFER TO export_user;
```

**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

### ステップ 3: DBMS\$1DATAPUMP を使用してダンプファイルを作成する
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step3"></a>

ダンプファイルを作成するには、次の手順に従います。

1. 管理ユーザーまたはステップ 2 で作成したユーザーとして、SQL\$1Plus または Oracle SQL Developer を使用してソースの Oracle インスタンスに接続します。移行元のデータベースが Amazon RDS for Oracle DB インスタンスである場合は、Amazon RDS マスターユーザーとして接続します。

1. Oracle Data Pump ユーティリティを使用してダンプファイルを作成します。

   次のスクリプトでは、`DATA_PUMP_DIR` ディレクトリに *sample.dmp* というダンプファイルを作成します。

   ```
   DECLARE
     v_hdnl NUMBER;
   BEGIN
     v_hdnl := DBMS_DATAPUMP.OPEN( 
       operation => 'EXPORT' , 
       job_mode  => 'SCHEMA' , 
       job_name  => null
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl, 
       filename  => 'sample.dmp'    , 
       directory => 'DATA_PUMP_DIR' , 
       filetype  => dbms_datapump.ku$_file_type_dump_file
     );
     DBMS_DATAPUMP.ADD_FILE( 
       handle    => v_hdnl           , 
       filename  => 'sample_exp.log' , 
       directory => 'DATA_PUMP_DIR'  , 
       filetype  => dbms_datapump.ku$_file_type_log_file
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl              ,
       'SCHEMA_EXPR'       ,
       'IN (''SCHEMA_1'')'
     );
     DBMS_DATAPUMP.METADATA_FILTER(
       v_hdnl,
       'EXCLUDE_NAME_EXPR',
       q'[IN (SELECT NAME FROM sys.OBJ$ 
              WHERE TYPE# IN (66,67,74,79,59,62,46) 
              AND OWNER# IN 
                (SELECT USER# FROM SYS.USER$ 
                 WHERE NAME IN ('RDSADMIN','SYS','SYSTEM','RDS_DATAGUARD','RDSSEC')
                )
             )
       ]',
       'PROCOBJ'
     );
     DBMS_DATAPUMP.START_JOB(v_hdnl);
   END;
   /
   ```
**注記**  
Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「[ジョブステータスのモニタリング](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)」を参照してください。エクスポートログの内容は、`rdsadmin.rds_file_util.read_text_file` の手順を使用して表示できます。詳細については、「[DB インスタンスディレクトリ内のファイルの読み取り](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)」を参照してください。

### ステップ 4: 移行先の DB インスタンスへのデータベースリンクを作成する
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step4"></a>

移行元の DB インスタンスと移行先の DB インスタンスの間にデータベースリンクを作成します。データベースリンクを作成してエクスポートダンプファイルを転送するには、DB インスタンスとのネットワーク接続がローカルの Oracle インスタンスに必要です。

このステップでは、前のステップと同じユーザーアカウントを使用して接続します。

同じ VPC 内またはピア接続された VPC 内の 2 つの DB インスタンス間のデータベースリンクを作成する場合、2 つの DB インスタンス間には有効なルートがある必要があります。各 DB インスタンスのセキュリティグループは他の DB インスタンスの受信と送信を許可する必要があります。セキュリティグループのインバウンドルールとアウトバウンドルールは、同じ VPC またはピアリング接続先 VPC からセキュリティグループを参照できます。詳細については、「[VPC の DB インスタンスで使用するデータベースリンクの調整](Appendix.Oracle.CommonDBATasks.DBLinks.md)」を参照してください。

次のコマンドでは、ターゲットの DB インスタンスの Amazon RDS マスターユーザーに接続する `to_rds` という名前のデータベースリンクを作成します。

```
CREATE DATABASE LINK to_rds 
  CONNECT TO <master_user_account> IDENTIFIED BY <password>
  USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<dns or ip address of remote db>)
         (PORT=<listener port>))(CONNECT_DATA=(SID=<remote SID>)))';
```

### ステップ 5: DBMS\$1FILE\$1TRANSFER を使用して、エクスポートされたダンプファイルをターゲットの DB インスタンスにコピーする
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step5"></a>

`DBMS_FILE_TRANSFER` を使用して、移行元のデータベースインスタンスから移行先の DB インスタンスにダンプファイルをコピーします。次のスクリプトでは、ソースのインスタンスから *to\$1rds* という名前のターゲットのデータベースリンク (前のステップで作成) に sample.dmp というダンプファイルをコピーします。

```
BEGIN
  DBMS_FILE_TRANSFER.PUT_FILE(
    source_directory_object       => 'DATA_PUMP_DIR',
    source_file_name              => 'sample.dmp',
    destination_directory_object  => 'DATA_PUMP_DIR',
    destination_file_name         => 'sample_copied.dmp', 
    destination_database          => 'to_rds' );
END;
/
```

### ステップ 6: DBMS\$1DATAPUMP を使用してターゲットの DB インスタンスにデータファイルをインポートする
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step6"></a>

Oracle Data Pump を使用してスキーマを DB インスタンスにインポートします。METADATA\$1REMAP などの追加オプションが必要になる場合があります。

 Amazon RDS マスターユーザーアカウントで DB インスタンスに接続し、インポートを実行します。

```
DECLARE
  v_hdnl NUMBER;
BEGIN
  v_hdnl := DBMS_DATAPUMP.OPEN( 
    operation => 'IMPORT', 
    job_mode  => 'SCHEMA', 
    job_name  => null);
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_copied.dmp',
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_dump_file );
  DBMS_DATAPUMP.ADD_FILE( 
    handle    => v_hdnl, 
    filename  => 'sample_imp.log', 
    directory => 'DATA_PUMP_DIR', 
    filetype  => dbms_datapump.ku$_file_type_log_file);
  DBMS_DATAPUMP.METADATA_FILTER(v_hdnl,'SCHEMA_EXPR','IN (''SCHEMA_1'')');
  DBMS_DATAPUMP.START_JOB(v_hdnl);
END;
/
```

**注記**  
Data Pump ジョブは非同期的に開始されます。Data Pump ジョブのモニタリングについては、Oracle ドキュメントの「[ジョブステータスのモニタリング](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump-overview.html#GUID-E365D74E-12CD-495C-BA23-5A55F679C7E7)」を参照してください。インポートログの内容は、`rdsadmin.rds_file_util.read_text_file` の手順を使用して表示できます。詳細については、「[DB インスタンスディレクトリ内のファイルの読み取り](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)」を参照してください。

DB インスタンスでユーザーのテーブルを表示することで、データのインポートを検証できます。例えば、次のクエリでは、`schema_1` のテーブル数が返ります。

```
SELECT COUNT(*) FROM DBA_TABLES WHERE OWNER='SCHEMA_1'; 
```

### ステップ 7: クリーンアップ
<a name="Oracle.Procedural.Importing.DataPumpDBLink.Step7"></a>

データをインポートしたら、保管が不要になったファイルは削除できます。次のコマンドを使用して `DATA_PUMP_DIR` のファイルを一覧表示できます。

```
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')) ORDER BY MTIME;
```

`DATA_PUMP_DIR` 内の不要になったファイルを削除するには、次のコマンドを使用します。

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','<file name>');
```

例えば、次のコマンドは、`"sample_copied.dmp"` という名前のファイルが削除されます。

```
EXEC UTL_FILE.FREMOVE('DATA_PUMP_DIR','sample_copied.dmp'); 
```