【完全ガイド】Oracle Data Pump(expdp/impdp)の使い方|DIRECTORY・REMAP・PARALLEL・NETWORK_LINK まで徹底解説

【完全ガイド】Oracle Data Pump(expdp/impdp)の使い方|DIRECTORY・REMAP・PARALLEL・NETWORK_LINK まで徹底解説

Oracle の論理バックアップ・データ移行の標準ツールである Data Pump:

# エクスポート
expdp scott/tiger DIRECTORY=dp_dir DUMPFILE=scott.dmp SCHEMAS=SCOTT

# インポート(スキーマ名変更付き)
impdp system/password DIRECTORY=dp_dir DUMPFILE=scott.dmp REMAP_SCHEMA=SCOTT:HR

Oracle 10g で登場(2005年)、従来の exp/imp を置き換える形で発展してきました。Oracle 23ai でも中核ツールとして継続的に強化されており、DBA・開発者・データ移行担当者すべての必須スキル。

しかし、実際に使いこなそうとすると:

  • DIRECTORY オブジェクトの謎(なぜ必要?権限は?)
  • PAR ファイルと引数指定の使い分け
  • REMAP_SCHEMA / REMAP_TABLESPACE の使いどころ
  • PARALLEL の並列度の目安
  • NETWORK_LINK で dump ファイルなしで直接転送
  • CDB / PDB 環境での特殊事情
  • 本番の巨大 DB を止めずにエクスポート
  • table_exists_action の各値の意味
  • エクスポートは動くがインポートが失敗

これらの疑問と落とし穴が多く、「動くコマンドをコピペして終わり」では現場で通用しない。Data Pump は、正しく理解すればテラバイト級のデータ移行も高速に実行できる強力なツールですが、間違うと復旧不能なデータ破損を招くこともあります。

本記事では、Oracle Data Pump完全な使い方を、リファレンスとして実用的に整理します。DIRECTORY オブジェクトの作成、4つのモード(FULL/SCHEMA/TABLE/TABLESPACE)、主要パラメータ完全リファレンス、REMAP 系オプション、TABLE_EXISTS_ACTION、PARALLEL の並列化、NETWORK_LINK による直接転送、CDB/PDB 対応、実践シナリオ、モニタリング、トラブル対処、FAQまで完全網羅。この1本で Data Pump を業務レベルで使いこなせるようになります。


目次

結論:まず動かす最小構成

時間がない方向けに、最短の実行手順を先に示します。

前提1:DIRECTORY オブジェクト作成(DBA権限)

-- DBA で実行
CREATE OR REPLACE DIRECTORY dp_dir AS '/u01/dump_files';
GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;

-- OS 側でディレクトリ作成 & 権限
-- $ mkdir -p /u01/dump_files
-- $ chown oracle:oinstall /u01/dump_files

前提2:基本のエクスポート

# スキーマ全体をエクスポート
expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=scott.dmp \
  LOGFILE=scott.log \
  SCHEMAS=SCOTT

前提3:基本のインポート

# 別スキーマ HR にリマップしてインポート
impdp system/password \
  DIRECTORY=dp_dir \
  DUMPFILE=scott.dmp \
  LOGFILE=scott_imp.log \
  REMAP_SCHEMA=SCOTT:HR

覚えるべき Top 10 コマンド

# 1. FULL エクスポート(管理者)
expdp system/password FULL=Y DIRECTORY=dp_dir DUMPFILE=full.dmp

# 2. スキーマエクスポート
expdp scott/tiger SCHEMAS=SCOTT DIRECTORY=dp_dir DUMPFILE=scott.dmp

# 3. テーブルエクスポート
expdp scott/tiger TABLES=EMP,DEPT DIRECTORY=dp_dir DUMPFILE=tables.dmp

# 4. 条件付きエクスポート
expdp scott/tiger TABLES=EMP QUERY=\"WHERE deptno=10\" \
  DIRECTORY=dp_dir DUMPFILE=emp.dmp

# 5. 並列エクスポート
expdp scott/tiger SCHEMAS=SCOTT PARALLEL=4 \
  DUMPFILE=scott_%U.dmp DIRECTORY=dp_dir

# 6. スキーマ名変更でインポート
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_SCHEMA=SCOTT:HR

# 7. テーブルスペース変更
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_TABLESPACE=USERS:HR_TS

