【Oracle】impdpでデータだけをインポートする方法完全ガイド|content=data_only・table_exists_action・スキーマ全体・エラー対処まで

【Oracle】impdpでデータだけをインポートする方法|content=data_onlyの使い方 Oracle

Oracle の Data Pump(impdp)では、content=data_only を指定することで、テーブル定義・制約・インデックスなどのメタデータを一切変更せずに、データ(行)だけをインポートできます。

本番DBのテーブル構造を保ったままデータを入れ替えたい場面、テスト環境のデータをリフレッシュしたい場面など、実務でよく使うシナリオを想定して解説します。

この記事でわかること

  • content パラメータの3つの値(ALL/DATA_ONLY/METADATA_ONLY)の違い
  • content=data_only の基本構文と使い方
  • table_exists_action(APPEND/TRUNCATE/REPLACE)との組み合わせ
  • スキーマ全体・複数テーブルのデータ一括インポート
  • network_link を使ったダンプファイル不要のリモートDBインポート
  • ORA-39166・ORA-02291 等のよくあるエラーと対処法
スポンサーリンク

content パラメータの3つの値

impdp / expdp の content パラメータでは、対象となるデータの種類を指定します。

対象 主な用途
ALL(デフォルト) データ + メタデータ(テーブル定義・制約・インデックス等) 通常のバックアップ・リストア
DATA_ONLY データ(行)のみ。メタデータは対象外 データ入れ替え・追記・テスト環境リフレッシュ
METADATA_ONLY メタデータのみ。データは対象外 スキーマコピー・DDL取得
data_only を使う主なシナリオ

  • テーブル構造は変えずにデータだけリフレッシュしたい
  • 移行先のスキーマがすでに存在していて、データだけ流し込む
  • 本番→ステージング/テスト環境へのデータコピー

基本構文:content=data_only

impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=data_only
前提:対象テーブルが存在していること
content=data_only は既存テーブルへのデータ追加・置換を行います。テーブルが存在しない場合は ORA-39166 エラーになります。テーブルをまだ作っていない場合は先に content=metadata_only でテーブル定義だけインポートしてください。

特定テーブルにデータをインポート

tables パラメータと組み合わせて特定テーブルだけデータをインポートします。

-- 単一テーブル
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  tables=scott.emp \
  content=data_only \
  table_exists_action=append
-- 複数テーブル(カンマ区切り)
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  tables=scott.emp,scott.dept \
  content=data_only \
  table_exists_action=truncate

table_exists_action との組み合わせ【重要】

content=data_only 使用時に table_exists_action の選択が重要です。

table_exists_action 動作 data_only での使用可否
SKIP(デフォルト) テーブルが存在するとスキップ × データが挿入されない
APPEND 既存データを残して追記
TRUNCATE 既存データを削除してから全件挿入
REPLACE テーブルを削除して再作成してからデータ挿入 △ data_onlyでは実質TRUNCATE相当
SKIP は data_only では使えない
デフォルトの table_exists_action=skip は「テーブルが存在する場合はスキップ」という意味です。content=data_only の場合、ほぼ確実にテーブルが存在するため、データが一切挿入されません。必ず APPEND または TRUNCATE を明示指定してください。

APPEND:差分追加

既存データを残したまま新しいデータを追記します。主キー重複エラーが起きる可能性があります。

impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=data_only \
  table_exists_action=append

TRUNCATE:完全入れ替え

既存データをすべて削除してから新しいデータを挿入します。データ入れ替え時に最もよく使います。

impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=data_only \
  table_exists_action=truncate
TRUNCATE はコミット不要で高速
impdp の table_exists_action=truncate は DDL の TRUNCATE を使うため、DELETE より高速でロールバックセグメントも消費しません。大量データの入れ替えに適しています。

data_options=skip_constraint_errors

制約違反のある行をスキップしてインポートを続行できますが、本番での使用は原則避けてください。

impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=data_only \
  table_exists_action=append \
  data_options=skip_constraint_errors
data_options=skip_constraint_errors の注意点
エラーを無視して進むため、データの整合性が崩れる可能性があります。テスト環境での調査目的以外では使用しないことを推奨します。

スキーマ全体のデータを一括インポート

schemas パラメータで、スキーマ内の全テーブルデータを一括インポートできます。

-- scott スキーマの全テーブルデータを入れ替え
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=full_export.dmp \
  schemas=scott \
  content=data_only \
  table_exists_action=truncate
-- パラメータファイルを使う場合(parfile.par)
-- parfile.par の内容:
-- directory=DATA_PUMP_DIR
-- dumpfile=full_export.dmp
-- schemas=scott
-- content=data_only
-- table_exists_action=truncate
impdp system/password parfile=parfile.par

expdp 側でも content=data_only を使う

エクスポート時にも content=data_only を指定すると、ダンプファイルサイズを大幅に削減できます。

-- エクスポート: データのみ(テーブル定義なし)
expdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=data_only.dmp \
  schemas=scott \
  content=data_only
data_only のダンプファイルは小さい
メタデータが含まれないため、ファイルサイズが ALL の場合より大幅に小さくなります。バックアップ頻度を増やしたい場合や転送コストを下げたい場合に有効です。

network_link を使ったリモートDB直接インポート

データベースリンクを使うと、ダンプファイルを作成せずにリモートDBから直接データをインポートできます。

-- 1. データベースリンクを作成(インポート先DBで実行)
CREATE DATABASE LINK src_db
  CONNECT TO scott IDENTIFIED BY tiger
  USING 'source_db';
