Data Pump(expdp/impdp)とは

Data Pump(データポンプと読みます)は10gから追加されたORACLEの論理バックアップのエクスポート及びインポートを行うexp/empの後継ユーティリティです。

exp/impから移行するにあたり、Data Pumpにはexp/impとの互換性はなくexpで作成したdmpファイルをimpdpで使用することはできないこと、 Data Pumpはデータベースサーバー側でdmpファイルを作成するアーキテクチャのためexpのようにクライアント側にdmpファイルを作成することはできず、 dmpを作成/読み込むためのDirectoryオブジェクトを作成しておく必要があることに注意する必要があります。



dmpファイルの入出力先

expdp/impdpをクライアント側で実行したとしてもdmpファイルはDBサーバ側の入出力になりますが、入出力先は以下のように決まります。

・何も指定しなかった場合
デフォルトで存在しているDATA_PUMP_DIRディレクトリに作成されます。 以下のSQLで出力パスを確認することができます。
SYS@ORCL102 > SELECT directory_name, directory_path FROM dba_directories
  2   WHERE directory_name='DATA_PUMP_DIR';

DIRECTORY_NAME
------------------------------------------------------------
DIRECTORY_PATH
---------------------------------------------------------------------------------

DATA_PUMP_DIR
E:\oracle\product\10.2.0\db_1\rdbms\log\
・dumpfileパラメータまたはdirectoryパラメータで指定した場合
どちらでもdmpは指定したdirectoryオブジェクトのパスに出力されますが、dumpfileパラメータで指定した場合ログファイルはDATA_PUMP_DIRに出力されてしまうため directoryパラメータで指定したほうがわかりやすいと思います。
directoryオブジェクトの作成
SQL>CREATE DIRECTORY TEMP_DIR AS 'E:\';
SQL>GRANT READ,WRITE ON DIRECTORY TEMP_DIR TO TEST;
directoryパラメータ指定
C:\>expdp test/test tables=test directory=TEMP_DIR dumpfile=test.dmp
dumpfileパラメータ指定
C:\>expdp test/test tables=test dumpfile=TEMP_DIR:test.dmp

実行モード

expdp/impdpには5つのモードがあり、目的に応じて必要最小限のバックアップのみ取得することが可能です。

・全体モード
expdp <ユーザ名>/<パスワード> FULL=Y dumpfile=<出力ファイル名>
※DATAPUMP_EXP_FULL_DATABASE権限が必要
impdp <ユーザ名>/<パスワード> FULL=Y dumpfile=<出力ファイル名>

※DATAPUMP_IMP_FULL_DATABASE権限が必要

--実行例
expdp testuser/testpwd FULL=Y directory=data_pump_dir dumpfile=full.dmp

・スキーマモード
expdp <ユーザ名>/<パスワード> SCHEMAS=<スキーマ名>,<スキーマ名>・・・ dumpfile=<出力ファイル名>
※接続スキーマ以外のスキーマ指定にはDATAPUMP_EXP_FULL_DATABASE権限が必要
impdp <ユーザ名>/<パスワード> SCHEMAS=<スキーマ名>,<スキーマ名>・・・ dumpfile=<出力ファイル名>
※接続スキーマ以外のスキーマ指定にはDATAPUMP_IMP_FULL_DATABASE権限が必要

※実行モードを何も指定しなかった場合はスキーマモードで動作します

--実行例1(testuserスキーマのバックアップ)
expdp testuser/testpwd directory=data_pump_dir dumpfile=testuser_schemas.dmp
--実行例2(testuserスキーマとSCOTTスキーマのバックアップ)
expdp testuser/testpwd SCHEMAS=TESTUSER,SCOTT directory=data_pump_dir dumpfile=testuser.dmp

・表領域モード
expdp <ユーザ名>/<パスワード> TABLESPACES=<表領域名>,<表領域名>・・・ dumpfile=<出力ファイル名>
impdp <ユーザ名>/<パスワード> TABLESPACES=<表領域名>,<表領域名>・・・ dumpfile=<出力ファイル名>

※依存関係のあるオブジェクト(表に対する索引や、複数表領域にまたがるパーティションなど)は指定したTABLESPACES以外でも処理対象になります。

--実行例1(USERS表領域のバックアップ)
expdp testuser/testpwd TABLESPACES=USERS directory=data_pump_dir dumpfile=testuser_USERS.dmp

・表モード
expdp <ユーザ名>/<パスワード> tables=<テーブル名>,<テーブル名>・・・ file=<出力ファイル名>
impdp <ユーザ名>/<パスワード> tables=<テーブル名>,<テーブル名>・・・ file=<出力ファイル名>
--実行例1(EMP表のバックアップ)
expdp testuser/testpwd TABLES=EMP directory=data_pump_dir dumpfile=testuser_EMP.dmp

・トランスポータブル表領域モード※
expdp test/test TRANSPORT_TABLESPACES=USERS dumpfile=test.dmp
impdp test/test TRANSPORT_TABLESPACES=USERS dumpfile=test.dmp
※トランスポータブル表領域モードは異なるデータベースへデータファイル単位で移行する際のモードです。使用には対象表領域をread onlyモードにする必要がある、オブジェクトが指定された表領域内で完結している(他に依存する表領域がない)などの制約があります。
--実行例1(TBS1,TBS2表領域のバックアップ)
expdp testuser/testpwd TRANSPORT_TABLESPACES=TBS1,TBS2 dumpfile=TBS1_TBS2.dmp

主なオプション