# 8. メタデータのみ(構造だけ)
expdp scott/tiger SCHEMAS=SCOTT CONTENT=METADATA_ONLY \
  DIRECTORY=dp_dir DUMPFILE=structure.dmp

# 9. ネットワーク経由(ダンプファイル不要)
impdp system/pw NETWORK_LINK=src_db \
  DIRECTORY=dp_dir SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:HR

# 10. 既存テーブル置換
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  TABLE_EXISTS_ACTION=REPLACE

詳細は以下で解説します。


Data Pump とは?従来 exp/imp との違い

歴史

  • Oracle 10g(2005年): Data Pump 登場
  • Oracle 11g: PARALLEL 強化
  • Oracle 12c: PDB 対応、拡張機能
  • Oracle 19c/21c/23ai: 継続的な機能強化

Oracle 10g 以降、exp/imp は Deprecated(非推奨)扱い。Oracle 21c で完全に削除。現代は Data Pump のみ

主な違い

観点従来 exp/impData Pump (expdp/impdp)
速度遅い高速(数十倍)
並列処理不可PARALLEL 対応
中断/再開不可対応
フィルタリング限定的INCLUDE/EXCLUDE 柔軟
ネットワーク転送不可NETWORK_LINK
ダンプ場所クライアントサーバー(DIRECTORY)
メタデータ変換不可REMAP、TRANSFORM
モニタリング不可V$SESSION_LONGOPS
圧縮不可COMPRESSION パラメータ

現代の Oracle では Data Pump 一択

アーキテクチャ

[ユーザー]
     ↓ expdp コマンド
[Oracle Server]
     ↓ DBMS_DATAPUMP パッケージ
     ↓ DBMS_METADATA でメタデータ取得
     ↓ ダイレクトパスまたは外部テーブル
[DIRECTORY オブジェクトが指す OSディレクトリ]
     ↓

[dump ファイル (.dmp) + log ファイル]

すべての I/O はサーバー側で行われるのがポイント。


前提:DIRECTORY オブジェクトの作成

なぜ必要か

Data Pump はサーバー上の OS ディレクトリにダンプファイルを書き込みます。セキュリティ上、任意のパスは指定できず、DIRECTORY オブジェクト経由でアクセスします。

作成手順

-- 1. OS 側でディレクトリ作成 (Oracle OS ユーザーで)
-- $ mkdir -p /u01/dump_files
-- $ chown oracle:oinstall /u01/dump_files
-- $ chmod 755 /u01/dump_files

-- 2. Oracle 内で DIRECTORY オブジェクト作成 (DBA権限)
CREATE OR REPLACE DIRECTORY dp_dir AS '/u01/dump_files';

-- 3. ユーザーに権限付与
GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;

-- 4. 確認
SELECT * FROM dba_directories WHERE directory_name = 'DP_DIR';

デフォルト DIRECTORY

Oracle は自動作成の DATA_PUMP_DIR を持っています:

SELECT directory_name, directory_path 
FROM dba_directories 
WHERE directory_name = 'DATA_PUMP_DIR';

一般的な場所:

  • Linux: /u01/app/oracle/admin/DB_NAME/dpdump/
  • Windows: C:\app\oracle\admin\DB_NAME\dpdump\

簡易利用なら DATA_PUMP_DIR で十分。本番運用は独自の DIRECTORY 推奨。

権限の付与

-- 特定ユーザー
GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;

-- ロール経由
GRANT READ, WRITE ON DIRECTORY dp_dir TO datapump_user_role;

-- 権限確認
SELECT grantee, privilege 
FROM dba_tab_privs 
WHERE table_name = 'DP_DIR';

権限系エラー

-- ORA-39002: invalid operation
-- ORA-31641: unable to create dump file
-- ORA-27054: NFS file system where the file is created or resides
-- ORA-39070: Unable to open the log file

これらは DIRECTORY 権限 or OS 権限の問題。詳細は Oracle 権限系エラーの記事も参照してください。


expdp(Export)の使い方

4つのモード

Data Pump には4つのエクスポートモード:

モード対象権限
FULLデータベース全体DATAPUMP_EXP_FULL_DATABASE
SCHEMAS特定スキーマ自分 or FULL権限
TABLES特定テーブル対象テーブル権限
TABLESPACES特定テーブルスペースFULL権限

FULL エクスポート

