【Oracle】Data Pump でスキーマ単位にエクスポート・インポートする方法|schemas・REMAP_SCHEMA・EXCLUDE・複数スキーマ・実務パターンまで解説

【Oracle】Data Pump でスキーマ単位にエクスポート・インポートする方法|schemas・REMAP_SCHEMA・EXCLUDE・複数スキーマ・実務パターンまで解説 Oracle

Oracle Data Pump のスキーマモードschemas=)を使えば、指定したスキーマ内のテーブル・ビュー・インデックス・シーケンス・プロシージャなど全オブジェクトをまとめてエクスポート/インポートできます。テーブルモード(tables=)では個別にテーブルを列挙する必要がありますが、スキーマモードなら 1 つのパラメータでスキーマ全体を対象にできるため、環境構築やマイグレーションで最もよく使われるモードです。

本記事では、expdp / impdp のスキーマモードの基本から、REMAP_SCHEMA で別スキーマに復元EXCLUDE / INCLUDE でオブジェクトを取捨選択権限・シノニム・シーケンスの扱い、そして本番→検証コピー・マイグレーションの実務パターンまで解説します。

この記事でわかること
・expdp schemas= でスキーマ全体をエクスポートする方法
・impdp schemas= でスキーマをインポートする方法
・複数スキーマを同時にエクスポート/インポートする方法
・REMAP_SCHEMA で別スキーマに復元する方法
・REMAP_TABLESPACE で表領域を変更する方法
・EXCLUDE / INCLUDE でオブジェクトを取捨選択する方法
・権限・シノニム・シーケンスのインポート時の注意点
・本番→検証コピー・マイグレーションの実務パターン
スポンサーリンク

expdp でスキーマをエクスポートする

基本コマンド

Shell(スキーマエクスポート基本)
# HR スキーマ全体をエクスポート
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    logfile=hr_schema_exp.log \
    schemas=HR

複数スキーマを同時にエクスポート

Shell(複数スキーマ)
# HR + SALES + INVENTORY を同時にエクスポート
expdp system/password \
    directory=DP_DIR \
    dumpfile=multi_schema_%U.dmp \
    logfile=multi_schema_exp.log \
    schemas=HR,SALES,INVENTORY \
    parallel=4

# 注意: 他スキーマをエクスポートするには
# EXP_FULL_DATABASE ロールまたは DBA 権限が必要

スキーマ内の特定オブジェクトを除外

Shell(EXCLUDE でオブジェクトを除外)
# 統計情報とインデックスを除外してエクスポート
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_no_stats_%U.dmp \
    logfile=hr_no_stats.log \
    schemas=HR \
    exclude=STATISTICS \
    exclude=INDEX

# 特定テーブルだけ除外
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_filtered.dmp \
    logfile=hr_filtered.log \
    schemas=HR \
    exclude=TABLE:\"IN ('TEMP_DATA', 'LOG_TABLE')\"
Shell(INCLUDE で特定オブジェクトだけ含める)
# テーブルとシーケンスだけをエクスポート(ビュー・プロシージャは除外)
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_tables_only.dmp \
    logfile=hr_tables_only.log \
    schemas=HR \
    include=TABLE,SEQUENCE
除外可能なオブジェクト型 EXCLUDE 指定例
テーブル EXCLUDE=TABLE
インデックス EXCLUDE=INDEX
制約 EXCLUDE=CONSTRAINT
トリガー EXCLUDE=TRIGGER
ビュー EXCLUDE=VIEW
シーケンス EXCLUDE=SEQUENCE
プロシージャ / ファンクション EXCLUDE=PROCEDURE,FUNCTION
パッケージ EXCLUDE=PACKAGE
統計情報 EXCLUDE=STATISTICS
権限付与(GRANT) EXCLUDE=GRANT

スナップショット一貫性の確保

Shell(flashback_time で一貫性を確保)
# エクスポート中のデータ変更の影響を排除
expdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_consistent_%U.dmp \
    logfile=hr_consistent.log \
    schemas=HR \
    flashback_time="TO_TIMESTAMP(SYSDATE)"

# エクスポート開始時点のスナップショットでエクスポートされる
# テーブル間のデータ整合性が保証される

impdp でスキーマをインポートする

同じスキーマにインポート

Shell(同一スキーマにインポート)
# HR スキーマにそのままインポート
impdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    logfile=hr_schema_imp.log \
    schemas=HR

# テーブルが既存の場合のデフォルト動作: SKIP(スキップ)
# 上書きしたい場合: table_exists_action=REPLACE を追加

REMAP_SCHEMA:別スキーマに復元

Shell(REMAP_SCHEMA で別スキーマに復元)
# HR スキーマの内容を TEST_HR スキーマにインポート
impdp system/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    logfile=remap_schema_imp.log \
    remap_schema=HR:TEST_HR

# TEST_HR スキーマが存在しない場合は自動作成される(DBA 権限時)
# TEST_HR のデフォルト表領域にオブジェクトが作成される

