Oracle Data Pumpによるエクスポートとインポートの基礎

## はじめに
Oracle Data Pumpは、Oracle Databaseのオンプレミスからクラウドへの移行やバージョンアップの際によく使用される手法の１つです。
今回はOracle Databaseを運用していく上で、重要な役割を果たすOracle Data Pumpについてご紹介していきます。

また、本記事の内容は、

**第8回 Oracle DBaseCamp**
**【Oracle Data Pumpによるエクスポートとインポート】**

に登壇した際の内容になります。

詳細についてご覧になりたい方は、以下の録画や資料を参考にしてみてください。
* 録画

https://youtu.be/ysJdrpuwkNY

*資料

https://speakerdeck.com/oracle4engineer/oracle-dbasecamp-8

## エクスポートとインポートの概要
### ■ エクスポートおよびインポートとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/9b6744d8-350f-aec4-6236-2735c3e6b291.png)
まず、エクスポートとインポートというのは、データベース間のデータの移動を行うことができる機能です。

:::note info
* **エクスポート**
ソース・データベースから移動させたいスキーマや表といったオブジェクトをOSファイルとして抽出すること
* **ダンプファイル**
抽出したOSファイルのこと
* **インポート**
ダンプ・ファイルを元に、ターゲットデータベースにデータを書き込むこと
:::

エクスポート、インポートの種類としては、主に2種類あり、Oracle Database 10gより前から提供されていた「**オリジナルのエクスポート、オリジナルのインポート**」と10g以降に提供されている「**Oracle Data Pump**」があります。
どちらもエクスポートの際にダンプファイルを作成しますが、それぞれに互換性はありませんので、注意が必要です。

### ■ エクスポートとインポートの種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/9f476ce8-66c4-c68e-fa70-ca47de9973cb.png)
「Oracle Data Pump」では、データベースサーバー側で作業が実行されるため、クライアント側で作業が実行される「オリジナルのエクスポートおよびインポート」と比較して処理が高速になっています。
また、Oracle Data Pumpでは、APIによる呼び出しやジョブ管理が可能など、機能的に優れている部分が多いです。
しかし、Oracle Data Pumpでサポートされていない、古いOracle Databaseの移行の際は、オリジナルのエクスポートおよびインポートを利用する必要があります。

### ■ Oracle Data Pumpの利用用途

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/a383bcd3-e2b1-745b-fb62-fd883af96b7a.png)
Oracle Data Pumpの利用用途として、「**論理バックアップ**」、「**データベースのバージョンアップ**」、「**クラウドリフト**」が挙げられます。

:::note info
* **論理バックアップ**
特定のデータだけをバックアップ可能で、復元したいデータを選択して復元することが可能になっています。また、物理バックアップの補助手段としても有効です。

* **データベースのバージョンアップ**
Oracle Data Pumpは異なるバージョン間でのオブジェクトの移動が可能なので、10g以降であれば古いバージョン間でも利用可能になっています。Enterprise Editionだけでなく、Standard Edition 2でも使用できるので、非常に使い勝手が良いと言えます。

* **クラウドリフト**
オンプレミスからクラウドのPaaSとOracle DatabaseをインストールしたIaaSへの移行の際も使用することができます。
:::

## Oracle Data Pumpの概要
### ■ Oracle Data Pumpとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/e90d4e2e-6c5d-f6ea-c668-5635141feed4.png)
クライアントから**expdp**および**impdp**というこれらのコマンドを受け、エクスポートでダンプファイルを書き出す、インポートでダンプファイルを読み込むといった操作が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/caddfa2a-2464-be57-b8a0-8eb28cd55314.png)
Oracle Databaseのデータベース・リンクの機能を利用して、Oracle Data Pumpの**ネットワーク・リンク**というソース・データベースからターゲットデータベースへデータを移動させる機能を利用することができます。
ネットワークリンクを利用すれば、直接ソースデータベースからターゲットデータベースのストレージにダンプファイルをエクスポートできるようになります。また、ダンプファイルなどを生成せずとも直接ターゲットデータベースへデータをインポートすることも可能になります。

### ■ Oracle Data Pumpの特徴

Oracle Data Pumpの特徴としては、以下のような柔軟なデータの移動が可能なことが挙げられます。

:::note info
* **異なるバージョン**のOracle Database間におけるデータ移動
* **異なるプラットフォーム間**におけるデータ移動
* **対象範囲を選択**したデータ移動
　・モード: データベース全体、表領域、スキーマ、表
　・オブジェクト単位: EXCLUDE、INCLUDE、QUERY、CONTENT
* データベース構造の変更を伴う移行において利用可能
　・非CDB構成からPDB構成
　・暗号化、圧縮、キャラクタ・セット、表領域・スキーマの再マッピング
:::

対象範囲を選択したデータ移動において、エクスポート・インポート時にモードを選択することができ、そのモードの種類を表にまとめています。
|モード|機能説明|パラメータ|
|:---|:---|:--|
|全体|データベース全体のエクスポート|FULL=[YES｜NO]|
|スキーマ|指定したスキーマ全体のエクスポート|SCHEMAS=schema_name [, ...]|
|表|指定した表全体のエクスポート|TABLES=[schema_name.]table_name[:partition_name] [, ...]|
|表領域|指定した表領域全体のエクスポート|TABLESPACES=tablespace_name [, ...]|

また、オブジェクト単位で対象範囲を選択することができるので、データのフィルタ処理のようにエクスポート・インポートする対象を制限することが可能です。
|パラメータ|説明|
|:---|:---|
|EXCLUDE|操作対象から除外するオブジェクトを指定可能|
|INCLUDE|操作対象に含めるオブジェクトを指定可能|
|QUERY|SELECT文などを使用し、条件を絞り込むことで、指定した表のデータでフィルタリング可能|
|CONTENT|メタデータのみ、データのみ、またはその両方のパターンでエクスポート、インポート可能|

## おわりに
今回は、Oracle Data Pumpの概要について解説しました。

Oracle Data Pumpについて、更に詳しく知りたい方は以下の記事もご参考にしてみてください。

:::note info
* [Oracel Data Pumpのアーキテクチャから理解する「PARALLELパラメータとワーカー・プロセスの関係」](https://qiita.com/yunagash/items/d9654d74257b19145619)
* [Oracle Data Pumpの機能紹介 ～Enterprise Editionおよびオプションで利用できる機能～](https://qiita.com/yunagash/items/57cb29729bfdad52da2d)
* [Oracle Data Pumpのベスト・プラクティスと代表的なパラメータ](https://qiita.com/yunagash/items/aa41b3a2d916761807dc)
* [Oracle Data Pumpによる移行方法（クラウドリフト時の移行ケースと注意点）](https://qiita.com/yunagash/items/f2c037b1062753821c89)
* [Oracle Data Pumpのエクスポート時のジョブの中断、再開、強制終了の方法](https://qiita.com/yunagash/items/e06eb0fd4b1824bd09e0)
:::