expdp system/password \
  DIRECTORY=dp_dir \
  DUMPFILE=full.dmp \
  LOGFILE=full.log \
  FULL=Y

データベース全体(システム系除く)。バックアップ用途。

SCHEMAS エクスポート

# 単一スキーマ
expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=scott.dmp \
  SCHEMAS=SCOTT

# 複数スキーマ
expdp system/password \
  DIRECTORY=dp_dir \
  DUMPFILE=multi.dmp \
  SCHEMAS=SCOTT,HR,SALES

TABLES エクスポート

# 単一テーブル
expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=emp.dmp \
  TABLES=EMP

# 複数テーブル
expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=tables.dmp \
  TABLES=EMP,DEPT,SALGRADE

# スキーマ跨ぎ
expdp system/pw \
  TABLES=SCOTT.EMP,HR.EMPLOYEES \
  DIRECTORY=dp_dir DUMPFILE=cross.dmp

TABLESPACES エクスポート

expdp system/password \
  DIRECTORY=dp_dir \
  DUMPFILE=ts_users.dmp \
  TABLESPACES=USERS

QUERY による条件抽出

expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=high_sal.dmp \
  TABLES=EMP \
  QUERY=SCOTT.EMP:\"WHERE sal > 3000\"

エスケープに注意(Linux はバックスラッシュ、Windows はダブルクォート)。

INCLUDE / EXCLUDE

# テーブルだけ含める
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=tables_only.dmp \
  SCHEMAS=SCOTT \
  INCLUDE=TABLE

# インデックスを除外
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=no_idx.dmp \
  SCHEMAS=SCOTT \
  EXCLUDE=INDEX

# 特定テーブルだけ
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=filtered.dmp \
  SCHEMAS=SCOTT \
  INCLUDE=TABLE:\"IN \('EMP','DEPT'\)\"

# 統計情報を除外
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=no_stats.dmp \
  SCHEMAS=SCOTT \
  EXCLUDE=STATISTICS

CONTENT による絞り込み

# メタデータのみ(構造だけ、データなし)
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=structure.dmp \
  SCHEMAS=SCOTT \
  CONTENT=METADATA_ONLY

# データのみ(構造なし)
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=data.dmp \
  SCHEMAS=SCOTT \
  CONTENT=DATA_ONLY

# デフォルト(両方)
CONTENT=ALL  -- 明示指定

並列 PARALLEL

expdp scott/tiger \
  DIRECTORY=dp_dir \
  DUMPFILE=scott_%U.dmp \
  LOGFILE=scott.log \
  SCHEMAS=SCOTT \
  PARALLEL=4
  • %U はワイルドカード(自動で 01, 02, 03… に置換)
  • PARALLEL の目安: CPU コア数の 1〜2倍
  • 並列で複数dumpファイルが生成される

COMPRESSION(圧縮)

expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  SCHEMAS=SCOTT \
  COMPRESSION=ALL
効果
METADATA_ONLYメタデータのみ圧縮(デフォルト)
DATA_ONLYデータのみ
ALL全部
NONE圧縮なし

Advanced Compression オプションが必要な場合あり。

ENCRYPTION(暗号化)

expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  SCHEMAS=SCOTT \
  ENCRYPTION=ALL \
  ENCRYPTION_PASSWORD=secret123

Advanced Security オプションが必要。

VERSION(互換性)

# 12c 互換の dump ファイル生成
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  SCHEMAS=SCOTT \
  VERSION=12.0

古い Oracle への移行時に必須。


impdp(Import)の使い方

基本形

impdp system/password \
  DIRECTORY=dp_dir \
  DUMPFILE=scott.dmp \
  LOGFILE=scott_imp.log

REMAP_SCHEMA(スキーマ名変更)

impdp system/password \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_SCHEMA=SCOTT:HR
  • 元のスキーマ SCOTT の内容を HR スキーマに移す
  • HR ユーザーが存在しなければ自動作成
  • パスワードは unusable になるので後で設定
-- 事後
ALTER USER hr IDENTIFIED BY new_password;

REMAP_TABLESPACE(テーブルスペース変更)

impdp system/password \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_TABLESPACE=USERS:HR_TS
  • 元は USERS テーブルスペース
  • HR_TS に配置し直す
  • ORA-00959: tablespace does not exist の予防

REMAP_TABLE(テーブル名変更)

impdp system/password \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  TABLES=EMP \
  REMAP_TABLE=SCOTT.EMP:EMPLOYEE_BAK