REMAP_TABLESPACE:表領域を変更して復元

Shell(REMAP_TABLESPACE で表領域を変更)
# HR の表領域 USERS を TEST_TS に変更してインポート
impdp system/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    logfile=remap_ts_imp.log \
    remap_schema=HR:TEST_HR \
    remap_tablespace=USERS:TEST_TS

# REMAP_SCHEMA + REMAP_TABLESPACE の同時指定が可能
# 本番と検証で表領域が異なる場合に必須
REMAP_SCHEMA + REMAP_TABLESPACE は本番→検証の定番
本番環境と検証環境でスキーマ名・表領域名が異なる場合、この 2 つの REMAP を組み合わせるのが最も一般的なパターンです。

EXCLUDE / content を使ったインポート制御

Shell(インポート時のフィルタリング)
# データだけインポート(テーブル構造は既存のまま)
impdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    schemas=HR \
    content=DATA_ONLY \
    table_exists_action=TRUNCATE

# DDL だけインポート(空テーブルの構築)
impdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    schemas=HR \
    content=METADATA_ONLY

# トリガーと権限を除外してインポート
impdp hr/password \
    directory=DP_DIR \
    dumpfile=hr_schema_%U.dmp \
    schemas=HR \
    exclude=TRIGGER \
    exclude=GRANT

スキーマエクスポートに含まれるオブジェクト

オブジェクト 含まれるか 備考
テーブル + データ 含まれる デフォルトで全テーブル
インデックス 含まれる EXCLUDE=INDEX で除外可能
制約(PK / FK / CHECK / UNIQUE) 含まれる EXCLUDE=CONSTRAINT で除外可能
ビュー 含まれる
シーケンス 含まれる CURRVAL の値も保持される
トリガー 含まれる
PL/SQL(プロシージャ / ファンクション / パッケージ) 含まれる
タイプ(ユーザー定義型) 含まれる
シノニム(PRIVATE) 含まれる PUBLIC シノニムはスキーマモードでは含まれない
権限(GRANT) 含まれる 他スキーマへの GRANT も含まれる
PUBLIC シノニム 含まれない full=y モードのみ。またはスキーマモードでは別途作成
DB Link 含まれない(パスワードが含まれるため) 手動で再作成が必要
ディレクトリオブジェクト 含まれない SYS 所有のため
DB Link とパスワード
DB Link はパスワード情報を含むため、セキュリティ上の理由でスキーマエクスポートに含まれません。マイグレーション時は DB Link を手動で再作成してください。

必要な権限

操作 自スキーマ 他スキーマ
expdp schemas= 追加権限不要(DIRECTORY の READ/WRITE のみ) EXP_FULL_DATABASE ロールが必要
impdp schemas=(同一スキーマ) 追加権限不要
impdp remap_schema=A:B IMP_FULL_DATABASE ロールが必要
SQL(権限の付与)
-- 他スキーマのエクスポートを許可
GRANT EXP_FULL_DATABASE TO migration_user;

-- 他スキーマへのインポート(REMAP 含む)を許可
GRANT IMP_FULL_DATABASE TO migration_user;

-- DIRECTORY のアクセス権
GRANT READ, WRITE ON DIRECTORY DP_DIR TO migration_user;

実務パターン集

パターン(1): 本番スキーマを検証環境にコピー

Shell
# 本番でエクスポート
expdp system/password \
    directory=DP_DIR \
    dumpfile=prod_hr_%U.dmp \
    logfile=prod_hr_exp.log \
    schemas=HR \
    parallel=4 \
    flashback_time="TO_TIMESTAMP(SYSDATE)"

# ダンプファイルを検証環境に転送
# scp prod_hr_*.dmp testserver:/oracle/dpdir/

# 検証環境でインポート(スキーマ名+表領域を変更)
impdp system/password \
    directory=DP_DIR \
    dumpfile=prod_hr_%U.dmp \
    logfile=test_hr_imp.log \
    remap_schema=HR:TEST_HR \
    remap_tablespace=USERS:TEST_TS \
    parallel=4

パターン(2): スキーマのデータだけリフレッシュ(構造は維持)

Shell
# 検証環境のデータだけを本番データで入れ替え
impdp system/password \
    directory=DP_DIR \
    dumpfile=prod_hr_%U.dmp \
    logfile=refresh_data.log \
    remap_schema=HR:TEST_HR \
    content=DATA_ONLY \
    table_exists_action=TRUNCATE

# テーブル構造・インデックス・制約はそのまま
# データだけ本番の内容に入れ替え

パターン(3): 複数スキーマを統合して新環境に移行

Shell
# 旧環境: HR + SALES + INVENTORY を同時エクスポート
expdp system/password \
    directory=DP_DIR \
    dumpfile=migration_%U.dmp \
    logfile=migration_exp.log \
    schemas=HR,SALES,INVENTORY \
    parallel=8 \
    compression=ALL