-- 2. network_link で直接インポート(ダンプファイル不要)
impdp system/password \
  network_link=src_db \
  schemas=scott \
  content=data_only \
  table_exists_action=truncate
-- 3. 特定テーブルのみ
impdp system/password \
  network_link=src_db \
  tables=scott.emp,scott.dept \
  content=data_only \
  table_exists_action=append
network_link のメリット

  • ダンプファイルの作成・転送が不要なため手順が簡素化
  • ディスク容量を消費しない
  • 本番→テスト環境のデータ同期を直接実行できる

注意:ネットワーク経由のため、大量データは時間がかかる場合があります。

インポート進捗の確認方法

大量データのインポート中は別セッションで進捗を監視できます。

-- 実行中のData Pumpジョブを確認
SELECT job_name, state, degree
FROM dba_datapump_jobs
WHERE state = 'EXECUTING';
-- Data Pump ジョブの詳細な進捗確認
SELECT owner_name, job_name, operation, job_mode,
       state, degree, attached_sessions
FROM dba_datapump_jobs;
-- impdp の attach モードで進捗確認
impdp system/password attach=SYS_IMPORT_SCHEMA_01
-- Data Pump Interactive >
status

よくあるエラーと対処法

ORA-39166:オブジェクトが見つからない

ORA-39166: Object "SCOTT"."EMP" was not found.

インポート対象のテーブルが存在しない場合に発生します。

-- 対処: metadata_only でテーブル定義を先にインポート
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  schemas=scott \
  content=metadata_only

-- その後 data_only でデータをインポート
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  schemas=scott \
  content=data_only \
  table_exists_action=append

ORA-02291:外部キー制約違反

ORA-02291: integrity constraint (SCOTT.FK_EMP_DEPT) violated - parent key not found

親テーブルより先に子テーブルにデータをインポートしようとした場合に発生します。

-- 対処1: テーブルの順序を制御(親テーブルを先にインポート)
impdp system/password \
  tables=scott.dept content=data_only table_exists_action=truncate

impdp system/password \
  tables=scott.emp content=data_only table_exists_action=truncate
-- 対処2: インポート中だけ制約を無効化
ALTER TABLE scott.emp DISABLE CONSTRAINT FK_EMP_DEPT;

impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=data_only \
  table_exists_action=truncate

ALTER TABLE scott.emp ENABLE CONSTRAINT FK_EMP_DEPT;

table_exists_action=SKIP でデータが入らない

最もよくあるミス
table_exists_action を省略するとデフォルトの SKIP が使われます。content=data_only の場合はほぼ必ずテーブルが存在するため、すべてスキップされてしまいます。エラーも出ないため気づきにくい点に注意してください。必ず APPEND または TRUNCATE を指定してください。

ORA-31684:オブジェクトが既に存在する

ORA-31684: Object type TABLE:"SCOTT"."EMP" already exists

メタデータのインポート時に既存テーブルと衝突します。content=data_only では発生しません。

-- 対処: table_exists_action を指定(content=all の場合)
impdp system/password \
  directory=DATA_PUMP_DIR \
  dumpfile=export.dmp \
  content=all \
  table_exists_action=replace

実務でよく使うコマンドまとめ

用途 コマンド例 table_exists_action
特定テーブルのデータ追記 tables=scott.emp content=data_only APPEND
特定テーブルのデータ入れ替え tables=scott.emp content=data_only TRUNCATE
スキーマ全体のデータリフレッシュ schemas=scott content=data_only TRUNCATE
リモートDB直接コピー network_link=src_db content=data_only TRUNCATE
制約違反を無視してインポート content=data_only data_options=skip_constraint_errors APPEND

よくある質問

Q. content=data_only を使うと INDEX や CONSTRAINT は影響を受けますか?
A. 影響を受けません。content=data_only はデータ(行)のみを対象とするため、インデックス・制約・トリガーなどのメタデータは変更されません。ただし、APPEND でインポートした場合に制約違反のデータがあると ORA-02291 等のエラーが発生します。
Q. TRUNCATE してから INSERT するのと table_exists_action=TRUNCATE の違いは何ですか?
A. 動作は同じですが、impdp の TRUNCATE は DDL として実行されるため、ロールバックセグメントを消費しません。大量データの入れ替えでは impdp の TRUNCATE の方が高速で、undo 領域の枯渇リスクも低いです。
Q. 外部キー制約があるテーブルの安全なインポート手順は?
A. ①親テーブルを先にインポート(またはインポート前に制約を DISABLE)→ ②子テーブルをインポート → ③制約を ENABLE → ④制約の整合性チェック(VALIDATE CONSTRAINT)の順が安全です。
Q. data_options=skip_constraint_errors は本番で使っていいですか?
A. 原則として使用しないことを推奨します。制約違反の行がサイレントにスキップされるため、インポート後のデータが不整合な状態になる可能性があります。使うとしても、スキップされた行数をログで必ず確認してください。
Q. expdp と impdp の content は独立して指定できますか?
A. はい、独立しています。expdp で content=all(デフォルト)でエクスポートしたダンプファイルに対して、impdp で content=data_only を指定してデータだけインポートすることができます。

まとめ

content=data_only のポイント

  • content=data_only でデータ(行)のみをインポート。テーブル定義・制約・インデックスは変更しない
  • デフォルトの table_exists_action=SKIP はデータが入らないため、必ず APPENDTRUNCATE を指定する
  • 完全入れ替えは TRUNCATE、差分追加は APPEND を使い分ける
  • network_link でダンプファイル不要のリモートDB直接インポートが可能
  • 外部キー制約がある場合は親テーブルを先にインポートするか、制約を一時 DISABLE する

あわせて読みたい