バックアップテーブル作成に便利。

複数 REMAP の組み合わせ

impdp system/password \
  DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_SCHEMA=SCOTT:HR \
  REMAP_TABLESPACE=USERS:HR_TS \
  REMAP_TABLE=SCOTT.EMP:EMPLOYEE

TABLE_EXISTS_ACTION

テーブルが既に存在する場合の動作:

動作
SKIP(デフォルト)スキップ
APPENDデータ追加
TRUNCATE既存データ削除→INSERT
REPLACEテーブル drop → 再作成
# 既存を置換
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  TABLE_EXISTS_ACTION=REPLACE

# データ追加
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  TABLE_EXISTS_ACTION=APPEND

# データだけリロード
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  TABLE_EXISTS_ACTION=TRUNCATE

部分インポート

# 特定スキーマだけ抽出
impdp system/pw DIRECTORY=dp_dir DUMPFILE=full.dmp \
  SCHEMAS=SCOTT

# 特定テーブルだけ
impdp system/pw DIRECTORY=dp_dir DUMPFILE=full.dmp \
  TABLES=SCOTT.EMP

# データのみ
impdp system/pw DIRECTORY=dp_dir DUMPFILE=full.dmp \
  CONTENT=DATA_ONLY

NETWORK_LINK(DB リンク経由の直接転送)

ダンプファイル不要でネットワーク経由で直接転送:

準備:Database Link

-- Target DB で(インポート先で作成)
CREATE DATABASE LINK src_db 
CONNECT TO scott IDENTIFIED BY tiger 
USING 'source_db_tns_name';

使い方

impdp system/password \
  DIRECTORY=dp_dir \
  NETWORK_LINK=src_db \
  SCHEMAS=SCOTT \
  REMAP_SCHEMA=SCOTT:HR \
  LOGFILE=network_import.log

動作:

  • ソース DB からデータを直接取得
  • dump ファイルは作成されない
  • log ファイルだけ書かれる

メリット

  • ディスク容量不要(ダンプファイルなし)
  • 転送 + インポートが1ステップ
  • 一時領域の削減

デメリット

  • ネットワーク帯域に依存
  • 中断すると最初から

大規模データには不向き

TB 級のデータには通常のダンプファイル方式が推奨。


PAR ファイル(パラメータファイル)

コマンドが長くなる場合、設定ファイル化:

作成

# scott_export.par
USERID=scott/tiger
DIRECTORY=dp_dir
DUMPFILE=scott_%U.dmp
LOGFILE=scott.log
SCHEMAS=SCOTT
PARALLEL=4
COMPRESSION=ALL

実行

expdp PARFILE=scott_export.par

メリット

  • コマンドが簡潔
  • バージョン管理可能
  • パスワード漏洩リスク軽減(PAR ファイルは適切なパーミッションで)
  • 特殊文字のエスケープ不要

インポート用 PAR

# scott_import.par
USERID=system/password
DIRECTORY=dp_dir
DUMPFILE=scott_%U.dmp
LOGFILE=scott_imp.log
REMAP_SCHEMA=SCOTT:HR
REMAP_TABLESPACE=USERS:HR_TS
TABLE_EXISTS_ACTION=REPLACE
PARALLEL=4

モニタリングと制御

V$SESSION_LONGOPS で進捗確認

SELECT 
  SID, 
  SERIAL#, 
  USERNAME, 
  CONTEXT, 
  SOFAR, 
  TOTALWORK,
  ROUND(SOFAR/TOTALWORK*100, 2) AS "%_COMPLETE"
FROM V$SESSION_LONGOPS 
WHERE TOTALWORK != 0 
  AND SOFAR <> TOTALWORK;

進捗率を確認可能。

アクティブジョブ確認

SELECT 
  owner_name, 
  job_name, 
  operation, 
  job_mode, 
  state, 
  degree
FROM dba_datapump_jobs 
WHERE state != 'NOT RUNNING';

インタラクティブモード

実行中の Data Pump に接続:

expdp scott/tiger ATTACH=SCOTT.SYS_EXPORT_SCHEMA_01

コマンド:

Export> status              # 状況表示
Export> stop_job            # 停止
Export> start_job           # 再開
Export> kill_job            # 完全キル
Export> parallel=8          # 並列度変更
Export> exit_client         # 切断(ジョブは継続)