# 新環境: そのままインポート
impdp system/password \
    directory=DP_DIR \
    dumpfile=migration_%U.dmp \
    logfile=migration_imp.log \
    parallel=8 \
    transform=DISABLE_ARCHIVE_LOGGING:Y

パターン(4): parfile でパラメータを管理

parfile(schema_export.par)
# スキーマエクスポート用 parfile
directory=DP_DIR
dumpfile=hr_daily_%U.dmp
logfile=hr_daily_exp.log
schemas=HR
parallel=4
compression=ALL
exclude=STATISTICS
flashback_time="TO_TIMESTAMP(SYSDATE)"
Shell(parfile で実行)
expdp system/password parfile=/oracle/dpdir/schema_export.par

インポート後の確認・後処理

SQL(インポート後の確認)
-- インポートされたオブジェクト数を確認
SELECT object_type, COUNT(*) AS cnt
FROM all_objects
WHERE owner = 'TEST_HR'
GROUP BY object_type
ORDER BY cnt DESC;

-- INVALID オブジェクトの確認
SELECT object_name, object_type, status
FROM all_objects
WHERE owner = 'TEST_HR' AND status = 'INVALID';

-- INVALID オブジェクトの再コンパイル
EXEC DBMS_UTILITY.COMPILE_SCHEMA('TEST_HR');

-- シーケンスの現在値を確認
SELECT sequence_name, last_number FROM all_sequences WHERE sequence_owner = 'TEST_HR';
REMAP_SCHEMA 後に INVALID オブジェクトが出ることがある
ビューやプロシージャが元のスキーマ名をハードコードしている場合、REMAP 後に参照先が見つからず INVALID になります。DBMS_UTILITY.COMPILE_SCHEMA で再コンパイルし、残ったものはソースを修正してください。

よくある質問

Q自分のスキーマ以外をエクスポートするには何の権限が必要ですか?
AEXP_FULL_DATABASE ロールが必要です。GRANT EXP_FULL_DATABASE TO user で付与できます。このロールがない場合、自分のスキーマのみエクスポート可能です。
QREMAP_SCHEMA でインポート先のスキーマが存在しない場合どうなりますか?
AIMP_FULL_DATABASE ロールを持つユーザーで実行していれば、スキーマ(ユーザー)が自動的に作成されます。ただしパスワードはデフォルトのまま(またはロック状態)になるため、インポート後に ALTER USER TEST_HR IDENTIFIED BY password ACCOUNT UNLOCK で設定してください。
Qスキーマモードで PUBLIC シノニムはエクスポートされますか?
Aされません。PUBLIC シノニムは SYS スキーマ所有のため、スキーマモード(schemas=)には含まれません。full=y モードであれば含まれます。スキーマモードの場合は、PUBLIC シノニムをインポート後に手動で作成してください。
Qエクスポート中に他のユーザーがデータを変更したらどうなりますか?
Aデフォルトでは各テーブルごとに一貫性が保たれますが、テーブル間の一貫性は保証されません。テーブル間の一貫性も必要な場合は flashback_time="TO_TIMESTAMP(SYSDATE)" パラメータを使ってエクスポート開始時点のスナップショットを取得してください。
QREMAP_SCHEMA と REMAP_TABLESPACE は同時に使えますか?
Aはい。remap_schema=HR:TEST_HR remap_tablespace=USERS:TEST_TS のように同時に指定できます。本番と検証でスキーマ名も表領域名も異なる場合の定番パターンです。
Qスキーマ内のテーブルのデータだけ入れ替えたい場合は?
Acontent=DATA_ONLY table_exists_action=TRUNCATE を組み合わせます。テーブル構造(インデックス・制約)を維持したまま、データだけ入れ替わります。検証環境のデータを本番データでリフレッシュするときに使います。

まとめ

スキーマ単位の Data Pump 操作の要点をまとめます。

やりたいこと コマンド / パラメータ
スキーマ全体をエクスポート expdp … schemas=HR
複数スキーマを同時にエクスポート expdp … schemas=HR,SALES,INVENTORY
特定オブジェクトを除外 exclude=INDEX,STATISTICS
テーブルとシーケンスだけ含める include=TABLE,SEQUENCE
同じスキーマにインポート impdp … schemas=HR
別スキーマに復元 impdp … remap_schema=HR:TEST_HR
表領域も変更して復元 impdp … remap_schema=HR:TEST_HR remap_tablespace=USERS:TEST_TS
データだけリフレッシュ impdp … content=DATA_ONLY table_exists_action=TRUNCATE
DDL だけ取得(空テーブル作成) impdp … content=METADATA_ONLY
一貫性のあるエクスポート expdp … flashback_time=”TO_TIMESTAMP(SYSDATE)”

Data Pump の基本は「Data Pump の使い方完全ガイド」、パラレル処理は「Data Pump のパラレル処理で高速化」、表領域単位の操作は「表領域単位に expdp/impdp する方法」も併せて参照してください。