

# Amazon RDS の Oracle にデータをインポートする
<a name="Oracle.Procedural.Importing"></a>

Amazon RDS for Oracle DB インスタンスにデータをインポートする方法は、次の条件によって異なります。
+ 保有しているデータの量
+ データベース内のデータベースオブジェクトの数
+ データベース内のさまざまなデータベースオブジェクト

例えば、要件に応じて、次のツールを使用できます。
+ Oracle SQL Developer — シンプルな 20 MB のデータベースを 1 つインポートできます。
+ Oracle Data Pump – 複雑なデータベースや、サイズが数百メガバイトまたは数テラバイトのデータベースをインポートできます。例えば、オンプレミスのデータベースから RDS for Oracle DB インスタンスにテーブルスペースを転送できます。Amazon S3 または Amazon EFS を使用して、データファイルとメタデータを転送できます。詳細については、[Oracle トランスポータブル表領域を使用した移行](oracle-migrating-tts.md)、[Amazon EFS の統合](oracle-efs-integration.md)、および[「Amazon S3 統合」](oracle-s3-integration.md)を参照してください。
+ AWS Database Migration Service (AWS DMS) — ダウンタイムなしでデータベースを移行できます。AWS DMS の詳細については、「[AWS Database Migration Service とは](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)」およびブログ記事「[AWS DMS を使用してほぼゼロのダウンタイムで Oracle データベースを移行する](https://aws.amazon.com/blogs/database/migrating-oracle-databases-with-near-zero-downtime-using-aws-dms/)」参照してください。

**重要**  
前述の移行方法のいずれかを使用する前に、データベースをバックアップすることをお勧めします。データのインポート後に、スナップショットを作成して RDS for Oracle DB インスタンスをバックアップできます。後で、スナップショットを復元できます。詳細については、「[データのバックアップ、復元、エクスポート](CHAP_CommonTasks.BackupRestore.md)」を参照してください。

多くのデータベースエンジンでは、ターゲットデータベースに切り替える準備ができるまで、進行中のレプリケーションを続行できます。AWS DMS を使用して、同じデータベースエンジンまたは異なるエンジンから RDS for Oracle に移行できます。別のデータベースエンジンから移行する場合は、AWS Schema Conversion Tool を使用します。これにより、AWS DMS では移行できないスキーマオブジェクトを移行できます。

**Topics**
+ [Oracle SQL Developer を使用したインポート](Oracle.Procedural.Importing.SQLDeveloper.md)
+ [Oracle トランスポータブル表領域を使用した移行](oracle-migrating-tts.md)
+ [Oracle Data Pump を使用したインポート](Oracle.Procedural.Importing.DataPump.md)
+ [Oracle エクスポート/インポートを使用したインポート](Oracle.Procedural.Importing.ExportImport.md)
+ [Oracle SQL\$1Loader を使用したインポート](Oracle.Procedural.Importing.SQLLoader.md)
+ [Oracle マテリアライズドビューを使用した移行](Oracle.Procedural.Importing.Materialized.md)

# Oracle SQL Developer を使用したインポート
<a name="Oracle.Procedural.Importing.SQLDeveloper"></a>

Oracle SQL Developer は、Oracle によって無償で配布されるグラフィカルな Java ツールです。SQL Developer には、2 つの Oracle データベース間でデータを移行したり、MySQL などの他のデータベースから Oracle データベースへデータを移行したりするためのオプションが用意されています。このツールは、小規模なデータベースの移行に最適です。

このツールは、デスクトップコンピュータ (Windows、Linux、Mac) またはいずれか 1 つのサーバーにインストールできます。SQL Developer をインストールすると、SQL Developer を使用して移行元のデータベースと移行先のデータベースに接続できます。[Tools] メニューの **[Database Copy]** コマンドを使用して、Amazon RDS インスタンスにデータをコピーします。

SQL Developer をダウンロードするには、[ http://www.oracle.com/technetwork/developer-tools/sql-developer](http://www.oracle.com/technetwork/developer-tools/sql-developer) にアクセスしてください。

データの移行を開始する前に、Oracle SQL Developer 製品のドキュメントを読むことをお勧めします。Oracle には、MySQL や SQL Server などの他のデータベースから移行する方法に関するドキュメントも用意されています。詳細については、Oracle のドキュメントの [http://www.oracle.com/technetwork/database/migration](http://www.oracle.com/technetwork/database/migration) を参照してください。

# Oracle トランスポータブル表領域を使用した移行
<a name="oracle-migrating-tts"></a>

Oracle トランスポータブル表領域機能を使用して、オンプレミスの Oracle データベースから RDS for Oracle DB インスタンスにテーブルスペースのセットをコピーできます。物理レベルでは、Amazon EFS または Amazon S3 を使用して、ソースデータファイルとメタデータファイルをターゲット DB インスタンスに転送します。トランスポータブルテーブルスペース機能は `rdsadmin.rdsadmin_transport_util` パッケージを使用します。このプロシージャの構文とセマンティクスについては、「[テーブルスペースの転送](rdsadmin_transport_util.md)」を参照してください。

表領域をトランスポートする方法を説明したブログ記事については、「[Migrate Oracle Databases to AWS using transportable tablespace](https://aws.amazon.com/blogs/database/migrate-oracle-databases-to-aws-using-transportable-tablespace/)」と「[Amazon RDS for Oracle Transportable Tablespaces using RMAN](https://aws.amazon.com/blogs/database/amazon-rds-for-oracle-transportable-tablespaces-using-rman/)」を参照してください。

**Topics**
+ [Oracle トランスポータブル表領域の概要](#oracle-migrating-tts.overview)
+ [フェーズ 1: ソースホストをセットアップする](#oracle-migrating-tts.setup-phase)
+ [フェーズ 2: 表領域のフルバックアップを準備する](#oracle-migrating-tts.initial-br-phase)
+ [フェーズ 3: 増分バックアップを作成および転送する](#oracle-migrating-tts.roll-forward-phase)
+ [フェーズ 4: 表領域をトランスポートする](#oracle-migrating-tts.final-br-phase)
+ [フェーズ 5: 転送された表領域を検証する](#oracle-migrating-tts.validate)
+ [フェーズ 6: 残ったファイルをクリーンアップする](#oracle-migrating-tts.cleanup)

## Oracle トランスポータブル表領域の概要
<a name="oracle-migrating-tts.overview"></a>

トランスポータブル表領域セットは、トランスポートされる表領域セットのデータファイルと、表領域メタデータを含むエクスポートダンプファイルで構成されます。トランスポータブル表領域などの物理的な移行ソリューションでは、物理ファイル (データファイル、構成ファイル、Data Pump ダンプファイル) を転送します。

**Topics**
+ [トランスポータブル表領域のメリットとデメリット](#oracle-migrating-tts.overview.benefits)
+ [トランスポータブル表領域の制限事項](#oracle-migrating-tts.limitations)
+ [トランスポータブル表領域の前提条件](#oracle-migrating-tts.requirements)

### トランスポータブル表領域のメリットとデメリット
<a name="oracle-migrating-tts.overview.benefits"></a>

ダウンタイムを最小限に抑えて 1 つ以上の大きな表領域を RDS に移行する必要がある場合は、トランスポータブル表領域を使用することをお勧めします。トランスポータブル表領域には、論理移行に比べて次のような利点があります。
+ ダウンタイムは他のほとんどの Oracle 移行ソリューションよりも短いです。
+ トランスポータブル表領域機能は物理ファイルのみをコピーするため、論理移行で発生する可能性のあるデータ整合性エラーや論理的な破損を回避できます。
+ 追加のライセンスは必要ありません。
+ 例えば、Oracle Solaris プラットフォームから Linux など、さまざまなプラットフォームやエンディアンネスタイプにわたって表領域のセットを移行できます。ただし、Windows サーバーとの間で表領域を転送したり、Windows サーバーから転送することはサポートされていません。
**注記**  
Linux は完全にテスト済みでサポートされています。すべての UNIX バリエーションでテストされているわけではありません。

トランスポータブル表領域を使用する場合は、Amazon S3 または Amazon EFS を使用してデータを転送できます。
+ EFS を使用する場合、バックアップはインポート中も EFS ファイルシステムに残ります。ファイルは後で削除できます。この手法では、DB インスタンスに EBS ストレージをプロビジョニングする必要はありません。このため、S3 ではなく Amazon EFS を使用することをお勧めします。詳細については、「[Amazon EFS の統合](oracle-efs-integration.md)」を参照してください。
+ S3 を使用する場合、DB インスタンスに接続された EBS ストレージに RMAN バックアップをダウンロードします。インポート中、ファイルは EBS ストレージに残ります。インポート後にこのスペースを解放できます。このスペースは DB インスタンスに割り当てられたままです。

トランスポータブル表領域の主な欠点は、Oracle Database に関する比較的高度な知識が必要なことです。詳細は、*Oracle Database 管理者ガイド*の「[データベース間での表領域のトランスポート](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-F7B2B591-AA88-4D16-8DCF-712763923FFB)」を参照してください。

### トランスポータブル表領域の制限事項
<a name="oracle-migrating-tts.limitations"></a>

RDS for Oracle でこの機能を使用する場合、Oracle データベースのトランスポータブル表領域の制限が適用されます。詳細は、*Oracle Database 管理者ガイド*の「[トランスポータブル表領域の制限]( https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-DAB51E42-9BBC-4001-B5CB-0ECDBE128787)」および「[データのトランスポートに関する一般的な制限](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)」を参照してください。RDS for Oracle のトランスポータブル表領域には、さらに次の制限があることに注意してください。
+ ソースデータベースとターゲットデータベースのどちらも Standard Edition 2 (SE2) を使用できません。Enterprise Edition のみがサポートされています。
+ Oracle Database 11g データベースをソースとして使用することはできません。RMAN クロスプラットフォームトランスポータブルテーブルスペース機能は、Oracle Database 11g がサポートしていない RMAN トランスポートメカニズムに依存しています。
+ トランスポータブル表領域を使用して RDS for Oracle DB インスタンスからデータを移行することはできません。トランスポータブル表領域は、データを RDS for Oracle DB インスタンスに移行するときのみに使用できます。
+ Windows オペレーティングシステムはサポートされていません。
+ 表領域を下位リリースレベルのデータベースにトランスポートすることはできません。ターゲットデータベースは、ソースデータベースと同じかそれ以降のリリースレベルでなければいけません。例えば、表領域を Oracle Database 21c から Oracle Database 19c にトランスポートすることはできません。
+ `SYSTEM` および `SYSAUX` などの管理上の表領域はトランスポートできません。
+ PL/SQL パッケージ、Java クラス、ビュー、トリガー、シーケンス、ユーザー、ロール、一時テーブルなどの非データオブジェクトは転送できません。データ以外のオブジェクトを転送するには、手動で作成するか、Data Pump メタデータのエクスポートとインポートを使用します。詳細については、「[Oracle サポートノート 1454872.1](https://support.oracle.com/knowledge/Oracle%20Cloud/1454872_1.html)」を参照してください。
+ 暗号化された表領域や暗号化された列を使用する表領域はトランスポートできません。
+ Amazon S3 を使用してファイルを転送する場合、サポートされる最大ファイルサイズは 5 TiB です。
+ ソースデータベースが Spatial などの Oracle オプションを使用している場合は、ターゲットデータベースで同じオプションが設定されていない限り、表領域をトランスポートできません。
+ Oracle レプリカ構成の RDS for Oracle DB インスタンスに表領域をトランスポートできません。回避策としては、すべてのレプリカを削除し、表領域をトランスポートしてから、レプリカを再作成できます。

### トランスポータブル表領域の前提条件
<a name="oracle-migrating-tts.requirements"></a>

 開始する前に、以下のタスクを完了します。
+ My Oracle Support の次のドキュメントに記載されているトランスポータブル表領域の要件を確認してください。
  + [クロスプラットフォーム増分バックアップを使用したトランスポータブル表領域のダウンタイムの短縮 (Doc ID 2471245.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1)
  + [トランスポータブル表領域 (TTS) 制限事項 : 詳細、リファレンス、適用バージョン (Doc ID 1454872.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1454872.1)
  + [トランスポータブル表領域（TTS）に関する主な注意事項 -- よくある質問と問題 (Doc ID 1166564.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=1166564.1)
+ エンディアンネス変換の計画 ソースプラットフォーム ID を指定すると、RDS for Oracle はエンディアンネスを自動的に変換します。プラットフォーム ID の確認方法については、「[同一 Data Guard 構成の異機種間プライマリおよびフィジカルスタンバイに関する Data Guard のサポート(Doc ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)」を参照してください。
+ ターゲット DB インスタンスでトランスポータブル表領域機能が有効になっていることを確認してください。この機能は、次のクエリを実行しても `ORA-20304` エラーが表示されない場合にのみ有効になります。

  ```
  SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
  ```

  トランスポータブル表領域機能が有効になっていない場合は、DB インスタンスを再起動します。詳細については、「[ DB インスタンスの再起動](USER_RebootInstance.md)」を参照してください。
+ タイムゾーンファイルがソースとターゲットのデータベース間で同じであることを確認します。
+ ソースとターゲットのデータベースの文字セットが、次のいずれかの要件を満たしていることを確認します。
  + 文字セットは同じです。
  + 文字セットに互換性があります。互換性要件のリストについては、Oracle データベースドキュメントの「[General Limitations on Transporting Data](https://docs.oracle.com/en/database/oracle/oracle-database/19/spmdu/general-limitations-on-transporting-data.html#GUID-28800719-6CB9-4A71-95DD-4B61AA603173)」を参照してください。
+ Amazon S3 を使用してファイルを転送する予定がある場合は、以下を実行してください。
  + Amazon S3 バケットをファイル転送に使用でき、この Amazon S3 バケットが、DB インスタンスと同じ AWS リージョン内にあることを確認します。手順については、*Amazon Simple Storage Service 入門ガイド*の「[バケットの作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)」を参照してください。
  + Amazon RDS 統合用の Amazon S3 バケットは、「[Amazon S3 と RDS for Oracle を統合する IAM アクセス許可の設定](oracle-s3-integration.preparing.md)」の手順に従って準備してください。
+ Amazon EFS を使用してファイルを転送する場合は、[Amazon EFS の統合](oracle-efs-integration.md) の手順に従って EFS を設定したことを確認してください。
+ ターゲット DB インスタンスで自動バックアップを有効にすることを強くお勧めします。[メタデータのインポートステップ](#oracle-migrating-tts.transport.import-dmp)は失敗する可能性があるため、DB インスタンスをインポート前の状態に復元できることが重要です。それによって、表領域を再度バックアップ、転送、インポートする必要がなくなります。

## フェーズ 1: ソースホストをセットアップする
<a name="oracle-migrating-tts.setup-phase"></a>

このステップでは、My Oracle Support から提供されているトランスポート表領域スクリプトをコピーし、必要な構成ファイルを設定します。次のステップでは、*ソースホスト*は、*ターゲットインスタンス*にトランスポートされる表領域を含むデータベースを実行しています。

**ソースホストを設定するには**

1. Oracle ホームのオーナーとしてソースホストにログインします。

1. `ORACLE_HOME` および `ORACLE_SID` 環境変数がソースデータベースを指していることを確認してください。

1. 管理者としてデータベースにログインし、タイムゾーンバージョン、DB 文字セット、および各国語文字セットがターゲットデータベースと同じであることを確認します。

   ```
   SELECT * FROM V$TIMEZONE_FILE;
   SELECT * FROM NLS_DATABASE_PARAMETERS 
     WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
   ```

1. [Oracle Support ノート 2471245.1](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2471245.1) の説明に従って、トランスポータブル表領域ユーティリティを設定します。

   セットアップには、ソースホスト上の `xtt.properties` ファイルの編集が含まれます。次のサンプル `xtt.properties` ファイルは、`/dsk1/backups` ディレクトリ内の 3 つの表領域のバックアップを指定しています。これらは、ターゲット DB インスタンスにトランスポートする予定の表領域です。また、エンディアンネスを自動的に変換するソースプラットフォーム ID も指定します。
**注記**  
有効なプラットフォーム ID については、「[同一 Data Guard 構成の異機種間プライマリおよびフィジカルスタンバイに関する Data Guard のサポート(Doc ID 413484.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=413484.1)」を参照してください。

   ```
   #linux system 
   platformid=13
   #list of tablespaces to transport
   tablespaces=TBS1,TBS2,TBS3
   #location where backup will be generated
   src_scratch_location=/dsk1/backups
   #RMAN command for performing backup
   usermantransport=1
   ```

## フェーズ 2: 表領域のフルバックアップを準備する
<a name="oracle-migrating-tts.initial-br-phase"></a>

このフェーズでは、初めて表領域をバックアップし、そのバックアップをターゲットホストに転送してから、プロシージャ `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` を使用して表領域を復元します。このフェーズが完了すると、最初の表領域バックアップはターゲット DB インスタンスに保存され、増分バックアップで更新できます。

**Topics**
+ [ステップ 1: ソースホストの表領域をバックアップする](#oracle-migrating-tts.backup-full)
+ [ステップ 2: バックアップファイルをターゲット DB インスタンスに転送する](#oracle-migrating-tts.transfer-full)
+ [ステップ 3: ターゲット DB インスタンスに表領域をインポートする](#oracle-migrating-tts.initial-tts-import)

### ステップ 1: ソースホストの表領域をバックアップする
<a name="oracle-migrating-tts.backup-full"></a>

このステップでは、`xttdriver.pl` スクリプトを使用して表領域のフルバックアップを作成します。`xttdriver.pl` の出力は、`TMPDIR` 環境変数に格納されます。

**表領域をバックアップするには**

1. 表領域が読み取り専用モードの場合は、`ALTER TABLESPACE` 権限を持つユーザーとしてソースデータベースにログインし、表領域を読み取り/書き込みモードにします。それ以外の場合は、次のステップに進みます。

   次の例では`tbs1`、`tbs2`、`tbs3` を読み取り/書き込みモードにします。

   ```
   ALTER TABLESPACE tbs1 READ WRITE;
   ALTER TABLESPACE tbs2 READ WRITE;
   ALTER TABLESPACE tbs3 READ WRITE;
   ```

1. `xttdriver.pl` スクリプトを使用して表領域をバックアップします。オプションで、`--debug` を指定してデバッグモードでスクリプトを実行できます。

   ```
   export TMPDIR=location_of_log_files
   cd location_of_xttdriver.pl
   $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup
   ```

### ステップ 2: バックアップファイルをターゲット DB インスタンスに転送する
<a name="oracle-migrating-tts.transfer-full"></a>

このステップでは、バックアップファイルと設定ファイルをスクラッチの場所からターゲット DB インスタンスにコピーします。以下のオプションのいずれかを選択してください。
+ ソースホストとターゲットホストが Amazon EFS ファイルシステムを共有する場合は、`cp` などのオペレーティングシステムユーティリティを使用して、バックアップファイルと `res.txt` ファイルをスクラッチの場所から共有ディレクトリにコピーします。その後、[ステップ 3: ターゲット DB インスタンスに表領域をインポートする](#oracle-migrating-tts.initial-tts-import)に進みます。 
+ バックアップを Amazon S3 バケットにステージングする必要がある場合は、以下の手順を実行してください。

![\[Amazon S3 または Amazon EFS を使用してファイルを転送します。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/oracle-tts.png)


#### ステップ 2.2: Amazon S3 バケットにダンプファイルをアップロードする
<a name="oracle-migrating-tts.upload-full"></a>

バックアップと `res.txt` ファイルをスクラッチディレクトリから Amazon S3 バケットにアップロードします。詳細については、*Amazon Simple Storage Service 開発者ガイド*の「[オブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)」を参照してください。

#### ステップ 2.3: バックアップを Amazon S3 バケットからターゲット DB インスタンスにダウンロードする
<a name="oracle-migrating-tts.download-full"></a>

このステップでは、プロシージャ `rdsadmin.rdsadmin_s3_tasks.download_from_s3` を使用して RDS for Oracle DB インスタンスにバックアップをダウンロードします。

**Amazon S3 バケットからバックアップをダウンロードするには**

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

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

   ```
   EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'res.txt');
   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)」を参照してください。

### ステップ 3: ターゲット DB インスタンスに表領域をインポートする
<a name="oracle-migrating-tts.initial-tts-import"></a>

プロシージャ `rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` を使用して、表領域をターゲット DB インスタンスに復元します。このプロシージャは、データファイルを正しいエンディアン形式に自動的に変換します。

Linux 以外のプラットフォームからインポートする場合は、`import_xtts_tablespaces` を呼び出すときに `p_platform_id` パラメータを使用してソースプラットフォームを指定します。指定するプラットフォーム ID が、[ステップ 2: ソースホストに表領域メタデータをエクスポートする](#oracle-migrating-tts.transport.export) の `xtt.properties` ファイルで指定されたものと一致していることを確認してください。

**ターゲット DB インスタンスに表領域をインポートする**

1. Oracle SQL クライアントを起動し、ターゲット RDS for Oracle DB インスタンスにマスターユーザーとしてログインします。

1. インポートする表領域とバックアップを含むディレクトリを指定して、`rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` プロシージャを実行します。

   以下の例では、表領域*TBS1*、*TBS2*、および *TBS3* をディレクトリ *DATA\$1PUMP\$1DIR* からインポートします。ソースプラットフォームは AIX ベースのシステム (64 ビット) で、プラットフォーム ID は `6` です。プラットフォーム ID は、`V$TRANSPORTABLE_PLATFORM` をクエリすることで確認できます。

   ```
   VAR task_id CLOB
   
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces(
           'TBS1,TBS2,TBS3',
           'DATA_PUMP_DIR',
           p_platform_id => 6);
   END;
   /
   
   PRINT task_id
   ```

1. (オプション) テーブル `rdsadmin.rds_xtts_operation_info` にクエリを実行して進行状況を監視します。`xtts_operation_state` 列には、`EXECUTING`、`COMPLETED`、または `FAILED` という値が表示されます。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注記**  
実行時間が長い操作の場合は、`V$SESSION_LONGOPS`、`V$RMAN_STATUS`、`V$RMAN_OUTPUT` にクエリを実行することもできます。

1. 前のステップのタスク ID を使用して、完了したインポートのログを表示します。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   インポートが正常に完了したことを確認してから、次の手順に進みます。

## フェーズ 3: 増分バックアップを作成および転送する
<a name="oracle-migrating-tts.roll-forward-phase"></a>

このフェーズでは、ソースデータベースがアクティブな間、定期的に増分バックアップを作成して転送します。この手法を実行することで、最終的な表領域バックアップのサイズが小さくなります。複数の増分バックアップを行う場合、最後の増分バックアップの後に `res.txt` ファイルをコピーしてから、ターゲットインスタンスに適用する必要があります。

手順は [フェーズ 2: 表領域のフルバックアップを準備する](#oracle-migrating-tts.initial-br-phase) と同じですが、インポートの手順が任意である点が異なります。

## フェーズ 4: 表領域をトランスポートする
<a name="oracle-migrating-tts.final-br-phase"></a>

このフェーズでは、読み取り専用の表領域をバックアップし、Data Pump メタデータをエクスポートし、これらのファイルをターゲットホストに転送して、表領域とメタデータの両方をインポートします。

**Topics**
+ [ステップ 1: 読み取り専用の表領域をバックアップする](#oracle-migrating-tts.final-backup)
+ [ステップ 2: ソースホストに表領域メタデータをエクスポートする](#oracle-migrating-tts.transport.export)
+ [ステップ 3: (Amazon S3 のみ) バックアップファイルとエクスポートファイルをターゲット DB インスタンスに転送する](#oracle-migrating-tts.transport)
+ [ステップ 4: ターゲット DB インスタンスに表領域をインポートする](#oracle-migrating-tts.restore-full)
+ [ステップ 5: ターゲット DB インスタンスに表領域メタデータをインポートする](#oracle-migrating-tts.transport.import-dmp)

### ステップ 1: 読み取り専用の表領域をバックアップする
<a name="oracle-migrating-tts.final-backup"></a>

このステップは [ステップ 1: ソースホストの表領域をバックアップする](#oracle-migrating-tts.backup-full) と同じですが、重要な違いが 1 つあります。最後に表領域をバックアップする前に、表領域を読み取り専用モードにします。

次の例では、`tbs1`、`tbs2`、`tbs3` を読み取り専用モードにします。

```
ALTER TABLESPACE tbs1 READ ONLY;
ALTER TABLESPACE tbs2 READ ONLY;
ALTER TABLESPACE tbs3 READ ONLY;
```

### ステップ 2: ソースホストに表領域メタデータをエクスポートする
<a name="oracle-migrating-tts.transport.export"></a>

ソースホストで `expdb` ユーティリティを実行して、表領域メタデータをエクスポートします。次の例では、表領域 *TBS1*、*TBS2*、および *TBS3* を *DATA\$1PUMP\$1DIR* ディレクトリのダンプファイル *xttdump.dmp* にエクスポートします。

```
expdp username/pwd \
dumpfile=xttdump.dmp \
directory=DATA_PUMP_DIR \
statistics=NONE \
transport_tablespaces=TBS1,TBS2,TBS3 \
transport_full_check=y \
logfile=tts_export.log
```

*DATA\$1PUMP\$1DIR* が Amazon EFS の共有ディレクトリである場合は、スキップして [ステップ 4: ターゲット DB インスタンスに表領域をインポートする](#oracle-migrating-tts.restore-full) に進んでください。

### ステップ 3: (Amazon S3 のみ) バックアップファイルとエクスポートファイルをターゲット DB インスタンスに転送する
<a name="oracle-migrating-tts.transport"></a>

Amazon S3 を使用して表領域バックアップと Data Pump エクスポートファイルをステージングする場合は、次の手順を実行してください。

#### ステップ 3.1: バックアップとダンプファイルをソースホストから Amazon S3 バケットにアップロードする
<a name="oracle-migrating-tts.transport.upload-dmp"></a>

バックアップとダンプファイルをソースホストから Amazon S3 バケットにアップロードします。詳細については、*Amazon Simple Storage Service 開発者ガイド*の「[オブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)」を参照してください。

#### ステップ 3.2: バックアップとダンプファイルを Amazon S3 バケットからターゲット DB インスタンスにダウンロードする
<a name="oracle-migrating-tts.transport.download-dmp"></a>

このステップでは、プロシージャ `rdsadmin.rdsadmin_s3_tasks.download_from_s3` を使用して RDS for Oracle DB インスタンスにバックアップとダンプファイルをダウンロードします。「[ステップ 2.3: バックアップを Amazon S3 バケットからターゲット DB インスタンスにダウンロードする](#oracle-migrating-tts.download-full)」のステップを実行してください。

### ステップ 4: ターゲット DB インスタンスに表領域をインポートする
<a name="oracle-migrating-tts.restore-full"></a>

`rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` プロシージャを使用して表領域を復元します。このプロシージャの構文とセマンティクスについては、「[転送されたテーブルスペースを DB インスタンスにインポートする](rdsadmin_transport_util_import_xtts_tablespaces.md)」を参照してください。

**重要**  
最後の表領域のインポートが完了したら、次のステップは [Oracle Data Pump メタデータのインポート](#oracle-migrating-tts.transport.export)です。インポートが失敗した場合、DB インスタンスを失敗前の状態に戻すことが重要です。そのため、[Amazon RDS のシングル AZ DB インスタンスの DB スナップショットの作成](USER_CreateSnapshot.md) の手順に従って DB インスタンスの DB スナップショットを作成することをお勧めします。スナップショットにはインポートされたすべての表領域が含まれるため、インポートが失敗した場合でも、バックアップとインポートのプロセスを繰り返す必要はありません。  
ターゲット DB インスタンスで自動バックアップがオンになっていて、メタデータをインポートする前に有効なスナップショットが開始されたことを Amazon RDS が検出しない場合、RDS はスナップショットの作成を試みます。インスタンスのアクティビティに応じて、このスナップショットは成功する場合と成功しない場合があります。有効なスナップショットが検出されないか、スナップショットを開始できない場合、メタデータのインポートはエラーを出して終了します。

**ターゲット DB インスタンスに表領域をインポートする**

1. Oracle SQL クライアントを起動し、ターゲット RDS for Oracle DB インスタンスにマスターユーザーとしてログインします。

1. インポートする表領域とバックアップを含むディレクトリを指定して、`rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces` プロシージャを実行します。

   以下の例では、表領域*TBS1*、*TBS2*、および *TBS3* をディレクトリ *DATA\$1PUMP\$1DIR* からインポートします。

   ```
   BEGIN
     :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR');
   END;
   /
   PRINT task_id
   ```

1. (オプション) テーブル `rdsadmin.rds_xtts_operation_info` にクエリを実行して進行状況を監視します。`xtts_operation_state` 列には、`EXECUTING`、`COMPLETED`、または `FAILED` という値が表示されます。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```
**注記**  
実行時間が長い操作の場合は、`V$SESSION_LONGOPS`、`V$RMAN_STATUS`、`V$RMAN_OUTPUT` にクエリを実行することもできます。

1. 前のステップのタスク ID を使用して、完了したインポートのログを表示します。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));
   ```

   インポートが正常に完了したことを確認してから、次の手順に進みます。

1. [Amazon RDS のシングル AZ DB インスタンスの DB スナップショットの作成](USER_CreateSnapshot.md) の指示に従って DB スナップショットを手動で作成します。

### ステップ 5: ターゲット DB インスタンスに表領域メタデータをインポートする
<a name="oracle-migrating-tts.transport.import-dmp"></a>

このステップでは、`rdsadmin.rdsadmin_transport_util.import_xtts_metadata` プロシージャを使用して RDS for Oracle DB インスタンスにトランスポータブル表領域メタデータをインポートします。このプロシージャの構文とセマンティクスについては、「[転送可能テーブルスペースメタデータを DB インスタンスにインポートする](rdsadmin_transport_util_import_xtts_metadata.md)」を参照してください。操作中、インポートのステータスがテーブル `rdsadmin.rds_xtts_operation_info` に表示されます。

**重要**  
メタデータをインポートする前に、表領域をインポートした後に DB スナップショットが正常に作成されたことを確認することを強くお勧めします。インポートステップが失敗した場合は、DB インスタンスを復元し、インポートエラーに対処してから、インポートを再試行してください。

**データポンプメタデータを RDS for Oracle DB インスタンスにインポートします**

1. Oracle SQL クライアントを起動し、ターゲット DB インスタンスにマスターユーザーとしてログインします。

1. トランスポートされた表領域にスキーマを所有するユーザーがまだ存在しない場合は、それらのユーザーを作成します。

   ```
   CREATE USER tbs_owner IDENTIFIED BY password;
   ```

1. ダンプファイルの名前とディレクトリの場所を指定して、メタデータをインポートします。

   ```
   BEGIN
     rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR');
   END;
   /
   ```

1. (オプション) トランスポータブル表領域の履歴テーブルにクエリを実行して、メタデータインポートのステータスを確認します。

   ```
   SELECT * FROM rdsadmin.rds_xtts_operation_info;
   ```

   このオペレーションが完了すると、表領域は読み取り専用モードになります。

1. (オプション) ログファイルを表示します。

   次の例では、BDUMP ディレクトリの内容を一覧表示し、インポートログをクエリします。

   ```
   SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP'));
   
   SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file(
     p_directory => 'BDUMP',
     p_filename => 'rds-xtts-import_xtts_metadata-2023-05-22.01-52-35.560858000.log'));
   ```

## フェーズ 5: 転送された表領域を検証する
<a name="oracle-migrating-tts.validate"></a>

このオプションのステップでは、`rdsadmin.rdsadmin_rman_util.validate_tablespace` プロシージャを使用してトランスポートされた表領域を検証し、表領域を読み取り/書き込みモードにします。

**転送されたデータを検証するには**

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

1. `rdsadmin.rdsadmin_rman_util.validate_tablespace` プロシージャを使用して表領域を検証します。

   ```
   SET SERVEROUTPUT ON
   BEGIN
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS1',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS2',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
       rdsadmin.rdsadmin_rman_util.validate_tablespace(
           p_tablespace_name     => 'TBS3',
           p_validation_type     => 'PHYSICAL+LOGICAL',
           p_rman_to_dbms_output => TRUE);
   END;
   /
   ```

1. 表領域を読み取り/書き込みモードにします。

   ```
   ALTER TABLESPACE TBS1 READ WRITE;
   ALTER TABLESPACE TBS2 READ WRITE;
   ALTER TABLESPACE TBS3 READ WRITE;
   ```

## フェーズ 6: 残ったファイルをクリーンアップする
<a name="oracle-migrating-tts.cleanup"></a>

このオプションのステップでは、不要なファイルをすべて削除します。`rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` プロシージャを使用して、テーブルスペースのインポート後に孤立したデータファイルを一覧表示して、`rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` プロシージャを使用して削除します。これらのプロシージャの構文とセマンティクスについては、「[テーブルスペースのインポート後の孤立ファイルを一覧表示する](rdsadmin_transport_util_list_xtts_orphan_files.md)」および「[テーブルスペースのインポート後に孤立したデータファイルを削除する](rdsadmin_transport_util_cleanup_incomplete_xtts_import.md)」を参照してください。

**残ったファイルをクリーンアップするには**

1. 次のように *DATA\$1PUMP\$1DIR* の古いバックアップを削除します。

   1. `rdsadmin.rdsadmin_file_util.listdir` を実行してバックアップファイルを一覧表示します。

      ```
      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
      ```

   1. `UTL_FILE.FREMOVE` を呼び出して、バックアップを 1 つずつ削除します。

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

1. 表領域をインポートしたが、これらの表領域のメタデータをインポートしなかった場合は、孤立したデータファイルを次のように削除できます。

   1. 削除する必要のある孤立したデータファイルを一覧表示します。次の例では、`rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files` プロシージャを呼び出します。

      ```
      SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files);
      
      FILENAME       FILESIZE
      -------------- ---------
      datafile_7.dbf 104865792
      datafile_8.dbf 104865792
      ```

   1. `rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import` プロシージャを実行して、孤立したファイルを削除します。

      ```
      BEGIN
        rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import('DATA_PUMP_DIR');
      END;
      /
      ```

      クリーンアップ操作により、`BDUMP` ディレクトリに名前形式 `rds-xtts-delete_xtts_orphaned_files-YYYY-MM-DD.HH24-MI-SS.FF.log` を使用するログファイルが生成されます。

   1. 前のステップで生成されたログファイルを読み込みます。次の例ではログ `rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log` を読み取ります。

      ```
      SELECT * 
      FROM TABLE(rdsadmin.rds_file_util.read_text_file(
             p_directory => 'BDUMP',
             p_filename  => 'rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log'));
      
      TEXT
      --------------------------------------------------------------------------------
      orphan transported datafile datafile_7.dbf deleted.
      orphan transported datafile datafile_8.dbf deleted.
      ```

1. 表領域をインポートし、これらの表領域のメタデータをインポートしたものの、互換性エラーやその他の Oracle Data Pump の問題が発生した場合は、次のように部分的にトランスポートされたデータファイルをクリーンアップします。

   1. `DBA_TABLESPACES` クエリを実行して、部分的にトランスポートされたデータファイルを含む表領域を一覧表示します。

      ```
      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES';
      
      TABLESPACE_NAME
      --------------------------------------------------------------------------------
      TBS_3
      ```

   1. 表領域と部分的にトランスポートされたデータファイルを削除します。

      ```
      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;
      ```

# 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'); 
```

# Oracle エクスポート/インポートを使用したインポート
<a name="Oracle.Procedural.Importing.ExportImport"></a>

次のような場合、Oracle エクスポート/インポートユーティリティを使用して移行することも検討できます。
+ データサイズが小さい。
+ 2 進浮動小数点数や倍精度浮動小数点数などのデータ型を必要としない。

インポートプロセスにより、必要なスキーマオブジェクトが作成されます。したがって、オブジェクトを事前に作成するためのスクリプトを実行する必要はありません。

Oracle エクスポートユーティリティとインポートユーティリティをインストールする最も簡単な方法は、Oracle Instant Client をインストールすることです。ソフトウェアをダウンロードするには、[https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html) にアクセスしてください。ドキュメントについては、*Oracle Database Utilities* マニュアルの「[Instant Client for SQL\$1Loader、エクスポート、およびインポート](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)」を参照してください。

**テーブルをエクスポートしてからインポートするには**

1. `exp` コマンドを使用して、移行元のデータベースからテーブルをエクスポートします。

   次のコマンドは、`tab1`、`tab2`、`tab3` という名前のテーブルをエクスポートします。ダンプファイルは `exp_file.dmp` です。

   ```
   exp cust_dba@ORCL FILE=exp_file.dmp TABLES=(tab1,tab2,tab3) LOG=exp_file.log
   ```

   エクスポートでは、指定されたテーブルのスキーマとデータを含むバイナリダンプファイルが作成されます。

1. `imp` コマンドを使用して、このスキーマとデータを移行先のデータベースにインポートします。

   次のコマンドは、ダンプファイル `exp_file.dmp` からテーブル `tab1`、`tab2`、および `tab3` をインポートします。

   ```
   imp cust_dba@targetdb FROMUSER=cust_schema TOUSER=cust_schema \  
   TABLES=(tab1,tab2,tab3) FILE=exp_file.dmp LOG=imp_file.log
   ```

ユーザーのニーズに合うと考えられるエクスポートまたはインポートの使用方法は、他にもあります。詳細については、Oracle Database のドキュメントを参照してください。

# Oracle SQL\$1Loader を使用したインポート
<a name="Oracle.Procedural.Importing.SQLLoader"></a>

含まれるオブジェクトの数が制限されている大規模なデータベースには、Oracle SQL\$1Loader が適しているかもしれません。移行元のデータベースからのエクスポートと移行先のデータベースへの読み込みのプロセスは、スキーマに固有のものであるため、次の例では、サンプルのスキーマオブジェクトを作成し、移行元からエクスポートして、移行先のデータベースにデータを読み込みます。

Oracle SQL\$1Loader をインストールする最も簡単な方法は、Oracle Instant Client をインストールすることです。ソフトウェアをダウンロードするには、[https://www.oracle.com/database/technologies/instant-client.html](https://www.oracle.com/database/technologies/instant-client.html) にアクセスしてください。ドキュメントについては、*Oracle Database Utilities* マニュアルの「[Instant Client for SQL\$1Loader、エクスポート、およびインポート](https://docs.oracle.com/en/database/oracle/oracle-database/21/sutil/instant-client-sql-loader-export-import.html#GUID-FF1B6F75-09F5-4911-9317-9776FAD15965)」を参照してください。

**Oracle SQL\$1Loader を使用してデータをインポートするには**

1. 次の SQL ステートメントを使用して、サンプルの移行元テーブルを作成します。

   ```
   CREATE TABLE customer_0 TABLESPACE users 
      AS (SELECT ROWNUM id, o.* 
          FROM   ALL_OBJECTS o, ALL_OBJECTS x 
          WHERE  ROWNUM <= 1000000);
   ```

1. 移行先の RDS for Oracle DB インスタンスで、データを読み込むための移行先テーブルを作成します。`WHERE 1=2` 句を使用すると、`ALL_OBJECTS` の構造体がコピーされますが、どの行もコピーされません。

   ```
   CREATE TABLE customer_1 TABLESPACE users 
     AS (SELECT 0 AS ID, OWNER, OBJECT_NAME, CREATED
         FROM   ALL_OBJECTS
         WHERE  1=2);
   ```

1. 移行元のデータベースからテキストファイルにデータをエクスポートします。以下の例では SQL\$1Plus を使用しています。移行するデータについて、データベース内のすべてのオブジェクトをエクスポートするためのスクリプトの生成が必要になる場合があります。

   ```
   ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'
   
   SET LINESIZE 800 HEADING OFF FEEDBACK OFF ARRAY 5000 PAGESIZE 0
   SPOOL customer_0.out 
   SET MARKUP HTML PREFORMAT ON
   SET COLSEP ','
   
   SELECT id, owner, object_name, created 
   FROM   customer_0; 
   
   SPOOL OFF
   ```

1. データの詳細について記述した制御ファイルを作成します。このステップを実行するためのスクリプトを記述する必要がある場合があります。

   ```
   cat << EOF > sqlldr_1.ctl 
   load data
   infile customer_0.out
   into table customer_1
   APPEND
   fields terminated by "," optionally enclosed by '"'
   (
     id           POSITION(01:10)    INTEGER EXTERNAL,
     owner        POSITION(12:41)    CHAR,
     object_name  POSITION(43:72)    CHAR,
     created      POSITION(74:92)    date "YYYY/MM/DD HH24:MI:SS"
   )
   ```

   必要に応じて、ステージング領域 (Amazon EC2 インスタンスなど) に上のコードで生成したファイルをコピーします。

1. 移行先のデータベース用の適切なユーザー名とパスワードで SQL\$1Loader を使用して、データをインポートします。

   ```
   sqlldr cust_dba@targetdb CONTROL=sqlldr_1.ctl BINDSIZE=10485760 READSIZE=10485760 ROWS=1000 
   ```

# Oracle マテリアライズドビューを使用した移行
<a name="Oracle.Procedural.Importing.Materialized"></a>

大規模なデータセットを効率的に移行するために、Oracle マテリアライズドビューのレプリケーションを使用することができます。レプリケーションを使用すると、移行先テーブルと移行元テーブルとの同期を継続的に維持できます。このため、必要に応じて、後から Amazon RDS に切り替えることができます。

マテリアライズドビューを使用して移行する前に、以下の前提条件を満たしていることを確認してください。
+ 移行先のデータベースから移行元のデータベースへのアクセスを設定します。次の例では、移行元データベースでアクセスルールが有効になっており、移行先の RDS for Oracle データベースが SQL\$1Net を経由して移行元にアクセスすることが許可されています。
+ RDS for Oracle DB インスタンスから移行元のデータベースへのデータベースリンクを作成します。

**マテリアライズドビューを使用してデータを移行するには**

1. 同じパスワードで認証できるユーザーアカウントを、移行元と移行先の RDS for Oracle インスタンスの両方に作成します。次の例では、`dblink_user` という名前のユーザーを作成します。

   ```
   CREATE USER dblink_user IDENTIFIED BY my-password
     DEFAULT TABLESPACE users
     TEMPORARY TABLESPACE temp;
      
   GRANT CREATE SESSION TO dblink_user;
   
   GRANT SELECT ANY TABLE TO dblink_user;
   
   GRANT SELECT ANY DICTIONARY TO dblink_user;
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. 新しく作成したユーザーを使用して、移行先の RDS for Oracle インスタンスから移行元のインスタンスへのデータベースリンクを作成します。

   ```
   CREATE DATABASE LINK remote_site
     CONNECT TO dblink_user IDENTIFIED BY my-password
     USING '(description=(address=(protocol=tcp) (host=my-host) 
       (port=my-listener-port)) (connect_data=(sid=my-source-db-sid)))';
   ```
**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

1. リンクをテストします。

   ```
   SELECT * FROM V$INSTANCE@remote_site;
   ```

1. 移行元のインスタンスで、プライマリキーを持つサンプルテーブルとマテリアライズドビューのログを作成します。

   ```
   CREATE TABLE customer_0 TABLESPACE users 
     AS (SELECT ROWNUM id, o.* 
         FROM   ALL_OBJECTS o, ALL_OBJECTS x
         WHERE  ROWNUM <= 1000000);
   
   ALTER TABLE customer_0 ADD CONSTRAINT pk_customer_0 PRIMARY KEY (id) USING INDEX;
   
   CREATE MATERIALIZED VIEW LOG ON customer_0;
   ```

1. 移行先の RDS for Oracle DB インスタンスで、マテリアライズドビューを作成します。

   ```
   CREATE MATERIALIZED VIEW customer_0 
     BUILD IMMEDIATE REFRESH FAST 
     AS (SELECT * 
         FROM   cust_dba.customer_0@remote_site);
   ```

1. 移行先の RDS for Oracle DB インスタンスで、マテリアライズドビューを更新します。

   ```
   EXEC DBMS_MVIEW.REFRESH('CUSTOMER_0', 'f');
   ```

1. マテリアライズドビューを削除し、`PRESERVE TABLE` 句を含めて、マテリアライズドビューコンテナテーブルとその内容を保持します。

   ```
   DROP MATERIALIZED VIEW customer_0 PRESERVE TABLE;
   ```

   保持したテーブル名は、削除したマテリアライズドビューと同じです。