巨大なエクスポートで並列度を動的に変更可能。


CDB / PDB 環境での対応

PDB からのエクスポート

# PDB 直接接続
expdp scott/tiger@//localhost:1521/PDB1 \
  DIRECTORY=dp_dir \
  DUMPFILE=pdb_scott.dmp \
  SCHEMAS=SCOTT

CDB レベルでの操作

-- CDB$ROOT で実行
ALTER SESSION SET CONTAINER = PDB1;

PDB 間コピー(NETWORK_LINK)

# PDB2 側で
CREATE DATABASE LINK pdb1_link 
CONNECT TO system IDENTIFIED BY pw
USING '//localhost:1521/PDB1';

impdp system/pw@//localhost:1521/PDB2 \
  NETWORK_LINK=pdb1_link \
  SCHEMAS=SCOTT \
  DIRECTORY=dp_dir

REMAP_DIRECTORY(12.2+)

PDB のデータファイルパスも変換:

impdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=pdb.dmp \
  REMAP_DIRECTORY=\"\'/u02/oradata/cdb1/pdb1/\':\'/u02/oradata/cdb3/pdb3/\'\"

実践シナリオ

シナリオ1:スキーマ全体の別 DB 移行

# ソース DB で
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=scott_full.dmp \
  LOGFILE=scott_full.log \
  SCHEMAS=SCOTT \
  COMPRESSION=ALL \
  PARALLEL=4

# ファイル転送
scp /u01/dump_files/scott_full*.dmp \
    target_server:/u01/dump_files/

# ターゲット DB で
impdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=scott_full.dmp \
  LOGFILE=scott_full_imp.log \
  REMAP_TABLESPACE=USERS:USERS_NEW \
  PARALLEL=4

ファイル転送関連の詳細は、scp vs rsync の記事、SSH host key verification failed の記事、Permission denied (publickey) の記事も参照してください。

シナリオ2:本番の1テーブルだけバックアップ

# 大きいテーブルのスナップショット
expdp scott/tiger \
  DIRECTORY=dp_dir DUMPFILE=emp_20260615.dmp \
  TABLES=EMP \
  QUERY=SCOTT.EMP:\"WHERE created_at < TO_DATE\('2026-06-15','YYYY-MM-DD'\)\" \
  PARALLEL=2

シナリオ3:開発 → 本番の構造だけ同期

# 構造のみエクスポート
expdp dev/dev \
  DIRECTORY=dp_dir DUMPFILE=structure.dmp \
  SCHEMAS=APP_SCHEMA \
  CONTENT=METADATA_ONLY

# 本番でインポート(テーブルは既にあるのでスキップ or REPLACE)
impdp prod/prod \
  DIRECTORY=dp_dir DUMPFILE=structure.dmp \
  TABLE_EXISTS_ACTION=SKIP \
  EXCLUDE=STATISTICS

シナリオ4:本番データを開発環境に取り込む

# 本番でスキーマエクスポート(データも)
expdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_scott.dmp \
  SCHEMAS=SCOTT \
  COMPRESSION=ALL

# 開発でリマップして投入
impdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_scott.dmp \
  REMAP_SCHEMA=SCOTT:SCOTT_DEV \
  REMAP_TABLESPACE=USERS:DEV_TS \
  TABLE_EXISTS_ACTION=REPLACE

シナリオ5:日次バックアップスクリプト

#!/bin/bash
# daily_export.sh
DATE=$(date +%Y%m%d_%H%M)
export ORACLE_SID=orcl
export ORACLE_HOME=/u01/app/oracle/product/19c/db_1
LOGFILE=/var/log/dp_$DATE.log

$ORACLE_HOME/bin/expdp system/pw \
  DIRECTORY=dp_dir \
  DUMPFILE=full_$DATE.dmp \
  LOGFILE=full_$DATE.log \
  FULL=Y \
  COMPRESSION=ALL \
  PARALLEL=4 \
  > $LOGFILE 2>&1

# 古いファイル削除(30日以上前)
find /u01/dump_files -name "full_*.dmp" -mtime +30 -delete

cron に登録:

0 2 * * * /path/to/daily_export.sh

Linux での crontab や cron の設定は、crontab 使い方の記事、Linux でプロセスをバックグラウンド実行する方法の記事も参照してください。

シナリオ6:NETWORK_LINK での DB 間コピー