・CONTENT
オブジェクトのデータとメタデータ(オブジェクト定義)をそれぞれ処理対象とするか選択することができます。

・データのみ処理する
CONTENT=DATA_ONLY

・メタデータのみ処理する
CONTENT=METADATA_ONLY

・データ、メタデータ両方処理する(デフォルト)
CONTENT=ALL

・INCLUDE、EXCLUDE
特定のオブジェクトのみを対象/対象外にすることができます。

ファンクションを対象外にする
EXCLUDE=FUNCTION

パッケージを対象外にする
EXCLUDE=PACKAGE

I_TESTから始まるインデックスを対象外にする
EXCLUDE=INDEX:"LIKE 'I_TEST%' " ※

TESTスキーマは対象外にする
EXCLUDE=SCHEMA:"= 'TEST'" ※

EXISTS_TBL表のTABLE_NAMEに登録されている表を対象外にする
--対象外リスト表(EXISTS_TBL)の準備
create table EXISTS_TBL(TABLE_NAME VARCHAR2(128));
insert into exists_tbl values('T1');
EXCLUDE=TABLE:"IN(SELECT TABLE_NAME FROM EXISTS_TBL)" ※

・ESTIMATE_ONLY=y

expdpで利用できるオプションで、実際にデータ領域にアクセスしたりdumpファイルを出力したりせずdumpファイルサイズの見積もりだけ出力します。また、見積もりはセグメントサイズからの見積もりであるため以下のような要因で見積もりと実際の出力サイズが乖離する可能性があります。

・データが断片化しておりセグメント内に空き領域が多い。→見積もりよりdumpファイルが小さくなる
・圧縮されている。→dumpファイルサイズは非圧縮状態のサイズになるため見積もりより大きなサイズになる。このケースでは、最新の状態の統計情報が収集されていればESTIMATE=STATISTICSを指定すると統計ベースの見積もりになり正確になる。

・QUERY
テーブルデータに対して抽出条件を設けます。
QUERY=TABLE1:"WHERE COL1 < 10" ※

・FLASHBACK_TIME
対象の全オブジェクトに対して指定時間の一貫性を維持してデータで処理します。 つまり、15:00を指定したとすると全て15:00時点のデータがエクスポートされます。 注意点としてトランザクションによりUNDO表領域が圧迫されている場合や、undo_retentionパラメータの値が短すぎる場合ORA-01555で処理が失敗する可能性があります。

処理開始時点の一貫性のあるデータを処理する
FLASHBACK_TIME="to_timestamp(sysdate)" ※

※・・・シングルクォーテーション等の記号はOSやシェルによっては特殊文字でありそのままの値としてパラメータへ渡されない場合があります。 このため、「\」でエスケープする、PARFILEパラメータを使ったパラメータ設定ファイルで指定するといった対応が必要です。
エスケープの例:QUERY=TEST:\"WHERE COL1 \< 10\" tables=test

TIPS

datapumpはチューニング系パラメータは廃止された
datapumpは後述する見積もり処理によりexp/imp等で必要だったチューニング系パラメータは全て廃止され自動チューニングされるようになりました。 data pump固有のチューニング系パラメータは多重度を指定するPARALLELパラメータのみです。

datapumpは大規模表を想定した実装になっている
datapumpは実行すると最初に対象データのサイズ等を計算しており処理時間が最適化されるように見積もりを行っています。 この見積もり処理に数秒程度時間がかかるため、小規模表を1テーブル毎にexp/impしている処理をそのままdatapumpに差し替えると datapumpのほうが遅くなる場合があるためdatapumpを使用する場合は一度に複数の表をまとめて処理する実装を検討します。

datapumpはJOBとして実行される
datapumpの処理はORACLEのJOBとして実装されておりdbms_datapumpパッケージを利用すると処理の中断や再開が可能になっています。 この影響でバージョンによってはdatapumpを途中キャンセルしたり異常終了したりすると内部オブジェクト(SYS_EXPORT_SCHEMA_01といったテーブル等)が残ったままになり再実行してもエラーになる場合があります (残っている内部テーブルを削除することでエラーは解消します)。 また、このジョブで実装するというアーキテクチャの影響と思われますがdatapumpは並列で実行すると処理間が競合し処理時間が長くなる傾向があります。
この競合はJOB_NAMEパラメータに一意な値を指定することである程度改善します。

既存表に対してimpdpを行う場合はPK索引を削除しておくと早くなる
既に存在する表へimpdpする場合、PK索引が存在しているとダイレクト処理ではなく従来型で処理され処理時間が遅くなります。 表を削除しておくか、PK索引を削除しておくことで処理が高速化します。

datapumpはstreams_pool_sizeの領域を利用する
datapumpの実行にはSGA内のstreams_pool_sizeの領域が使用されます。streams_pool_sizeの設定をしていない場合自動的にバッファキャッシュから一定の割合の領域が割り当てられ、 メモリが大きいほど領域が無駄になる可能性が高くなるためstreams_pool_sizeは明示的に設定したほうが無難です。なお、11.2のユーティリティマニュアルでは10MBを推奨するとの記載があります。

datapumpを実行するとalertlogが汚れる
datapumpは実行するたびにalertlogにマスタープロセス及びワーカープロセスの起動情報が書き込まれるため大量実行するとアラートログが肥大化する可能性があります。 RAC環境においては内部的にalter system set services=...で初期化パラメータを変更する処理が実行されるためさらに肥大化します。

マニュアル

ユーティリティ10g リリース2(10.2)
Oracle Databaseユーティリティ11g リリース2(11.2)
★ORACLE案件承ります