【完全ガイド】Oracle Data Pump(expdp/impdp)の使い方|DIRECTORY・REMAP・PARALLEL・NETWORK_LINK まで徹底解説
- 作成日 2026.07.17
- Oracle Database
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. 結論:まず動かす最小構成
- 2. Data Pump とは?従来 exp/imp との違い
- 3. 前提:DIRECTORY オブジェクトの作成
- 4. expdp(Export)の使い方
- 5. impdp(Import)の使い方
- 6. NETWORK_LINK(DB リンク経由の直接転送)
- 7. PAR ファイル(パラメータファイル)
- 8. モニタリングと制御
- 9. CDB / PDB 環境での対応
- 10. 実践シナリオ
- 11. パフォーマンスチューニング
- 12. トラブルシューティング
- 13. よくある質問(FAQ)
- 13.1. Q1. exp/imp は使えない?
- 13.2. Q2. dump ファイルは同一バージョン間で互換性?
- 13.3. Q3. パスワード指定を秘匿したい
- 13.4. Q4. RMAN との使い分け
- 13.5. Q5. SQL*Loader との違い
- 13.6. Q6. ネットワーク経由 vs ファイル経由
- 13.7. Q7. Rails Oracle での運用
- 13.8. Q8. Autonomous DB での Data Pump
- 13.9. Q9. AWS RDS Oracle
- 13.10. Q10. Docker Oracle での注意
- 13.11. Q11. 進捗が遅い時
- 13.12. Q12. スケジュール実行
- 14. 参考リンク
- 15. まとめ
結論:まず動かす最小構成
時間がない方向けに、最短の実行手順を先に示します。
前提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/imp | Data 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つのモード
| モード | 用途 |
|---|---|
| FULL | DB 全体 |
| SCHEMAS | スキーマ単位 |
| TABLES | テーブル単位 |
| TABLESPACES | TS 単位 |
主要 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 |
| REPLACE | drop→再作成 |
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)もあわせてご確認ください。
-
前の記事
【完全ガイド】ORA-01843: not a valid month の原因と解決方法|NLS_DATE_FORMAT・TO_DATE・暗黙変換・環境差異まで徹底解説 2026.07.17
-
次の記事
【完全ガイド】ORA-04091: table is mutating の原因と解決方法|Compound Trigger・Autonomous Transaction まで徹底解説 2026.07.19
コメントを書く