-- ターゲット DB で DB リンク作成
CREATE DATABASE LINK prod_link 
CONNECT TO system IDENTIFIED BY password 
USING 'prod_db_tns';
# ダンプファイルなしで直接転送
impdp system/pw \
  NETWORK_LINK=prod_link \
  DIRECTORY=dp_dir \
  LOGFILE=network_imp.log \
  SCHEMAS=SCOTT \
  REMAP_SCHEMA=SCOTT:SCOTT_TEST \
  PARALLEL=2

シナリオ7:巨大 DB の並列エクスポート

# TB 級 DB を並列で
expdp system/pw \
  DIRECTORY=dp_dir \
  DUMPFILE=full_%U.dmp \
  LOGFILE=full_export.log \
  FULL=Y \
  PARALLEL=8 \
  COMPRESSION=ALL \
  FILESIZE=10G \
  ESTIMATE=STATISTICS
  • FILESIZE: 1ファイルの上限
  • ESTIMATE: 事前サイズ見積もり
  • PARALLEL=8: 8並列

シナリオ8:Rails 開発でのデータ複製

# 本番風データで開発
expdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_data.dmp \
  SCHEMAS=RAILS_APP \
  EXCLUDE=STATISTICS

# 個人情報マスキング後にインポート(別スキーマ)
impdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_data.dmp \
  REMAP_SCHEMA=RAILS_APP:RAILS_DEV \
  TABLE_EXISTS_ACTION=REPLACE

-- マスキング
UPDATE rails_dev.users SET email = 'user_' || id || '@example.com';

Rails でのデータベース操作関連は、rails db:migrate 使い方の記事、Rails 8 アップグレードガイドの記事、find/find_by/where 違いの記事も参照してください。

シナリオ9:Kamal デプロイ前の DB スキーマ検証

# 本番 DB の構造を取得
expdp prod/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_schema.dmp \
  SCHEMAS=APP \
  CONTENT=METADATA_ONLY

# SQL 出力で検証
impdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=prod_schema.dmp \
  SQLFILE=prod_schema.sql

# SQL ファイルを diff で比較
diff prod_schema.sql dev_schema.sql

Kamal デプロイの詳細は Kamal 2 デプロイの記事を参照してください。

シナリオ10:Docker Oracle 環境での実行

# コンテナ内で expdp
docker exec -it oracle-xe bash -c "
  export ORACLE_SID=XE
  expdp scott/tiger \
    DIRECTORY=dp_dir \
    DUMPFILE=scott.dmp \
    SCHEMAS=SCOTT
"

# ダンプファイルをホストにコピー
docker cp oracle-xe:/u01/dump_files/scott.dmp ./local_dumps/

Docker 関連のトラブル対処は、docker daemon 接続エラーの記事、Docker no space left on device の記事を参照してください。


パフォーマンスチューニング

PARALLEL の設定

# CPUコア数の 1〜2倍が目安
PARALLEL=4   # 4コアマシン向け
PARALLEL=8   # 8コアマシン向け

注意:

  • ダンプファイル数を %U で並列と揃える
  • I/O ボトルネックがあると効果薄

COMPRESSION の選択

圧縮レベル効果CPU コスト
NONE圧縮なし最小
METADATA_ONLYメタデータのみ
DATA_ONLYデータのみ
ALL全部

ネットワーク転送する場合は ALL 推奨(転送量削減)。

FILESIZE で分割

FILESIZE=10G
DUMPFILE=full_%U.dmp

大きすぎるファイルの回避(OS のファイルシステム制限)。

DIRECT PATH vs EXTERNAL TABLE

# デフォルトは AUTOMATIC
ACCESS_METHOD=AUTOMATIC   # デフォルト
ACCESS_METHOD=DIRECT_PATH # 高速だが制約あり
ACCESS_METHOD=EXTERNAL_TABLE # 柔軟だが遅い

通常は AUTOMATIC で OK。

ESTIMATE(見積もり)

# 事前にサイズ見積もり
expdp system/pw \
  DIRECTORY=dp_dir DUMPFILE=full.dmp \
  FULL=Y \
  ESTIMATE_ONLY=Y \
  ESTIMATE=STATISTICS

実際にエクスポートせず、必要サイズだけ計算。


トラブルシューティング

ORA-39002: invalid operation

DIRECTORY の権限がないユーザーが利用:

GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;

ORA-31641: unable to create dump file

