Data Pump のダンプファイル(.dmp)にはスキーマやテーブルの全データが格納されていますが、インポート時に全部を取り込む必要はありません。「特定テーブルだけ」「2025年以降のデータだけ」「テーブル構造だけ」など、必要な部分だけをインポートできるのが impdp の強みです。
本記事では、impdp で部分インポートを実現する全テクニックを整理し、テーブル指定(tables=)、WHERE 条件(QUERY)、オブジェクト種別の選択(EXCLUDE / INCLUDE)、データだけ / DDL だけ(content)、sqlfile による事前確認、そして組み合わせパターンまで解説します。
この記事でわかること
・tables= で特定テーブルだけインポートする方法
・QUERY で WHERE 条件を指定して行をフィルタする方法
・EXCLUDE / INCLUDE でオブジェクト種別を選択する方法
・content=DATA_ONLY / METADATA_ONLY でデータだけ / DDL だけインポート
・sqlfile で .dmp の内容を事前確認する方法
・REMAP_DATA でインポート時にデータをマスキングする方法
・これらを組み合わせた実務パターン
・tables= で特定テーブルだけインポートする方法
・QUERY で WHERE 条件を指定して行をフィルタする方法
・EXCLUDE / INCLUDE でオブジェクト種別を選択する方法
・content=DATA_ONLY / METADATA_ONLY でデータだけ / DDL だけインポート
・sqlfile で .dmp の内容を事前確認する方法
・REMAP_DATA でインポート時にデータをマスキングする方法
・これらを組み合わせた実務パターン
部分インポートの全テクニック一覧
| テクニック | パラメータ | 絞り込む対象 | 例 |
|---|---|---|---|
| テーブル指定 | tables= | インポートするテーブル | tables=HR.EMPLOYEES,HR.DEPARTMENTS |
| スキーマ指定 | schemas= | インポートするスキーマ | schemas=HR |
| 行フィルタ(WHERE) | query= | テーブル内の特定行 | query=HR.EMPLOYEES:”WHERE salary>5000″ |
| オブジェクト除外 | exclude= | 除外するオブジェクト種別 | exclude=INDEX,TRIGGER |
| オブジェクト限定 | include= | 含めるオブジェクト種別 | include=TABLE |
| 内容の種別 | content= | データ / DDL / 両方 | content=DATA_ONLY |
| 事前確認 | sqlfile= | 実際にはインポートせずDDLを出力 | sqlfile=check.sql |
| データ変換 | remap_data= | インポート時に列値を変換 | remap_data=HR.EMPLOYEES.EMAIL:mask_email |
tables= で特定テーブルだけインポート
Shell(特定テーブルのインポート)
# スキーマダンプから EMPLOYEES テーブルだけインポート
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
logfile=emp_only.log \
tables=HR.EMPLOYEES
# 複数テーブルを指定
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
logfile=multi_table.log \
tables=HR.EMPLOYEES,HR.DEPARTMENTS,HR.JOBS
# table_exists_action と組み合わせ
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
tables=HR.EMPLOYEES \
table_exists_action=REPLACE
スキーマ全体のダンプからテーブル単位で取り出せる
expdp schemas=HR で取得したダンプに対して、impdp tables=HR.EMPLOYEES で特定テーブルだけインポートできます。ダンプの取得単位(スキーマ / フル)とインポートの単位は一致しなくて構いません。QUERY で行をフィルタ(WHERE 条件)
QUERY パラメータで WHERE 条件を指定すると、条件に一致する行だけをインポートできます。大量データのダンプから一部期間のデータだけを取り出す場合に有用です。
Shell(QUERY パラメータ: コマンドライン)
# salary が 5000 以上の行だけインポート
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
tables=HR.EMPLOYEES \
query=HR.EMPLOYEES:\"WHERE salary >= 5000\"
# 日付条件で 2025 年以降のデータだけインポート
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
tables=HR.ORDERS \
query=HR.ORDERS:\"WHERE order_date >= TO_DATE('2025-01-01','YYYY-MM-DD')\"
parfile(QUERY を parfile に記述: クォート問題の回避)
# import_filtered.par directory=DP_DIR dumpfile=hr_schema.dmp logfile=filtered_import.log tables=HR.EMPLOYEES query=HR.EMPLOYEES:"WHERE salary >= 5000 AND department_id = 20"
Shell(parfile で実行)
impdp hr/password parfile=import_filtered.par
QUERY のクォート問題
コマンドラインで QUERY を指定する場合、OS のシェルとの間でクォートが衝突しやすく、エラーの原因になります。parfile に記述するのが最も安全です。parfile なら
コマンドラインで QUERY を指定する場合、OS のシェルとの間でクォートが衝突しやすく、エラーの原因になります。parfile に記述するのが最も安全です。parfile なら
query=TABLE:"WHERE condition" とシンプルに書けます。テーブルごとに異なる QUERY
parfile(テーブル別の QUERY)
# multi_query.par
directory=DP_DIR
dumpfile=hr_schema.dmp
logfile=multi_query.log
tables=HR.EMPLOYEES,HR.ORDERS
query=HR.EMPLOYEES:"WHERE department_id = 20"
query=HR.ORDERS:"WHERE order_date >= TO_DATE('2025-01-01','YYYY-MM-DD')"
EXCLUDE / INCLUDE でオブジェクト種別を選択
Shell(EXCLUDE: 特定オブジェクトを除外)
# インデックスとトリガーを除外してインポート
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
schemas=HR \
exclude=INDEX \
exclude=TRIGGER
# 特定のテーブルだけ除外
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
schemas=HR \
exclude=TABLE:\"IN ('TEMP_LOG', 'AUDIT_OLD')\"
Shell(INCLUDE: 特定オブジェクトだけ含める)
# テーブルとシーケンスだけインポート(ビュー・プロシージャは除外)
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
schemas=HR \
include=TABLE \
include=SEQUENCE
| EXCLUDE / INCLUDE | 動作 | 使いどころ |
|---|---|---|
| exclude=INDEX | インデックスを除外 | インポート後に手動作成した方が速い場合 |
| exclude=TRIGGER | トリガーを除外 | データ投入中にトリガーを発火させたくない場合 |
| exclude=CONSTRAINT | 制約を除外 | 外部キー制約でインポートエラーが出る場合 |
| exclude=GRANT | 権限付与を除外 | 本番権限を検証環境に持ち込みたくない場合 |
| exclude=STATISTICS | 統計情報を除外 | インポート後に DBMS_STATS で再収集する場合 |
| include=TABLE | テーブルだけ含める | 構造 + データのみが必要な場合 |
content でデータ / DDL を分離する
| content 値 | 動作 | 組み合わせ例 |
|---|---|---|
| ALL(デフォルト) | DDL + データの両方 | 通常のインポート |
| DATA_ONLY | データだけ(CREATE TABLE 等は実行しない) | 既存テーブルにデータを投入(table_exists_action=APPEND/TRUNCATE と併用) |
| METADATA_ONLY | DDL だけ(データは投入しない) | 空テーブル群の作成 |
Shell(content の使用例)
# 既存テーブルにデータだけ追加
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
schemas=HR \
content=DATA_ONLY \
table_exists_action=APPEND
# テーブル構造だけコピー(空テーブル作成)
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
remap_schema=HR:TEST_HR \
content=METADATA_ONLY
sqlfile で事前確認する
sqlfile パラメータを指定すると、実際にはインポートせず、ダンプから生成される DDL を SQL ファイルに出力します。「このダンプに何が含まれているか」を事前に確認するのに使います。
Shell(sqlfile による事前確認)
# ダンプの内容を SQL ファイルに出力(インポートは実行されない)
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
sqlfile=check_contents.sql
# 特定テーブルの DDL だけ確認
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
tables=HR.EMPLOYEES \
sqlfile=emp_ddl.sql
# 出力された SQL ファイルを確認
# cat /oracle/dpdir/check_contents.sql
# → CREATE TABLE, CREATE INDEX, GRANT 等の DDL が出力される
sqlfile は「テスト実行」として必ず使う
本番インポート前に sqlfile で内容を確認する習慣をつけると、「意図しないオブジェクトが上書きされた」というトラブルを防げます。特に他スキーマのダンプをインポートする場合は必須の確認手順です。
本番インポート前に sqlfile で内容を確認する習慣をつけると、「意図しないオブジェクトが上書きされた」というトラブルを防げます。特に他スキーマのダンプをインポートする場合は必須の確認手順です。
REMAP_DATA でインポート時にデータを変換する
REMAP_DATA(12c 以降)を使うと、インポート時に列のデータを PL/SQL 関数で変換できます。検証環境にインポートする際の個人情報マスキングに使えます。
SQL(マスキング関数の作成)
-- メールアドレスをマスキングする関数
CREATE OR REPLACE FUNCTION mask_email(p_email VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN 'user' || DBMS_RANDOM.VALUE(1000, 9999) || '@masked.example.com';
END;
/
Shell(REMAP_DATA でインポート時にマスキング)
# email 列をマスキング関数で変換しながらインポート
impdp system/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
remap_schema=HR:TEST_HR \
remap_data=HR.EMPLOYEES.EMAIL:HR.mask_email
パラメータ組み合わせパターン集
パターン(1): 特定テーブルの2025年以降のデータだけ追加
parfile
directory=DP_DIR
dumpfile=hr_full.dmp
logfile=partial_import.log
tables=HR.ORDERS
content=DATA_ONLY
table_exists_action=APPEND
query=HR.ORDERS:"WHERE order_date >= TO_DATE('2025-01-01','YYYY-MM-DD')"
パターン(2): スキーマ全体を検証環境にコピー(インデックスとトリガーは除外)
parfile
directory=DP_DIR dumpfile=hr_schema.dmp logfile=test_import.log remap_schema=HR:TEST_HR remap_tablespace=USERS:TEST_TS exclude=INDEX exclude=TRIGGER exclude=STATISTICS table_exists_action=REPLACE
パターン(3): 空テーブル群を作成(データなし)
Shell
impdp system/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
remap_schema=HR:DEV_HR \
content=METADATA_ONLY
パターン(4): テーブル構造は維持してデータだけ入れ替え
Shell
impdp hr/password \
directory=DP_DIR \
dumpfile=hr_schema.dmp \
schemas=HR \
content=DATA_ONLY \
table_exists_action=TRUNCATE
パターン(5): 個人情報をマスキングして検証環境にインポート
parfile
directory=DP_DIR dumpfile=hr_schema.dmp logfile=masked_import.log remap_schema=HR:TEST_HR remap_tablespace=USERS:TEST_TS remap_data=HR.EMPLOYEES.EMAIL:HR.mask_email table_exists_action=REPLACE exclude=TRIGGER
よくあるエラーと対処
| エラー | 原因 | 対処法 |
|---|---|---|
| ORA-39166(テーブルが見つからない) | .dmp に指定テーブルが含まれていない | sqlfile で .dmp の内容を確認。テーブル名の大文字小文字にも注意 |
| ORA-31684(オブジェクトが既存) | table_exists_action=SKIP(デフォルト)でテーブルがスキップされた | REPLACE / APPEND / TRUNCATE を指定 |
| ORA-39095(QUERY構文エラー) | QUERY のクォートが不正 | parfile に記述してクォート問題を回避 |
| ORA-00001(主キー重複) | APPEND で既存行と重複 | table_exists_action=TRUNCATE に変更、またはQUERYで重複行を除外 |
よくある質問
Qスキーマ全体のダンプから特定テーブルだけインポートできますか?
Aはい。
expdp schemas=HR で取得したダンプに対して impdp tables=HR.EMPLOYEES で特定テーブルだけインポートできます。ダンプの取得単位とインポートの単位は一致しなくて構いません。full=y で取得したダンプからテーブルを取り出すことも可能です。QQUERY で複雑な条件(サブクエリなど)は使えますか?
AQUERY には単純な WHERE 条件のみ指定可能です。サブクエリ・結合・分析関数などは使えません。複雑な条件が必要な場合は、ダンプ全体をインポート後に DELETE で不要行を削除するか、別名テーブルにインポートしてから INSERT … SELECT で条件付きコピーしてください。
QEXCLUDE と INCLUDE は同時に使えますか?
A同時には使えません。EXCLUDE と INCLUDE は排他的で、1 つのインポートジョブにはどちらか一方だけ指定できます。「テーブル以外を全て除外」したい場合は
include=TABLE の方がシンプルです。Qcontent=DATA_ONLY でテーブルが存在しない場合はどうなりますか?
A
DATA_ONLY は CREATE TABLE を実行しないため、テーブルが存在しなければエラーになります。テーブルが存在することを事前に確認するか、まず content=METADATA_ONLY でテーブルを作成してからcontent=DATA_ONLY でデータを投入してください。Q.dmp に含まれるテーブル一覧を確認するには?
A
sqlfile パラメータを使います。impdp ... sqlfile=check.sql を実行すると、実際にはインポートせず DDL が SQL ファイルに出力されます。その中の CREATE TABLE 文を確認すれば、含まれるテーブルがわかります。QREMAP_DATA で全列をマスキングできますか?
Aはい。列ごとに個別の関数を指定できます。
ただし大量データではインポート速度が低下するため、必要最小限の列に絞ることを推奨します。
remap_data=TABLE.COL1:func1remap_data=TABLE.COL2:func2ただし大量データではインポート速度が低下するため、必要最小限の列に絞ることを推奨します。
まとめ
impdp の部分インポートテクニックをまとめます。
| やりたいこと | パラメータ |
|---|---|
| 特定テーブルだけインポート | tables=SCHEMA.TABLE1,SCHEMA.TABLE2 |
| 条件に一致する行だけインポート | query=TABLE:”WHERE condition”(parfile 推奨) |
| インデックスを除外 | exclude=INDEX |
| テーブルとシーケンスだけ含める | include=TABLE,SEQUENCE |
| データだけインポート(DDL なし) | content=DATA_ONLY |
| DDL だけ実行(データなし) | content=METADATA_ONLY |
| .dmp の内容を事前確認 | sqlfile=check.sql |
| インポート時にデータを変換(マスキング) | remap_data=TABLE.COL:function_name |
| テーブル別に異なる WHERE 条件 | parfile に複数の query= 行を記述 |
Data Pump の基本は「Data Pump の使い方完全ガイド」、テーブル単位のリストアは「指定テーブルのみリストアする方法」、expdp での WHERE 条件は「expdp で WHERE 句を使う方法」も併せて参照してください。

