Oracle Data Pumpのベスト・プラクティスと代表的なパラメータ

## はじめに
Oracle Data Pumpを使用して、オンプレミスからオンプレミス / Oracle CloudにOracle Databaseを移行する際に推奨されるベスト・プラクティスについて紹介します。
ベスト・プラクティスを紹介するに当たり、Oracleの公式ドキュメントである[Oracle Data Pumpのベスト・プラクティス](https://www.oracle.com/jp/a/ocom/docs/oracle-data-pump-best-practices-ja.pdf)の内容を参考にしております。

また、本記事の内容は、

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

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

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

https://youtu.be/ysJdrpuwkNY

*資料

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

## Oracle Data Pumpのベスト・プラクティス
ベスト・プラクティスについて項目ごとにまとめました。
(<font color="Red">赤字</font>はOracle Data Pumpのパラメータ指定に関わるもの)

:::note info
**【事前設定】**
* SYS as SYSDBAを使用してエクスポートを起動しない
* リソース使用率を適切に設定する (STREAM_POOL_SIZE初期化パラメータ)

**【パラメータ】**
* パラメータ・ファイルを使用する
* Oracle Data Pump<font color="Red">エクスポートの一貫性</font>を確保する
* エクスポートおよびインポート中に<font color="Red">診断パラメータ</font>を含める
* データベース互換性を設定する (ターゲット・データベースのバージョンが下位の場合)

**【抽出対象】**
* エクスポートとインポートから<font color="Red">統計情報を除外</font>する

**【性能】**
* <font color="Red">並列処理</font>と現在の統計情報を使用してパフォーマンスを向上する
* 異なるOSおよびストレージ上のサーバーにネットワーク・リンクを使用する
* スペース使用とパフォーマンスのために<font color="Red">エクスポートで圧縮</font>を使用する

**【その他】**
* <font color="Red">SecureFiles LOBを使用</font>する
* Data Pumpジョブ実行前のデータベース・チェック
* Oracle Cloudデータベース向けのその他のプラクティス
:::

ドキュメントの中から、よく使うポイントをいくつかピックアップし、Oracle Data Pumpのパラメータ指定に関わるものについて詳しく解説していきます。


## ベスト・プラクティスに記載のあるパラメータ
### エクスポートの一貫性

Oracle Data Pumpでの移行において、すべてのオブジェクトのデータ抽出処理において指定した時刻の状態のデータを移行したいといった場合に利用できます。

:::note info
指定したSCNもしくは時刻における一貫性を維持したデータのエクスポ ートをおこなう
* **FLASHBACK_SCN**
* **FLASHBACK_TIME**
:::

注意点としては、

:::note warn
* 指定する時刻やSCNのUNDOデータが残っている必要がある
* UNDO表領域の容量や**UNDO_RETENTION**の設定値を考慮する必要がある
⇒UNDO_RETENTION ： UNDO保存の下限値(秒)を指定可能
:::

### エクスポート/インポートの診断
実行に問題が発生した際は、ログ情報を確認して原因を追及すると思いますが、そのログに記載される情報はなるべく多い方が原因究明を迅速に進めることができます。

:::note info
ログファイルにタイムスタンプや経過時間などの、診断情報が常に含まれるように指定できます。
* **LOGTIME**：メッセージにタイムスタンプを付与
* **METRICS**：オブジェクトの数やジョブに関する経過時間の情報を付与
:::
パフォーマンス問題を診断する場合であったり、同じような操作の時間を見積もる場合にも役立ちます。

### エクスポート時の圧縮
COMPRESSIONパラメーターにより、移行データを圧縮することで、エクスポートの処理速度を上げることができます。

:::note info
ファイルを圧縮することでダンプ・ファイルのサイズとネットワーク・モードのインポートでのデータ・ストリーム・サイズを削減できます。
* **COMPRESSION**
* **COMPRESSION_ALGORITHM**
:::
COMPRESSION_ALGORITHMに関しては、以下の表からOptionを選択して、圧縮率と速度の適度な組み合わせを選ぶことができます。
|オプション|定義|
|:---|:---|
|BASIC|圧縮率と速度の適度な組合せが実現し、使用されるアルゴリズムはOracle Data Pumpの以前のバージョンと同じです。|
|LOW|Exportのスループットへの影響が最小です。このオプションは、CPUリソースが制限要因となる環境に適しています。|
|MEDIUM|ほとんどの環境に適しています。このオプションはBASICオプションと同様、圧縮率と処理速度を加味したよい組合せですが、BASICとは異なるアルゴリズムが使用されています。<font color="Red">推奨</font>|
|HIGH|ネットワーク速度が限定要因となっている、速度が遅いネットワークでダンプ・ファイルがコピーされる状況に最適です。|

注意点としては、

:::note warn
使用には別途Enterprise Editionに含まれている**Advanced Compression Option**が必要になります。
:::

### 並列処理
並列処理によって、より高速にエクスポートとインポートの処理を行うことができるようになります。

:::note info
* **PARALLEL**：
複数のダンプファイルに対して、同時にデータの書き込みを行えるようになるため、エクスポートとインポートの処理速度が向上
* **DMPFILE**：
%U、％Lなどのワイルドカードを指定することで、複数のダンプ・ファイルに同時に書き込むことが可能になる
* **FILESIZE**：
1つのダンプ・ファイルの最大サイズを指定できるようになるので、作成されるダンプ・ファイル数とそれぞれのサイズを調整することが可能になる
:::

PARALLELパラメータとDMPFILEパラメータについての詳しい解説は、[Oracel Data Pumpのアーキテクチャから理解する「PARALLELパラメータとワーカー・プロセスの関係」](https://qiita.com/yunagash/items/d9654d74257b19145619)をご参照ください。


### 統計情報の除外
オプティマイザ統計情報を除外することで、エクスポートとインポートのパフォーマンスを向上させることが可能です。

:::note info
EXCLUDEパラメータを使用することでエクスポートの際に対象の情報を除外することができます。
* **EXCLUDE = STATISTICS**
:::

:::note warn
統計情報を除外した場合は、インポート後にターゲット・データベースで統計情報を収集することになります。
:::

### インポート時のSecureFiles LOBへの変換
LOBファイルが含まれている場合は、**TRANSFORMパラメータ**を使用して、**SecureFiles LOB**に変換することを推奨しています。
**SecureFiles**は、Oracle Database 12c以降で使用されるLOBのデフォルトの記憶域メカニズムであり、LOBの格納および管理には従来の<INS>**BasicFilesではなくSecureFilesを使用すること**</INS>をお薦めします。

:::note info
* **TRANSFORM = LOB_STORAGE:SECUREFILE**
:::

:::note warn
BasicFiles LOBの方は、今後のリリースで非推奨になる予定です。
:::

## パラメータファイルの記載例
今までご紹介したベストプラクティスに記載されているパラメータを使った記載例となります。
指定する値はそれぞれの環境や実現したい意向によって異なりますので、あくまでも、こちらは記載方法の参考として見ていただければと思います。

#### ■ エクスポート用のパラメータ・ファイル(expdp.par)
```
schemas=app 
parallel=8
dumpfile=mydump%U.dmp 
filesize=5g
exclude=statistics
logtime=all
metrics=yes
compression=all 
compression_algorithm=medium
flashback_scn=3392846
```

#### ■ インポート用のパラメータ・ファイル(impdp.par)
```
schemas=app 
parallel=8
dumpfile=mydump%U.dmp 
exclude=statistics
logtime=all
metrics=yes
transform=lob_storage:securefile
```
:::note warn
パラメータを実行コマンドに直接入力して実行することも可能ですが、パラメータ・ファイルを使用して実行することが推奨とされています。
理由としては、整理されていて見やすいこと、ミスがないか見直す際に楽であること、大量に文字を入力する手間を省けることがあります。
:::


## おわりに
今回は、Oracle Data Pumpのベスト・プラクティスと代表的なパラメータについて解説しました。

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

:::note info
* [Oracle Data Pumpによるエクスポートとインポートの基礎](https://qiita.com/yunagash/items/15625a0b6010ee83de1a)
* [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/f2c037b1062753821c89)
* [Oracle Data Pumpのエクスポート時のジョブの中断、再開、強制終了の方法](https://qiita.com/yunagash/items/e06eb0fd4b1824bd09e0)
:::