OS のディスク容量不足、または権限不足:

df -h /u01/dump_files
ls -la /u01/dump_files/

Linux でのディスク容量確認、プロセス管理の詳細は、Linux find オプション一覧の記事、iostat 見方の記事、systemctl vs service の記事も参照してください。

ORA-39070: Unable to open the log file

log ファイル書き込み権限:

chmod 755 /u01/dump_files

ORA-31626: job does not exist

前回のジョブが残っている:

-- ジョブ一覧
SELECT owner_name, job_name, state
FROM dba_datapump_jobs;

-- 削除
DROP TABLE SCOTT.SYS_EXPORT_SCHEMA_01;

ORA-39125: Worker unexpected fatal error

Advanced Compression / Security オプションのライセンス問題:

# COMPRESSION=ALL / ENCRYPTION を使うにはライセンス必要
# 代わりに COMPRESSION=METADATA_ONLY で回避

中断からの再開

# ジョブ名を確認
SELECT owner_name, job_name FROM dba_datapump_jobs;

# 再接続
expdp scott/tiger ATTACH=SCOTT.SYS_EXPORT_SCHEMA_01

# 再開
Export> START_JOB

「動くけど遅い」

  • PARALLEL を上げる
  • COMPRESSION を下げる or NONE
  • I/O 性能を確認(iostat 見方の記事参照)

よくある質問(FAQ)

Q1. exp/imp は使えない?

Oracle 21c で完全削除。現代は Data Pump 一択

Q2. dump ファイルは同一バージョン間で互換性?

  • 同一メジャーバージョン: OK
  • 新→旧: VERSION パラメータで古いバージョン互換に

Q3. パスワード指定を秘匿したい

/@ 形式:

expdp scott/@source_db  # プロンプトでパスワード

または PAR ファイル + 適切なパーミッション。

Q4. RMAN との使い分け

  • 物理バックアップ: RMAN
  • 論理バックアップ・データ移行: Data Pump

用途が違います。

Q5. SQL*Loader との違い

  • SQL*Loader: CSV/テキスト → Oracle
  • Data Pump: Oracle → Oracle(バイナリ)

Data Pump の方が高速、機能豊富。

Q6. ネットワーク経由 vs ファイル経由

  • NETWORK_LINK: 小〜中規模、ネットワーク帯域十分
  • dump ファイル: 大規模、確実性重視

Q7. Rails Oracle での運用

Oracle アダプタで動的にダンプ取得は困難。バッチジョブでシェル呼び出しが一般的。

Q8. Autonomous DB での Data Pump

Oracle Cloud Autonomous Database でも動作。Object Storage 連携も可能:

DIRECTORY=data_pump_dir
DUMPFILE=default_credential:...

Q9. AWS RDS Oracle

RDS でも Data Pump 対応(DATA_PUMP_DIR が事前作成):

expdp master/pw@rds_endpoint DIRECTORY=DATA_PUMP_DIR ...

Q10. Docker Oracle での注意

コンテナ再起動でダンプファイルが消えないよう、volume にマウント:

volumes:
  - dump_files:/u01/dump_files

Q11. 進捗が遅い時

  • I/O 待ちの確認(iostat)
  • PARALLEL を上げる
  • 圧縮を下げる or 外す
  • ネットワーク経由なら帯域確認

Q12. スケジュール実行

  • cron(Linux)
  • DBMS_SCHEDULER(Oracle 内部)

crontab の使い方は crontab 使い方の記事、systemctl / service との比較は systemctl vs service の記事に詳しい説明があります。


参考リンク

Oracle 公式

  • <a href=”https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-data-pump.html” target=”_blank” rel=”noopener noreferrer”>Oracle Data Pump 公式ドキュメント</a>
  • <a href=”https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-export-utility.html” target=”_blank” rel=”noopener noreferrer”>Data Pump Export Reference</a>
  • <a href=”https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-import-utility.html” target=”_blank” rel=”noopener noreferrer”>Data Pump Import Reference</a>
  • <a href=”https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_DATAPUMP.html” target=”_blank” rel=”noopener noreferrer”>DBMS_DATAPUMP Package</a>

まとめ

Oracle Data Pump の使い方、要点を再整理します。

基本的な流れ

# 1. DIRECTORY オブジェクト作成(1度だけ)
CREATE OR REPLACE DIRECTORY dp_dir AS '/u01/dump_files';
GRANT READ, WRITE ON DIRECTORY dp_dir TO scott;

