impdp オプション徹底解説【Oracle Data Pump】
はじめに
Oracleデータベースにおいて、データのバックアップ、リカバリ、データベース間のデータ移行、特定のオブジェクトのコピーといった作業は日常的に発生します。これらの作業を効率的かつ柔軟に行うためにOracleが提供しているツールがOracle Data Pumpです。Data Pumpは、従来のexp/impユーティリティに比べて、高速性、並行処理能力、柔軟性の向上といった多くのメリットを持っています。
Data Pumpは主にエクスポート(データの書き出し)を行うexpdpと、インポート(データの読み込み、データベースへの書き込み)を行うimpdpの2つのコマンドラインユーティリティで構成されます。この記事では、このうちimpdpコマンドに焦点を当て、その基本的な使い方から、多岐にわたるオプションの詳細、具体的な使用例、そして使用上の注意点までを徹底的に解説します。
データベース管理者や開発者がimpdpを最大限に活用できるよう、各オプションの持つ意味や、どのような状況でどのオプションを使うべきか、さらには複数のオプションを組み合わせる方法についても詳しく説明します。
Oracle Data Pumpにおけるimpdpの役割
impdpコマンドは、expdpによって作成されたダンプファイル(通常.dmp拡張子を持つ)を読み込み、その内容をOracleデータベースにロードする役割を担います。主な用途は以下の通りです。
- バックアップからのリカバリ:
expdpで取得したバックアップから、データベース全体、特定のスキーマ、または特定のオブジェクトを復元します。 - データベース間のデータ移行: あるデータベースからエクスポートしたデータを、別のデータベースにインポートすることで、データベースのアップグレードやプラットフォーム移行を支援します。
- スキーマやオブジェクトのコピー: 同じデータベース内、または異なるデータベース間で、スキーマ全体や特定のテーブルなどをコピーします。
- 特定の時点へのリストア: フラッシュバックオプションを使用して、過去の特定の時点の状態にデータをリストアします。
- スキーマ名や表領域名の変更: インポート時にスキーマ名や表領域名を変更してロードできます。
これらの多様な要求に応えるために、impdpは豊富なオプションを提供しています。次に、その基本構文と主要オプションを見ていきましょう。
impdp コマンドの基本構文
impdpコマンドの基本的な呼び出し形式は以下のようになります。
bash
impdp [接続情報] [オプション ...]
[接続情報]: データベースへの接続に必要な情報(ユーザー名、パスワード、接続文字列)。通常ユーザー名/パスワード[@接続文字列]の形式で指定します。[オプション ...]:impdpの動作を制御するための様々なオプション。
例えば、一般的な接続方法は以下のようになります。
bash
impdp system/manager@orcl ...
または、SYSDBA/SYSOPERとして接続する場合。
bash
impdp system/manager@orcl as sysdba ...
Data Pumpを実行するユーザーには、通常 DATAPUMP_EXP_FULL_DATABASE および DATAPUMP_IMP_FULL_DATABASE ロール(またはそれと同等の権限)が必要です。また、ダンプファイルが格納されているディレクトリに対する読み取り権限が必要です。これはデータベースオブジェクトとしての「ディレクトリ」に対してOSユーザーが持つ権限と、データベースユーザーが持つ権限(GRANT READ, WRITE ON DIRECTORY …)の両方が必要になります。
主要オプションの詳細解説
ここからは、impdpコマンドで使用できる主要なオプションについて、カテゴリ別に詳しく解説していきます。
接続関連オプション
これらのオプションは、どのダンプファイルをどこから読み込むかを指定するために使用します。
-
DIRECTORY=<ディレクトリ名>- 機能: ダンプファイル、ログファイル、SQLファイルが格納されるデータベースディレクトリオブジェクトの名前を指定します。これは
expdp実行時にも使用されたディレクトリと同じである必要はありませんが、インポートを実行するユーザーがそのディレクトリに対するREAD権限を持っている必要があります。WRITE権限はログファイルやSQLファイルを出力する場合に必要です。 - 書式:
DIRECTORY=DATA_PUMP_DIR - 注意点: OS上のパスを直接指定するのではなく、
CREATE DIRECTORYコマンドで作成されたデータベースオブジェクト名を指定します。 - 例:
bash
impdp system/manager DIRECTORY=DATA_PUMP_DIR DUMPFILE=expdp_full_20231027.dmp ...
- 機能: ダンプファイル、ログファイル、SQLファイルが格納されるデータベースディレクトリオブジェクトの名前を指定します。これは
-
DUMPFILE=<ファイル名>[, ファイル名2, ...]- 機能: インポート元となるダンプファイルの名前を指定します。複数のファイルがある場合はカンマ区切りで指定します。ファイル名は
DIRECTORYオプションで指定したディレクトリからの相対パスとして解釈されます。圧縮ファイル(.gz,.Zなど)や暗号化ファイルも、データベースが対応していれば指定できます。 - 書式:
DUMPFILE=dumpfile1.dmp,dumpfile2.dmpまたはDUMPFILE=sales%U.dmp(エクスポート時に%Uで分割されたファイル) - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=full_backup_part1.dmp,full_backup_part2.dmp LOGFILE=impdp_full.log
%Uを使用する場合、Uは01から始まり、必要なファイルの数だけインクリメントされます。
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=sales%U.dmp LOGFILE=impdp_sales.log
- 機能: インポート元となるダンプファイルの名前を指定します。複数のファイルがある場合はカンマ区切りで指定します。ファイル名は
-
NETWORK_LINK=<データベースリンク名>- 機能: ダンプファイルを使用せず、データベースリンクを介してリモートデータベースから直接データをインポートします。
expdpのNETWORK_LINKオプションでエクスポートした場合と同様に、リモートから直接ローカルへデータを転送する場合に便利です。 - 書式:
NETWORK_LINK=remote_db_link - 注意点: 指定するデータベースリンクは、インポート元データベースへの接続が可能であり、かつインポート元データベースでData Pumpのエクスポート機能(またはそれと同等の機能)が使用できる必要があります。
- 例:
bash
impdp system/manager NETWORK_LINK=remote_sales_db SCHEMAS=sales LOGFILE=impdp_sales_from_remote.log
- 機能: ダンプファイルを使用せず、データベースリンクを介してリモートデータベースから直接データをインポートします。
-
TRANSPORT_FULL_CHECK={YES | NO}- 機能: トランスポータブル表領域インポートの前に、ダンプファイルに含まれるオブジェクトがインポート先のデータベースに正しく組み込めるか、完全な互換性チェックを実行するかどうかを指定します。
- 書式:
TRANSPORT_FULL_CHECK=YES - デフォルト:
NO - 注意点:
YESにするとチェックに時間がかかりますが、潜在的な問題を事前に検出できます。トランスポータブル表領域インポートを実行する場合は、互換性の問題を避けるためにYESを指定することが推奨されます。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=tsp_sales.dmp TRANSPORT_TABLESPACES=sales_data TRANSPORT_FULL_CHECK=YES LOGFILE=impdp_tsp_check.log
インポート制御オプション
これらのオプションは、ダンプファイル内のどのデータ/メタデータをインポートするか、インポート範囲をどのように指定するかを制御します。
-
SCHEMAS=<スキーマ名>[, スキーマ名2, ...]- 機能: 指定したスキーマ(ユーザー)に含まれるすべてのオブジェクトをインポートします。通常、スキーマ単位の移行やコピーに使用されます。
- 書式:
SCHEMAS=hr,oe - 注意点:
FULL=Yオプションとは同時に指定できません。 - 例:
bash
impdp system/manager DIRECTORY=dp_dir DUMPFILE=expdp_hr_oe.dmp SCHEMAS=hr,oe LOGFILE=impdp_hr_oe.log
-
TABLES=<テーブル名>[:<パーティション名>] ...- 機能: 指定したテーブル(およびオプションでパーティション)のみをインポートします。特定のテーブルだけを復元したり、コピーしたりする場合に使用します。テーブル名は
[スキーマ名.]テーブル名の形式で指定することも、SCHEMASオプションと組み合わせてスキーマ内のテーブル名を指定することも可能です。 - 書式:
TABLES=employees,dependentsまたはTABLES=hr.employees,oe.orders - 注意点:
FULL=YやSCHEMASオプションとは組み合わせ方に注意が必要です。例えばSCHEMAS=hr TABLES=employeesと指定すると、hr.employeesテーブルのみがインポートされます。 - 例:
bash
impdp system/manager DIRECTORY=dp_dir DUMPFILE=expdp_hr.dmp SCHEMAS=hr TABLES=employees LOGFILE=impdp_hr_employees.log
特定のパーティションのみ:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=sales_part.dmp TABLES=sales:sales_q1_2023 LOGFILE=impdp_sales_part.log
- 機能: 指定したテーブル(およびオプションでパーティション)のみをインポートします。特定のテーブルだけを復元したり、コピーしたりする場合に使用します。テーブル名は
-
TABLESPACES=<表領域名>[, 表領域名2, ...]- 機能: 指定した表領域内にセグメントを持つオブジェクト(テーブル、索引、LOBなど)をインポートします。ただし、このオプションはメタデータのフィルタリングには使用されません。あくまでデータファイル中のセグメントデータが、インポート先でどの表領域に属するかを指定する際の参考になる程度です。主にトランスポータブル表領域インポートの文脈で使用されますが、通常のインポートで指定しても、インポート元ダンプファイルに該当表領域の情報が含まれていれば、その表領域にデータを持つオブジェクトがインポートの対象になりえます。
- 書式:
TABLESPACES=users,tools - 注意点: オブジェクトの所属スキーマやタイプによるフィルタリングには
SCHEMASやINCLUDE/EXCLUDEを使用するのが一般的です。TRANSPORT_TABLESPACESオプションとは異なります。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=full_backup.dmp TABLESPACES=users LOGFILE=impdp_users_ts.log
-
FULL={YES | NO}- 機能: ダンプファイルに含まれるデータベース全体(SYSスキーマを除くすべてのオブジェクトとデータ)をインポートするかどうかを指定します。
- 書式:
FULL=YES - デフォルト:
NO(他のフィルタオプションが指定されていない場合) - 注意点:
SCHEMAS,TABLES,TABLESPACES,EXCLUDE,INCLUDEなどのフィルタオプションとは同時に指定できません。システム全体をリストアする際に使用されることが多いです。SYSDBA権限が必要です。 - 例:
bash
impdp system/manager as sysdba DIRECTORY=dp_dir DUMPFILE=full_backup_20231027.dmp FULL=YES LOGFILE=impdp_full_restore.log
-
FLASHBACK_TIME=<タイムスタンプ>/FLASHBACK_SCN=<SCN>- 機能: インポート元がフラッシュバックオプション付きでエクスポートされたダンプファイルである場合に、そのダンプファイルに含まれるフラッシュバックポイント(特定の時点またはSCN)に対応するデータのみをインポートします。
- 書式:
FLASHBACK_TIME="TO_TIMESTAMP('2023-10-27 10:00:00', 'YYYY-MM-DD HH24:MI:SS')"またはFLASHBACK_SCN=1234567 - 注意点:
expdp時にFLASHBACK_TIMEまたはFLASHBACK_SCNを指定してエクスポートされたダンプファイルに対してのみ有効です。これらのオプションをimpdpで指定すると、インポートされるデータはエクスポート時のフラッシュバックポイントの状態になります。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=hr_backup.dmp SCHEMAS=hr FLASHBACK_TIME="TO_TIMESTAMP('2023-10-27 14:30:00', 'YYYY-MM-DD HH24:MI:SS')" LOGFILE=impdp_hr_flashback.log
-
EXCLUDE=<オブジェクトタイプ>[:<オブジェクト名>] ...- 機能: インポートから除外するオブジェクトを指定します。特定のテーブルやインデックス、制約などをインポートしない場合に便利です。複数のオブジェクトタイプや名前をカンマ区切りで指定できます。オブジェクト名はワイルドカード(
%)を使用できます。 - 書式:
EXCLUDE=TABLE:employees,INDEX:"SYS_C%",EXCLUDE=SCHEMA:test_schema - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=full_backup.dmp FULL=YES EXCLUDE=SCHEMA:test_schema LOGFILE=impdp_full_no_test.log
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=hr_oe.dmp SCHEMAS=hr,oe EXCLUDE=TABLE:hr.employees LOGFILE=impdp_hr_oe_no_employees.log - 一般的なオブジェクトタイプ:
AGGREGATE,CLUSTER,COMMENT,CONSTRAINT,CONTEXT,DATABASE_LINK,DEFAULT_ROLE,DIMENSION,DIRECTORY,FUNCTION,INDEX,INDEXTYPE,JOB,JAVA_CLASS,JAVA_DATA,JAVA_RESOURCE,LIBRARY,MATERIALIZED_VIEW,MATERIALIZED_VIEW_LOG,OBJECT_GRANT,PACKAGE,PACKAGE_BODY,PROCEDURE,PROFILE,QUEUE,RESOURCE_GROUP,RLS_POLICY,ROLE,SEQUENCE,SYNONYM,TABLE,TABLESPACE,TRIGGER,TYPE,TYPE_BODY,UNDO_TABLESPACE,USER,VIEWなど。
- 機能: インポートから除外するオブジェクトを指定します。特定のテーブルやインデックス、制約などをインポートしない場合に便利です。複数のオブジェクトタイプや名前をカンマ区切りで指定できます。オブジェクト名はワイルドカード(
-
INCLUDE=<オブジェクトタイプ>[:<オブジェクト名>] ...- 機能: インポートに含めるオブジェクトを指定します。
EXCLUDEの逆で、指定したオブジェクトのみをインポートします。EXCLUDEと同様にワイルドカードを使用できます。 - 書式:
INCLUDE=TABLE:employees,TABLE:dependentsまたはINCLUDE=TABLE:"EMP%" - 注意点:
INCLUDEとEXCLUDEを同時に指定した場合、INCLUDEで絞り込んだ中からEXCLUDEで除外するという論理になります。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr INCLUDE=TABLE:employees,TABLE:dependents LOGFILE=impdp_hr_emp_dep.log
- 機能: インポートに含めるオブジェクトを指定します。
-
CONTENT={ALL | DATA_ONLY | METADATA_ONLY}- 機能: ダンプファイルからインポートする内容を指定します。
ALL: メタデータ(オブジェクト定義)とデータの両方をインポートします(デフォルト)。DATA_ONLY: データのみをインポートします。インポート先のテーブルが既に存在している必要があります。METADATA_ONLY: メタデータ(オブジェクト定義)のみをインポートします。データベース構造のコピーや、オブジェクト定義の確認(SQLFILEと組み合わせる)に便利です。
- 書式:
CONTENT=DATA_ONLY - 例:
bash
# 既存テーブルにデータを追加
impdp ... DIRECTORY=dp_dir DUMPFILE=sales_data.dmp SCHEMAS=sales CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND LOGFILE=impdp_sales_data_append.log
bash
# スキーマ構造のみコピー
impdp ... DIRECTORY=dp_dir DUMPFILE=hr_schema.dmp SCHEMAS=hr REMAP_SCHEMA=hr:hr_test CONTENT=METADATA_ONLY LOGFILE=impdp_hr_metadata_copy.log
- 機能: ダンプファイルからインポートする内容を指定します。
オブジェクト変換/マッピングオプション
これらのオプションは、インポート先のデータベースでオブジェクトの名前や格納場所を変更したい場合に使用します。
-
REMAP_SCHEMA=<ソーススキーマ>:<ターゲットスキーマ>- 機能: ダンプファイル内の指定したソーススキーマのオブジェクトを、ターゲットスキーマのオブジェクトとしてインポートします。スキーマ名の変更や、あるスキーマのデータを別のスキーマにコピーする際に使用します。複数のマッピングをカンマ区切りで指定できます。
- 書式:
REMAP_SCHEMA=hr:hr_new,oe:oe_new - 注意点: ターゲットスキーマはインポート先データベースに存在している必要があります。存在しない場合は事前に作成しておく必要があります。
- 例:
bash
impdp system/manager DIRECTORY=dp_dir DUMPFILE=hr_schema.dmp SCHEMAS=hr REMAP_SCHEMA=hr:hr_test LOGFILE=impdp_hr_to_hr_test.log
-
REMAP_TABLESPACE=<ソース表領域>:<ターゲット表領域>- 機能: ダンプファイル内の指定したソース表領域に格納されていたオブジェクトセグメントを、ターゲット表領域に格納されるようにインポートします。表領域構成が異なるデータベースへ移行する際などに使用します。複数のマッピングをカンマ区切りで指定できます。
- 書式:
REMAP_TABLESPACE=users:users_new,tools:tools_new - 注意点: ターゲット表領域はインポート先データベースに存在している必要があります。存在しない場合は事前に作成しておく必要があります。
- 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=full_backup.dmp FULL=YES REMAP_TABLESPACE=users:users_prod LOGFILE=impdp_full_remap_ts.log
-
TRANSFORM=<変換タイプ>[:<変換パラメータ>] ...- 機能: インポート中にオブジェクトのメタデータを変換します。非常に強力で柔軟なオプションです。様々な変換タイプが用意されています。
- 書式:
TRANSFORM=SEGMENT_ATTRIBUTES:N,STORAGE:N - 主な変換タイプ:
SEGMENT_ATTRIBUTES:{Y | N}: テーブル、インデックス、LOBセグメントなどのセグメント属性(物理的な格納情報、例: PCTFREE, PCTUSED, INITRANS, MAXTRANS, TABLESPACE, STORAGE句など)をインポートするかどうか。Nを指定すると、これらの属性は除外され、インポート先の表領域のデフォルト属性や、インポート先のデータベースのストレージ設定に従ってオブジェクトが作成されます。移行先でストレージ設定を標準化したい場合によく使用されます。STORAGE:{Y | N}:SEGMENT_ATTRIBUTES=Nを指定した場合に、さらにストレージ句(INITIAL, NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTSなど)のみを個別に制御します。通常、SEGMENT_ATTRIBUTES=Nで十分ですが、より細かく制御したい場合に使用します。OID:{Y | N}: オブジェクト型や参照型列に関連付けられたOID(オブジェクト識別子)をインポートするかどうか。異なるデータベース間でオブジェクト型を移行する場合などに重要になることがあります。CONSTRAINTS:{Y | N}: 制約(PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK)をインポートするかどうか。データを高速にロードするために制約なしでロードし、後から有効化したい場合などに使用します。REF_CONSTRAINTS:{Y | N}: 参照制約(FOREIGN KEY)のみをインポートするかどうか。INDEXES:{Y | N}: インデックスをインポートするかどうか。インデックスを後から再構築したい場合などに使用します。LOB_STORAGE:{ENABLE | DISABLE | <storage_clause>}: LOBセグメントのストレージ属性を制御します。DISABLEでセグメントなしでインポート、ENABLEでエクスポート時の属性を使用、ストレージ句を指定して新しい属性を定義できます。TABLE_COMPRESSION_CLAUSE:<compression_clause>: テーブル圧縮句を指定してテーブルを作成します。
- 例:
bash
# セグメント属性とストレージ句を除外してインポート
impdp ... DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr REMAP_SCHEMA=hr:hr_test TRANSFORM=SEGMENT_ATTRIBUTES:N LOGFILE=impdp_hr_no_storage.log
bash
# 制約とインデックスを除外してインポート
impdp ... DIRECTORY=dp_dir DUMPFILE=sales.dmp SCHEMAS=sales TRANSFORM=CONSTRAINTS:N,INDEXES:N LOGFILE=impdp_sales_no_cons_idx.log
並行処理/パフォーマンス関連オプション
これらのオプションは、インポート処理のパフォーマンスを向上させるために使用します。
-
PARALLEL=<並行度>- 機能: インポート操作に使用する並行処理ワーカープロセスの数を指定します。並行度を上げると、複数のオブジェクトやデータファイルを同時に処理できるため、インポート時間を大幅に短縮できる可能性があります。
- 書式:
PARALLEL=4 - 注意点: 並行度を上げすぎると、システムのCPU、I/O、メモリリソースを過剰に消費し、かえってパフォーマンスが低下する場合があります。システムの能力とダンプファイルの構造(分割されているかなど)に応じて適切な値を設定する必要があります。
SYSDBA権限が必要です。 - 例:
bash
impdp system/manager as sysdba DIRECTORY=dp_dir DUMPFILE=full_backup_%U.dmp FULL=YES PARALLEL=8 LOGFILE=impdp_full_parallel.log
-
JOB_NAME=<ジョブ名>- 機能: Data Pumpジョブに識別用の名前を付けます。実行中のジョブの状態を監視したり、後からジョブを再開したり、停止したりする際に使用します。指定しない場合はシステムが自動的にユニークな名前を生成します。
- 書式:
JOB_NAME=my_hr_import_job - 例:
bash
impdp system/manager DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr JOB_NAME=hr_import_20231027 LOGFILE=impdp_hr.log - 実行中のジョブの確認:
sql
SELECT owner_name, job_name, operation, job_mode, state FROM dba_datapump_jobs WHERE job_name = 'HR_IMPORT_20231027'; - ジョブの停止/アタッチ/再開:
impdpプロンプトでSTOP_JOB,ATTACH,CONTINUE_CLIENTコマンドを使用します。または、別のセッションからimpdp ATTACH=job_nameでアタッチします。
ログ/進捗管理オプション
これらのオプションは、インポート処理の出力やログファイルの生成を制御します。
-
LOGFILE=<ファイル名>- 機能: インポート処理の詳細なログを出力するファイル名を指定します。ファイルは
DIRECTORYオプションで指定したディレクトリに作成されます。デバッグや実行履歴の確認に不可欠です。 - 書式:
LOGFILE=impdp_output.log - デフォルト:
imdp.log - 注意点:
DIRECTORYに対するWRITE権限が必要です。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr LOGFILE=impdp_hr_20231027.log
- 機能: インポート処理の詳細なログを出力するファイル名を指定します。ファイルは
-
STATUS=<秒>- 機能: インポート処理の進行状況(完了率など)をコンソールに表示する間隔を秒単位で指定します。
- 書式:
STATUS=60 - デフォルト: 0 (表示しない)
- 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=large_data.dmp SCHEMAS=sales STATUS=30 LOGFILE=impdp_sales_large.log
エラー処理オプション
これらのオプションは、インポート中にエラーが発生した場合の動作を制御します。
-
SKIP_UNUSABLE_INDEXES={YES | NO}- 機能: インポート中にテーブルがロードされる際、そのテーブルに関連付けられた既存のインデックスがUNUSABLE状態になっている場合に、インデックスへの挿入をスキップするかどうかを指定します。これにより、UNUSABLEなインデックスが原因でロードが失敗するのを防ぎます。
- 書式:
SKIP_UNUSABLE_INDEXES=YES - デフォルト:
NO - 注意点:
YESにした場合、データロード後にUNUSABLEなインデックスを再構築する必要があります。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=data_only.dmp TABLES=sales.orders CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND SKIP_UNUSABLE_INDEXES=YES LOGFILE=impdp_orders_skip_idx.log
-
TABLE_EXISTS_ACTION={SKIP | APPEND | REPLACE | TRUNCATE}- 機能: インポートしようとしているテーブルがインポート先に既に存在する場合の動作を指定します。
SKIP: そのテーブルのデータとメタデータのインポートをスキップします。APPEND: 既存テーブルにデータを追記します。テーブル定義は変更されません。REPLACE: 既存テーブルを削除し、ダンプファイルからテーブルを再作成してデータをロードします。テーブルの依存オブジェクト(インデックス、制約など)も再作成されます。TRUNCATE: 既存テーブルのデータをTRUNCATEし、ダンプファイルからデータをロードします。テーブル定義は変更されません。APPENDよりも高速に既存データをクリアできます。
- 書式:
TABLE_EXISTS_ACTION=REPLACE - デフォルト:
SKIP - 注意点:
REPLACEはテーブルをDROP/CREATEするため、依存オブジェクト(外部キー参照など)に影響する可能性があります。APPENDやTRUNCATEはテーブル定義を変更しません。既存テーブルの列数やデータ型がダンプファイルの定義と異なる場合、エラーになる可能性があります。- 大規模テーブルの場合、
TRUNCATEはREDO/UNDOを少なく抑えられるため高速ですが、ロールバックはできません。REPLACEはDROP/CREATEのオーバーヘッドがあります。
- 例:
bash
# 既存テーブルを削除して再作成し、データをロード
impdp ... DIRECTORY=dp_dir DUMPFILE=hr.dmp SCHEMAS=hr TABLE_EXISTS_ACTION=REPLACE LOGFILE=impdp_hr_replace.log
bash
# 既存テーブルにデータを追記
impdp ... DIRECTORY=dp_dir DUMPFILE=sales_updates.dmp SCHEMAS=sales TABLE_EXISTS_ACTION=APPEND CONTENT=DATA_ONLY LOGFILE=impdp_sales_append.log
bash
# 既存テーブルをTRUNCATEしてデータをロード
impdp ... DIRECTORY=dp_dir DUMPFILE=large_sales.dmp SCHEMAS=sales TABLE_EXISTS_ACTION=TRUNCATE CONTENT=DATA_ONLY LOGFILE=impdp_sales_truncate.log
- 機能: インポートしようとしているテーブルがインポート先に既に存在する場合の動作を指定します。
-
VERSION={COMPATIBLE | LATEST | version_string}- 機能: インポートするオブジェクトのバージョンを指定します。主に、エクスポート元のデータベースよりインポート先のデータベースのバージョンが低い場合に、互換性のあるバージョンのメタデータをインポートするために使用します。
COMPATIBLE: インポート先データベースの互換性パラメータで定義されたバージョンに互換性のあるメタデータをインポートします。LATEST: ダンプファイルに含まれる最新のバージョンのメタデータをインポートします(デフォルト)。version_string: 特定のバージョンを指定します(例:'12.1.0')。
- 書式:
VERSION=COMPATIBLE - 注意点: ダウンバージョンインポート(新しいバージョンから古いバージョンへのインポート)は、常にサポートされているわけではありません。詳細はOracleドキュメントを確認してください。通常は、同じバージョンまたは新しいバージョンへのインポートが行われます。
- 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=expdp_19c.dmp VERSION=COMPATIBLE LOGFILE=impdp_to_12c.log
- 機能: インポートするオブジェクトのバージョンを指定します。主に、エクスポート元のデータベースよりインポート先のデータベースのバージョンが低い場合に、互換性のあるバージョンのメタデータをインポートするために使用します。
その他の便利オプション
インポート処理をより柔軟に制御したり、特定のタスクを実行したりするためのオプションです。
-
NOLOGFILE- 機能: インポート処理のログファイルを生成しません。主にテスト実行などでログが不要な場合に使用しますが、問題発生時の調査のためにはログの生成を強く推奨します。
- 書式:
NOLOGFILE=YES - デフォルト:
NO(ログファイルを生成する)
-
SQLFILE=<ファイル名>- 機能: ダンプファイルに含まれるオブジェクトのCREATE文などのメタデータを、インポートを実行せずに指定したファイルに出力します。ダンプファイルの中身を確認したり、手動でオブジェクトを作成し直したりする場合に非常に便利です。データは出力されません(
CONTENT=METADATA_ONLYのような動作になりますが、実際にインポートは行われません)。 - 書式:
SQLFILE=metadata_output.sql - 注意点: ファイルは
DIRECTORYオプションで指定したディレクトリに作成されます。DIRECTORYに対するWRITE権限が必要です。 - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=hr_schema.dmp SCHEMAS=hr SQLFILE=hr_schema_ddl.sql LOGFILE=impdp_hr_sqlfile.log
- 機能: ダンプファイルに含まれるオブジェクトのCREATE文などのメタデータを、インポートを実行せずに指定したファイルに出力します。ダンプファイルの中身を確認したり、手動でオブジェクトを作成し直したりする場合に非常に便利です。データは出力されません(
-
METRICS={YES | NO}- 機能: Data Pumpジョブに関する詳細なメトリック情報(各操作に要した時間など)をログファイルに出力するかどうかを指定します。パフォーマンス分析に役立ちます。
- 書式:
METRICS=YES - デフォルト:
NO - 例:
bash
impdp ... DIRECTORY=dp_dir DUMPFILE=large_import.dmp SCHEMAS=sales METRICS=YES LOGFILE=impdp_sales_metrics.log
-
STREAMS_INSTANTIATION={Y | N}- 機能: Oracle StreamsまたはGoldenGateのレプリケーション環境で、インポート時にストリームのインスタンス化のための情報をダンプファイルに含める/含めないかを指定します。
expdpの同名オプションと組み合わせて使用します。 - 書式:
STREAMS_INSTANTIATION=Y - 注意点: レプリケーション環境での使用に特化したオプションです。
- 機能: Oracle StreamsまたはGoldenGateのレプリケーション環境で、インポート時にストリームのインスタンス化のための情報をダンプファイルに含める/含めないかを指定します。
-
KEEP_MASTER={Y | N}- 機能: Data Pumpジョブが完了した際に、マスターテーブル(ジョブのメタデータを格納する内部テーブル)を削除するかどうかを指定します。
- 書式:
KEEP_MASTER=Y - デフォルト:
N(ジョブ完了時に削除される) - 注意点: マスターテーブルを残しておくと、後からジョブの履歴を
DBA_DATAPUMP_JOBSビューなどで確認できますが、テーブルが残り続けます。通常はデフォルトのNで問題ありません。
-
MASTER_LINK=<データベースリンク名>- 機能: リモートデータベース上のマスターテーブルを読み込むことで、リモートで実行されているData Pumpジョブにアタッチする場合に使用します。
- 書式:
MASTER_LINK=remote_master_db_link - 注意点: 高度な使用法であり、通常はローカルのマスターテーブルを使用します。
トランスポータブル表領域関連オプション
これらのオプションは、トランスポータブル表領域機能を使用して表領域単位で高速にデータを移行する場合に使用します。
-
TRANSPORT_TABLESPACES=<表領域名>[, 表領域名2, ...]- 機能: ダンプファイルに含まれる指定された表領域のメタデータをインポートします。このオプションを使用する場合、対応する表領域のデータファイルもインポート先データベースにコピーされている必要があります。データファイルの物理コピーとメタデータのインポートを組み合わせることで、非常に大きな表領域でも短時間で移行できます。
- 書式:
TRANSPORT_TABLESPACES=sales_data,sales_index - 注意点:
- インポート元の表領域はREAD ONLYモードになっている必要があります。
- 対応するデータファイルは、インポート先のデータベースサーバーの所定の場所にコピーされている必要があります。
- インポート元のデータベースとインポート先のデータベース間で、OSやOracleのバージョンに互換性がある必要があります。
TRANSPORT_FULL_CHECK=YESで互換性を確認できます。 - このオプションは
FULL=YやSCHEMAS、TABLESオプションとは同時に使用できません。
- 例:
bash
impdp system/manager as sysdba DIRECTORY=dp_dir DUMPFILE=tsp_sales.dmp TRANSPORT_TABLESPACES=sales_data,sales_index LOGFILE=impdp_tsp_sales.log
impdp オプションの使用例
いくつかの典型的な使用シナリオにおけるimpdpコマンドの使用例を示します。
1. スキーマ単位のインポート
hrスキーマをバックアップからリストア(または他のデータベースにコピー)。
“`bash
事前にダンプファイルをディレクトリに配置しておく
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_backup_2023.dmp SCHEMAS=hr LOGFILE=impdp_hr_restore.log
もしhrスキーマが既に存在し、置き換えたい場合
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_backup_2023.dmp SCHEMAS=hr TABLE_EXISTS_ACTION=REPLACE LOGFILE=impdp_hr_replace.log
“`
2. 特定のテーブルのみインポート
salesスキーマのordersテーブルとorder_itemsテーブルのみをリストア。
“`bash
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=sales_backup.dmp TABLES=sales.orders,sales.order_items LOGFILE=impdp_sales_orders.log
既存テーブルにデータを追記する場合
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=sales_daily_updates.dmp TABLES=sales.orders CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND LOGFILE=impdp_sales_orders_append.log
“`
3. 異なるスキーマ/表領域へのリマップ
hrスキーマのデータを、インポート先データベースのhr_testスキーマ、かつusers_test表領域にインポート。
“`bash
事前にターゲットスキーマ(hr_test)とターゲット表領域(users_test)を作成しておく
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_backup.dmp SCHEMAS=hr REMAP_SCHEMA=hr:hr_test REMAP_TABLESPACE=users:users_test LOGFILE=impdp_hr_remap.log
“`
4. 特定のオブジェクトを除外/包含
データベース全体のバックアップから、特定のスキーマ(test_schema)を除外してインポート。
bash
impdp system/manager@orcl as sysdba DIRECTORY=DATA_PUMP_DIR DUMPFILE=full_backup.dmp FULL=YES EXCLUDE=SCHEMA:test_schema LOGFILE=impdp_full_no_test.log
salesスキーマのバックアップから、ordersテーブルのみをインポート(他のテーブルは無視)。
bash
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=sales_backup.dmp SCHEMAS=sales INCLUDE=TABLE:orders LOGFILE=impdp_sales_only_orders.log
5. データのみ/メタデータのみのインポート
hrスキーマのテーブル定義のみをコピー(データはコピーしない)。
bash
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_backup.dmp SCHEMAS=hr REMAP_SCHEMA=hr:hr_meta_only CONTENT=METADATA_ONLY LOGFILE=impdp_hr_metadata_only.log
既存の空のテーブルにデータをロード。
bash
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=sales_data_export.dmp TABLES=sales.sales_transactions CONTENT=DATA_ONLY TABLE_EXISTS_ACTION=APPEND LOGFILE=impdp_sales_data_only.log
6. 並列インポート
複数のダンプファイル(full_backup_01.dmp, full_backup_02.dmp, …)を並列度4でインポート。
bash
impdp system/manager@orcl as sysdba DIRECTORY=DATA_PUMP_DIR DUMPFILE=full_backup_%U.dmp FULL=YES PARALLEL=4 LOGFILE=impdp_full_parallel.log
7. トランスポータブル表領域インポート
sales_data_tsとsales_index_ts表領域をトランスポータブル方式で移行。
“`bash
事前にデータファイルをインポート先サーバーにコピーし、表領域をREAD ONLYにする
事前にターゲットデータベースにデータファイルを配置しておく
impdp system/manager@orcl as sysdba DIRECTORY=DATA_PUMP_DIR DUMPFILE=tsp_sales.dmp TRANSPORT_TABLESPACES=sales_data_ts,sales_index_ts LOGFILE=impdp_tsp_sales.log
“`
8. SQLFILEによるDDL出力
hrスキーマのオブジェクト作成DDLを確認したい場合。
bash
impdp system/manager@orcl DIRECTORY=DATA_PUMP_DIR DUMPFILE=hr_backup.dmp SCHEMAS=hr SQLFILE=hr_schema_ddl.sql LOGFILE=impdp_hr_sqlfile.log
このコマンドはインポートを実行せず、hr_schema_ddl.sqlファイルにDDLが出力されます。
パフォーマンスチューニング
大規模なデータをインポートする場合、パフォーマンスは重要な考慮事項です。以下の点に注意することで、インポート時間を短縮できる可能性があります。
PARALLELオプションの活用: システムのリソース(CPU、I/O、メモリ)が許す限り、適切な並列度を指定します。expdpがPARALLELを使用して複数のダンプファイルを生成した場合、impdpも同等以上の並列度で読み込むと効率的です。DIRECTORYのI/O性能: ダンプファイルが格納されているディレクトリのI/O性能は、インポート速度に直結します。高速なディスク(SSDなど)を使用したり、I/O競合の少ない場所に配置したりすることが望ましいです。- データベース側の設定: インポート先のデータベースのパフォーマンス設定も影響します。
- REDOログ: 大量のデータ挿入はREDOログの生成を伴います。高速なREDOログディスクや十分なREDOログサイズが重要です。
- UNDOセグメント: データ挿入やTRUNCATEなどの操作でUNDOが生成されます。十分なUNDO表領域があるか確認します。
- バッファキャッシュ: データ読み込みやインデックス作成に使用されるバッファキャッシュが適切に設定されているかも影響します。
TABLE_EXISTS_ACTIONの選択:- 既存データをクリアしてロードする場合、
TRUNCATEはREPLACE(DROP/CREATE)よりも一般的に高速です(特に大きなテーブルの場合)。ただし、TRUNCATEはロールバックできません。
- 既存データをクリアしてロードする場合、
- 制約とインデックスの無効化/再有効化: 大量のデータロードの場合、インポート時に
TRANSFORM=CONSTRAINTS:N,INDEXES:Nなどを使用して制約とインデックスを無効化し、データロード完了後にALTER TABLE … ENABLE CONSTRAINT … や ALTER INDEX … REBUILD/VALIDATE STRUCTUREなどのコマンドで手動で有効化/再作成する方が、インポート処理全体が速くなる場合があります。これは、データ挿入のたびにインデックスが更新されたり、制約がチェックされたりするオーバーヘッドを避けるためです。 - ネットワークの帯域幅と遅延:
NETWORK_LINKを使用する場合、データベースリンク間のネットワーク性能がボトルネックになり得ます。
注意点とトラブルシューティング
impdpの実行中に発生しうる一般的な問題とその対処法について説明します。
-
権限不足:
SYSDBA接続が必要な操作(FULL=YES、PARALLELなど)に、権限のないユーザーで接続している。- Data Pumpユーザーに
DATAPUMP_IMP_FULL_DATABASEロール(または必要なスキーマ/オブジェクトに対するインポート権限)がない。 - ディレクトリオブジェクトに対する
READ権限がない(ログファイル作成の場合はWRITEも)。 - 対処: 適切な権限を持つユーザーで接続し直すか、ユーザーに必要な権限を付与します。
-
ディレクトリオブジェクトの存在と権限:
DIRECTORYオプションで指定したディレクトリオブジェクトが存在しない。- ディレクトリオブジェクトが指すOS上のパスが存在しない、またはデータベースプロセスからアクセスできない。
- 対処:
CREATE DIRECTORYコマンドでディレクトリオブジェクトを作成します。OS上でパスが存在し、OracleソフトウェアのOSユーザーがそのパスに対する読み書き権限を持っていることを確認します。データベースユーザーにGRANT READ, WRITE ON DIRECTORY <ディレクトリ名> TO <ユーザー名>;を実行します。
-
表領域不足:
- インポート先の表領域に、インポートするデータを格納する十分な空き容量がない。
- インポート先データベースに、エクスポート元の表領域と同じ名前の表領域が存在しない(
REMAP_TABLESPACEを使用しない場合)。 - 対処: 関連する表領域にデータファイルを新規追加したり、既存のデータファイルをリサイズしたりして、空き容量を増やします。必要であれば、
REMAP_TABLESPACEオプションを使用して別の表領域にリマップします。
-
文字コードの問題:
- エクスポート元のデータベースとインポート先のデータベースでデータベース文字セットが異なる場合、データ変換でエラーが発生したり、文字化けしたりする可能性があります。
- 対処: 可能な限り、同じデータベース文字セットのデータベース間でData Pumpを使用することが望ましいです。異なる場合は、インポート先のデータベース文字セットがエクスポート元文字セットの上位互換であるか確認します(例: JA16SJISからAL32UTF8への移行は比較的容易ですが、逆は困難)。文字セット変換によるデータ損失やエラーに注意が必要です。NLS_LANG環境変数も関係する場合があります。
-
バージョン互換性:
- 古いバージョンのOracleからエクスポートしたダンプファイルを、新しいバージョンにインポートすることは一般的に可能ですが、その逆(新しいバージョンから古いバージョンへのインポート)はサポートされていない場合や、
VERSIONオプションで互換性のあるバージョンを指定する必要がある場合があります。 - 対処: Oracleのドキュメントで、使用しているバージョン間のData Pump互換性マトリクスを確認します。必要に応じて
VERSION=COMPATIBLEまたは特定のバージョンを指定します。
- 古いバージョンのOracleからエクスポートしたダンプファイルを、新しいバージョンにインポートすることは一般的に可能ですが、その逆(新しいバージョンから古いバージョンへのインポート)はサポートされていない場合や、
-
マスターテーブルの確認:
- Data Pumpジョブは内部的にマスターテーブルを使用して状態を管理します。何らかの理由でジョブが異常終了した場合、マスターテーブルが残ることがあります。
- 対処:
user_datapump_jobsまたはdba_datapump_jobsビューで実行中のジョブや残っているジョブを確認できます。不要なジョブが残っている場合は、impdpプロンプトでSTOP_JOB=IMMEDIATEコマンドを使用するか、DBMS_DATAPUMP.STOP_JOBプロシージャを使用してクリーンアップできます。
-
インポート実行中の進捗確認と制御:
impdpコマンドを実行した後、プロンプトに”^C”(Ctrl+C)を入力すると、Data Pumpプロンプト(Import>)が表示されます。ここでSTATUSコマンドで進捗を確認したり、STOP_JOBやKILL_JOBコマンドでジョブを停止したりできます。- 対処: 実行中のジョブ名を確認し(指定していなければ自動生成された名前)、必要に応じて
ATTACH=job_nameでアタッチして制御します。
まとめ
この記事では、Oracle Data Pumpのインポートユーティリティであるimpdpコマンドについて、その基本的な役割から、接続、インポート制御、オブジェクト変換、並行処理、ログ、エラー処理、トランスポータブル表領域に関連する主要なオプションまでを網羅的に解説しました。
impdpは、単にダンプファイルをデータベースに戻すだけでなく、スキーマや表領域のリマップ、特定のオブジェクトのフィルタリング、データのみやメタデータのみのロード、既存データの扱い方の指定、並列処理による高速化など、非常に多くのカスタマイズが可能です。これらのオプションを理解し、適切に使い分けることで、様々なインポート要件に柔軟かつ効率的に対応できます。
ダンプファイルの場所を指定するDIRECTORYとDUMPFILE、インポート範囲を指定するSCHEMAS、TABLES、FULL、EXCLUDE、INCLUDE、内容を指定するCONTENT、そして最も頻繁に調整が必要になるであろうREMAP_SCHEMA、REMAP_TABLESPACE、TRANSFORM、TABLE_EXISTS_ACTION、PARALLELといったオプションは特に重要です。また、問題発生時のためにLOGFILEオプションは常に指定することを強く推奨します。
Data PumpはOracleデータベース管理において非常に強力なツールです。この記事が、impdpオプションをより深く理解し、日々の運用や移行作業に役立てていただく一助となれば幸いです。さらに詳細な情報や特定のシナリオについては、必ずOracleの公式ドキュメントを参照してください。