OracleのData Pump(expdp
/impdp
)を使ってデータをエクスポート・インポートする際に、インデックスを除外して処理したいケースがあります。インデックスの再作成に時間がかかる大規模テーブルや、インポート後にアプリケーション側で最適なインデックスを再設計したい場合などが該当します。
本記事では、Data Pumpでインデックスを除外する方法と、インポート後にインデックスだけを個別で再作成する流れについて解説します。
インデックスを除外する基本パラメータ
Data Pumpでは、exclude
パラメータを使って特定のオブジェクトタイプを除外できます。インデックスを除外する場合は以下のように指定します。
exclude=index
これを使うと、インデックスオブジェクトがダンプファイルに含まれなくなります。
インデックスを除外してエクスポートする例
以下は、インデックスを除外してスキーマ全体をエクスポートするコマンド例です。
expdp user/password@orcl \
directory=DATA_PUMP_DIR \
dumpfile=data_no_index.dmp \
logfile=exp_no_index.log \
schemas=HR \
exclude=index
このコマンドにより、HR
スキーマのすべてのオブジェクトがエクスポートされますが、インデックスは含まれません。
インデックスを除外してインポートする例
既にインデックス付きでエクスポートされたダンプファイルから、インポート時にだけインデックスを除外することも可能です。
impdp user/password@orcl \
directory=DATA_PUMP_DIR \
dumpfile=data_with_index.dmp \
logfile=imp_no_index.log \
exclude=index
このようにすることで、インデックス以外のオブジェクト(テーブル、ビュー、データなど)のみを取り込み、インデックスはインポートされません。
特定のインデックスだけを除外したい場合
exclude
パラメータでは、オブジェクトの名前や条件を指定して除外することも可能です。
exclude=index:"='IDX_EMP_NAME'"
このようにすれば、特定のインデックス(IDX_EMP_NAME
)だけを除外し、他のインデックスは含めるといった柔軟な設定もできます。
インポート後にインデックスを個別に作成する
インデックスを除外した状態でインポートを行った場合、インポート後に必要なインデックスをSQLスクリプトなどで再作成します。
あらかじめ以下のようにSQLを抽出しておくと便利です。
impdp user/password \
directory=DATA_PUMP_DIR \
dumpfile=full_with_index.dmp \
sqlfile=create_index.sql \
include=index
このsqlfile
オプションにより、ダンプファイル内のインデックス定義だけをSQL形式で出力できます。中身を確認して、必要なインデックスのみを選んで実行することで、効率よく再作成できます。
まとめ
Data Pumpでインデックスを除外するにはexclude=index
を活用するのが基本です。エクスポート・インポートどちらのフェーズでも柔軟に指定可能で、以下のようなメリットがあります。
- インポート処理の高速化
- インデックス再設計の自由度が高まる
- 必要なインデックスだけを後から選んで作成可能
特に大規模なデータ移行や検証環境の構築時には有効な手段となりますので、ぜひ活用してみてください。