データの移行・バックアップ・スキーマコピーといった現場作業に欠かせないOracle Data Pump。本記事では expdp(エクスポート)と impdp(インポート)の基本から、パラメータファイルの使い方・よくあるエラー対処まで現場目線で解説します。
目次
1. データポンプとは(exp/impとの違い) {#about}
Data Pump(データポンプ)はOracle 10gから導入されたエクスポート・インポートツールです。旧ツールの exp/imp に比べて大幅に高速化されており、現在の現場では標準的に使われています。
| 比較項目 | 旧ツール(exp/imp) | データポンプ(expdp/impdp) |
|---|---|---|
| 速度 | 遅い | 高速(パラレル処理対応) |
| ファイル出力先 | クライアント側 | サーバー側のみ |
| 実行中の操作 | 不可 | 一時停止・再開が可能 |
| フィルタリング | 限定的 | 柔軟(WHERE句指定可) |
| 推奨 | 非推奨 | 現在の標準 |
重要: データポンプはダンプファイルをサーバー上のディレクトリに出力します。クライアントPCには出力できません。DIRECTORYオブジェクトの設定が必須です。
2. DIRECTORYオブジェクトの作成と確認 {#directory}
データポンプはOracleサーバー上の「DIRECTORYオブジェクト」が指す物理ディレクトリにファイルを出力します。
DIRECTORYオブジェクトの確認
-- 既存のDIRECTORYを確認
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM DBA_DIRECTORIES
ORDER BY DIRECTORY_NAME;出力例:
DIRECTORY_NAME DIRECTORY_PATH
------------------ --------------------------
DATA_PUMP_DIR /u01/app/oracle/admin/ORCL/dpdump/
ORACLE_OCM_CONFIG_DIR /u01/app/oracle/product/19.3/dbhome/ccr/hosts/...
DATA_PUMP_DIRはOracle標準のデフォルトディレクトリです。存在しない場合は作成します。
DIRECTORYオブジェクトの作成
-- SYSDBAで実行
-- サーバー上の物理ディレクトリを先に作成しておくこと
CREATE OR REPLACE DIRECTORY DPUMP_DIR AS '/data/dpdump';
-- ユーザーに権限を付与
GRANT READ, WRITE ON DIRECTORY DPUMP_DIR TO SCOTT;# サーバー上で物理ディレクトリを作成(OSコマンド)
mkdir -p /data/dpdump
chown oracle:oinstall /data/dpdump3. expdp:エクスポートの基本 {#expdp-basic}
スキーマ単位のエクスポート(最もよく使う)
expdp scott/tiger@ORCL \
SCHEMAS=SCOTT \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=scott_20260517_exp.logテーブル単位のエクスポート
expdp scott/tiger@ORCL \
TABLES=EMPLOYEES,DEPARTMENTS \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=emp_dept_20260517.dmp \
LOGFILE=emp_dept_exp.logフルデータベースエクスポート(DBA権限が必要)
expdp system/manager@ORCL \
FULL=Y \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=fulldb_20260517_%U.dmp \
FILESIZE=2G \
PARALLEL=4 \
LOGFILE=fulldb_exp.log%U:ファイル連番(PARALLEL使用時は複数ファイルに分割)FILESIZE:1ファイルの最大サイズPARALLEL:パラレル処理数(CPU数に合わせて設定)
WHERE句でデータを絞ってエクスポート
expdp scott/tiger@ORCL \
TABLES=EMPLOYEES \
QUERY=EMPLOYEES:'"WHERE HIRE_DATE >= DATE'"'"'2024-01-01'"'"'"' \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=emp_2024.dmp \
LOGFILE=emp_2024_exp.logQUERYパラメータはパラメータファイル(parfile)で記述する方が読みやすくなります。
4. impdp:インポートの基本 {#impdp-basic}
スキーマ単位のインポート
impdp system/manager@ORCL \
SCHEMAS=SCOTT \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=scott_20260517_imp.log別スキーマへのインポート(REMAP_SCHEMA)
# SCOTTスキーマをHR_TESTスキーマにインポート
impdp system/manager@ORCL \
SCHEMAS=SCOTT \
REMAP_SCHEMA=SCOTT:HR_TEST \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=scott_imp_remap.log別テーブルスペースへのインポート(REMAP_TABLESPACE)
# テーブルスペースもリマップする
impdp system/manager@ORCL \
SCHEMAS=SCOTT \
REMAP_SCHEMA=SCOTT:HR_TEST \
REMAP_TABLESPACE=USERS:HR_DATA \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=scott_imp_remap.logテーブル構造のみインポート(データなし)
impdp scott/tiger@ORCL \
TABLES=EMPLOYEES \
CONTENT=METADATA_ONLY \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=emp_struct_imp.logCONTENTパラメータの値:
| 値 | 内容 |
|---|---|
| ALL(デフォルト) | 構造 + データ |
| DATA_ONLY | データのみ(既存テーブルにINSERT) |
| METADATA_ONLY | 構造のみ(テーブル定義・インデックスなど) |
既存データを上書きしてインポート(TABLE_EXISTS_ACTION)
impdp scott/tiger@ORCL \
TABLES=EMPLOYEES \
TABLE_EXISTS_ACTION=REPLACE \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp \
LOGFILE=emp_replace_imp.logTABLE_EXISTS_ACTIONの値:
| 値 | 動作 |
|---|---|
| SKIP(デフォルト) | 既存テーブルはスキップ |
| APPEND | 既存データに追記 |
| TRUNCATE | TRUNCATEしてからインポート |
| REPLACE | DROP&CREATEしてからインポート |
5. パラメータファイルを使った実行 {#parfile}
長いパラメータはパラメータファイル(.parファイル)にまとめると管理しやすくなります。
エクスポート用パラメータファイルの例
# /tmp/exp_scott.par
SCHEMAS=SCOTT
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=scott_20260517.dmp
LOGFILE=scott_exp.log
COMPRESSION=ALL
EXCLUDE=STATISTICS# パラメータファイルを指定して実行
expdp system/manager@ORCL PARFILE=/tmp/exp_scott.parWHERE句を含むパラメータファイルの例
# /tmp/exp_emp_2024.par
TABLES=EMPLOYEES
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=emp_2024.dmp
LOGFILE=emp_2024_exp.log
QUERY=EMPLOYEES:"WHERE HIRE_DATE >= DATE '2024-01-01'"パラメータファイルを使うと
QUERYのQUOTEが単純に書けます。
6. よく使う応用パターン {#advanced}
別DBへのスキーマコピー(DB移行)
# 1. ソースDBからエクスポート
expdp system/manager@SOURCE_DB \
SCHEMAS=SCOTT \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_migrate.dmp
# 2. ダンプファイルをターゲットDBサーバーにコピー(OS操作)
scp /u01/app/oracle/admin/ORCL/dpdump/scott_migrate.dmp \
oracle@target-server:/data/dpdump/
# 3. ターゲットDBにインポート
impdp system/manager@TARGET_DB \
SCHEMAS=SCOTT \
REMAP_TABLESPACE=USERS:TARGET_USERS \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_migrate.dmp実行中のジョブを確認・操作する
-- 実行中のデータポンプジョブを確認
SELECT JOB_NAME, OPERATION, JOB_MODE, STATE
FROM DBA_DATAPUMP_JOBS
WHERE STATE = 'EXECUTING';# 実行中のジョブに接続して操作
impdp system/manager@ORCL ATTACH=SYS_IMPORT_SCHEMA_01
# インタラクティブモードで操作可能
Export> STATUS # 進捗確認
Export> PARALLEL=8 # 並列度変更
Export> KILL_JOB # ジョブ強制停止推定サイズを確認してからエクスポート
expdp system/manager@ORCL \
SCHEMAS=SCOTT \
DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=estimate_only.dmp \
ESTIMATE_ONLY=YES7. よくあるエラーと対処法 {#errors}
ORA-39002:操作が正しくない / ORA-39070:DIRECTORYを開けない
ORA-39002: 操作が正しくありません
ORA-39070: 出力ファイルを開くことができません。
ORA-29283: ファイル操作が無効です原因と対処:
# 1. DIRECTORYが指す物理パスが存在するか確認
ls -la /data/dpdump/
# 2. Oracleユーザーに書き込み権限があるか確認
chown oracle:oinstall /data/dpdump
chmod 750 /data/dpdump-- 3. DIRECTORYオブジェクトの権限を確認
SELECT GRANTEE, PRIVILEGE, DIRECTORY_NAME
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'DATA_PUMP_DIR';ORA-39083:オブジェクト型がスキップされた
ORA-39083: オブジェクト型TABLEの作成に失敗しました
ORA-01659: ブロック数xxxを割り当てることができませんインポート先のテーブルスペースに空き容量が不足しています。
-- テーブルスペースの残量を確認
SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES)/1024/1024, 1) AS FREE_MB
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME;ORA-31684:オブジェクトがすでに存在する
インポート先に同名テーブルが存在する場合のエラー。
# TABLE_EXISTS_ACTION=REPLACE で上書きする
impdp ... TABLE_EXISTS_ACTION=REPLACE8. まとめ:現場で使うコマンド早見表 {#summary}
# スキーマのエクスポート
expdp system/manager@ORCL SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_$(date +%Y%m%d).dmp LOGFILE=exp_$(date +%Y%m%d).log
# スキーマのインポート
impdp system/manager@ORCL SCHEMAS=SCOTT DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp LOGFILE=imp_20260517.log
# 別スキーマ・別テーブルスペースへのリマップインポート
impdp system/manager@ORCL SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:NEWSCHEMA \
REMAP_TABLESPACE=USERS:NEWTBS DIRECTORY=DATA_PUMP_DIR \
DUMPFILE=scott_20260517.dmp LOGFILE=imp_remap.log
# 構造のみエクスポート(データなし)
expdp system/manager@ORCL SCHEMAS=SCOTT CONTENT=METADATA_ONLY \
DIRECTORY=DATA_PUMP_DIR DUMPFILE=scott_meta.dmp
# 実行中ジョブの確認
SELECT JOB_NAME, OPERATION, STATE FROM DBA_DATAPUMP_JOBS;チェックリスト
□ DIRECTORYオブジェクトが存在し、物理パスに書き込み権限がある
□ エクスポート前に ESTIMATE_ONLY=YES で容量を確認
□ インポート前にターゲットDBのテーブルスペース空き容量を確認
□ 本番DBへのインポートは TABLE_EXISTS_ACTION を明示的に指定
□ PARALLEL指定時はDUMPFILEに %U を付けて複数ファイルに対応
□ ログファイルを必ず確認(エラーがあってもプロセスは正常終了することがある)関連記事:









コメント