【Oracle】Data Pump で部分的にインポートする方法|tables・QUERY・EXCLUDE・INCLUDE・sqlfile・組み合わせパターンまで解説

【Oracle】Data Pump で部分的にインポートする方法|tables・QUERY・EXCLUDE・INCLUDE・sqlfile・組み合わせパターンまで解説 Oracle

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= インポートするテーブル 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=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 で内容を確認する習慣をつけると、「意図しないオブジェクトが上書きされた」というトラブルを防げます。特に他スキーマのダンプをインポートする場合は必須の確認手順です。

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 でテーブルが存在しない場合はどうなりますか?
ADATA_ONLY は CREATE TABLE を実行しないため、テーブルが存在しなければエラーになります。テーブルが存在することを事前に確認するか、まず content=METADATA_ONLY でテーブルを作成してからcontent=DATA_ONLY でデータを投入してください。
Q.dmp に含まれるテーブル一覧を確認するには?
Asqlfile パラメータを使います。impdp ... sqlfile=check.sql を実行すると、実際にはインポートせず DDL が SQL ファイルに出力されます。その中の CREATE TABLE 文を確認すれば、含まれるテーブルがわかります。
QREMAP_DATA で全列をマスキングできますか?
Aはい。列ごとに個別の関数を指定できます。
remap_data=TABLE.COL1:func1
remap_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 句を使う方法」も併せて参照してください。