Oracleデータポンプ(expdp/impdp)の使い方【エクスポート・インポート完全ガイド】

当ページのリンクには広告が含まれています。

データの移行・バックアップ・スキーマコピーといった現場作業に欠かせない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/dpdump

3. 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.log

QUERYパラメータはパラメータファイル(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.log

CONTENTパラメータの値:

内容
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.log

TABLE_EXISTS_ACTIONの値:

動作
SKIP(デフォルト)既存テーブルはスキップ
APPEND既存データに追記
TRUNCATETRUNCATEしてからインポート
REPLACEDROP&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.par

WHERE句を含むパラメータファイルの例

# /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=YES

7. よくあるエラーと対処法 {#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=REPLACE

8. まとめ:現場で使うコマンド早見表 {#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 を付けて複数ファイルに対応
□ ログファイルを必ず確認(エラーがあってもプロセスは正常終了することがある)

関連記事:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ITの事や自分の経験談など綴っていきたいと思っています。

コメント

コメントする

CAPTCHA


目次