# 2. エクスポート
expdp scott/tiger DIRECTORY=dp_dir DUMPFILE=scott.dmp SCHEMAS=SCOTT

# 3. ファイル転送(必要なら)
scp /u01/dump_files/scott.dmp target:/u01/dump_files/

# 4. インポート
impdp system/pw DIRECTORY=dp_dir DUMPFILE=scott.dmp \
  REMAP_SCHEMA=SCOTT:HR REMAP_TABLESPACE=USERS:HR_TS

4つのモード

モード用途
FULLDB 全体
SCHEMASスキーマ単位
TABLESテーブル単位
TABLESPACESTS 単位

主要 REMAP オプション

REMAP_SCHEMA=SRC:TGT           # スキーマ変更
REMAP_TABLESPACE=SRC_TS:TGT_TS # TS 変更
REMAP_TABLE=SCHEMA.TBL:NEW_TBL # テーブル名変更
REMAP_DATA=...                 # データ値変換
REMAP_DATAFILE=...             # データファイル
REMAP_DIRECTORY=...            # ディレクトリ(12.2+)

TABLE_EXISTS_ACTION

動作
SKIPスキップ(デフォルト)
APPENDデータ追加
TRUNCATE削除→INSERT
REPLACEdrop→再作成

PARALLEL の使い方

DUMPFILE=scott_%U.dmp  # %U でワイルドカード
PARALLEL=4             # CPU コア数の 1-2倍

主要パラメータ表

DIRECTORY=dp_dir            # 必須
DUMPFILE=scott.dmp          # ダンプファイル名
LOGFILE=scott.log           # ログファイル
SCHEMAS=SCOTT               # スキーマ指定
TABLES=EMP                  # テーブル指定
FULL=Y                      # DB全体
CONTENT=DATA_ONLY           # データのみ
CONTENT=METADATA_ONLY       # 構造のみ
COMPRESSION=ALL             # 圧縮
PARALLEL=4                  # 並列
QUERY=...                   # 条件抽出
INCLUDE=TABLE               # 対象絞り込み
EXCLUDE=INDEX               # 除外
VERSION=12.0                # 古い版へ互換
NETWORK_LINK=...            # DB リンク経由
FILESIZE=10G                # ファイル分割
ESTIMATE=STATISTICS         # 見積もりだけ

モニタリング

-- 進捗
SELECT SID, USERNAME, SOFAR, TOTALWORK, 
       ROUND(SOFAR/TOTALWORK*100,2) "%"
FROM V$SESSION_LONGOPS 
WHERE TOTALWORK != 0 AND SOFAR <> TOTALWORK;

-- ジョブ一覧
SELECT owner_name, job_name, state FROM dba_datapump_jobs;

インタラクティブモード

Export> STATUS
Export> STOP_JOB
Export> START_JOB
Export> PARALLEL=8

実務ワークフロー

1. DIRECTORY 事前準備
2. PAR ファイル作成(コマンド長い場合)
3. ESTIMATE で見積もり
4. 実行 & モニタリング
5. ファイル転送(必要なら)
6. インポート実行
7. ジョブ完了確認
8. 統計情報再取得(必要なら)

事故防止

  • DIRECTORY 権限を事前確認
  • 既存データを守るなら TABLE_EXISTS_ACTION=SKIP
  • 本番の REPLACE は慎重に
  • PAR ファイルで再現性確保
  • COMPRESSION=ALL はライセンス確認
  • 大規模は段階的に(テーブル単位→スキーマ→FULL)

現代の推奨

  • exp/imp ではなく Data Pump
  • PAR ファイル活用
  • PARALLEL でスケール
  • NETWORK_LINK で dump ファイル省略も検討
  • バックアップは RMAN、論理移行は Data Pump

これらの知識は、Oracle DB のバックアップ・データ移行・DB 間コピー・環境構築・災害復旧・監査対応など、あらゆる場面で活用できます。本記事をブックマークしておけば、Data Pump を業務レベルで使いこなせるようになります。


本記事は2026年6月時点の情報をもとに、Oracle Database 19c〜23ai での動作確認・公式ドキュメントに基づき作成しています。Oracle のバージョンにより挙動が異なる場合があるため、最新の情報は Oracle 公式ドキュメント(docs.oracle.com)もあわせてご確認ください。