Oracle Data Pump のスキーマモード(schemas=)を使えば、指定したスキーマ内のテーブル・ビュー・インデックス・シーケンス・プロシージャなど全オブジェクトをまとめてエクスポート/インポートできます。テーブルモード(tables=)では個別にテーブルを列挙する必要がありますが、スキーマモードなら 1 つのパラメータでスキーマ全体を対象にできるため、環境構築やマイグレーションで最もよく使われるモードです。
本記事では、expdp / impdp のスキーマモードの基本から、REMAP_SCHEMA で別スキーマに復元、EXCLUDE / INCLUDE でオブジェクトを取捨選択、権限・シノニム・シーケンスの扱い、そして本番→検証コピー・マイグレーションの実務パターンまで解説します。
この記事でわかること
・expdp schemas= でスキーマ全体をエクスポートする方法
・impdp schemas= でスキーマをインポートする方法
・複数スキーマを同時にエクスポート/インポートする方法
・REMAP_SCHEMA で別スキーマに復元する方法
・REMAP_TABLESPACE で表領域を変更する方法
・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 を組み合わせるのが最も一般的なパターンです。
本番環境と検証環境でスキーマ名・表領域名が異なる場合、この 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 を手動で再作成してください。
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 になります。
ビューやプロシージャが元のスキーマ名をハードコードしている場合、REMAP 後に参照先が見つからず INVALID になります。
DBMS_UTILITY.COMPILE_SCHEMA で再コンパイルし、残ったものはソースを修正してください。よくある質問
Q自分のスキーマ以外をエクスポートするには何の権限が必要ですか?
A
EXP_FULL_DATABASE ロールが必要です。GRANT EXP_FULL_DATABASE TO user で付与できます。このロールがない場合、自分のスキーマのみエクスポート可能です。QREMAP_SCHEMA でインポート先のスキーマが存在しない場合どうなりますか?
A
IMP_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スキーマ内のテーブルのデータだけ入れ替えたい場合は?
A
content=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 する方法」も併せて参照してください。

