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取得 |
- テーブル構造は変えずにデータだけリフレッシュしたい
- 移行先のスキーマがすでに存在していて、データだけ流し込む
- 本番→ステージング/テスト環境へのデータコピー
基本構文: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相当 |
デフォルトの
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
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
エラーを無視して進むため、データの整合性が崩れる可能性があります。テスト環境での調査目的以外では使用しないことを推奨します。
スキーマ全体のデータを一括インポート
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
メタデータが含まれないため、ファイルサイズが 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
- ダンプファイルの作成・転送が不要なため手順が簡素化
- ディスク容量を消費しない
- 本番→テスト環境のデータ同期を直接実行できる
注意:ネットワーク経由のため、大量データは時間がかかる場合があります。
インポート進捗の確認方法
大量データのインポート中は別セッションで進捗を監視できます。
-- 実行中の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 |
よくある質問
content=data_only はデータ(行)のみを対象とするため、インデックス・制約・トリガーなどのメタデータは変更されません。ただし、APPEND でインポートした場合に制約違反のデータがあると ORA-02291 等のエラーが発生します。content=all(デフォルト)でエクスポートしたダンプファイルに対して、impdp で content=data_only を指定してデータだけインポートすることができます。まとめ
content=data_onlyでデータ(行)のみをインポート。テーブル定義・制約・インデックスは変更しない- デフォルトの
table_exists_action=SKIPはデータが入らないため、必ずAPPENDかTRUNCATEを指定する - 完全入れ替えは
TRUNCATE、差分追加はAPPENDを使い分ける network_linkでダンプファイル不要のリモートDB直接インポートが可能- 外部キー制約がある場合は親テーブルを先にインポートするか、制約を一時 DISABLE する

