【Oracle】Data Pumpで表領域単位にexpdp/impdpする方法|REMAP_TABLESPACE・エラー対処まで完全解説

【Oracle】表領域ごとにエクスポート・インポートする方法|tablespacesパラメータの使い方 Oracle

「特定の表領域だけバックアップしたい」「別の表領域に移行したい」――OracleのData Pump(expdp/impdp)は、スキーマ単位・テーブル単位だけでなく、表領域(Tablespace)単位でもエクスポート・インポートできます。

この記事では、tablespacesパラメータの基本的な使い方から、remap_tablespaceによる再配置、並列実行、よくあるエラーと対処法まで実務レベルで解説します。

この記事で学べること

  • Data Pumpのエクスポードモード比較(FULL/SCHEMA/TABLE/TABLESPACE)
  • 前提確認:DATA_PUMP_DIRの確認・表領域の所有オブジェクト確認
  • expdpで表領域単位にエクスポートするコマンド・オプション
  • impdpで表領域単位にインポートするコマンド
  • REMAP_TABLESPACEで別の表領域に再配置する方法
  • REMAP_SCHEMAと組み合わせた環境移行パターン
  • 並列実行(PARALLEL)でのパフォーマンス向上
  • よくあるエラーと対処法
スポンサーリンク

Data Pumpのエクスポートモード比較

expdp/impdpには複数のエクスポードモードがあります。用途に応じて使い分けましょう。

モード パラメータ 対象範囲 用途
フル FULL=Y DB全体 全体バックアップ・DB移行
スキーマ SCHEMAS=スキーマ名 指定スキーマのオブジェクト全体 スキーマ単位のバックアップ・移行
テーブル TABLES=テーブル名 指定テーブルのみ 部分バックアップ・テーブル移行
表領域 TABLESPACES=表領域名 指定表領域のオブジェクト全体 表領域単位の移行・バックアップ(本記事

前提確認:実行前に確認すること

① DATA_PUMP_DIRの確認

Data Pumpはデータベースサーバー上のディレクトリオブジェクトを経由してファイルを読み書きします。デフォルトの DATA_PUMP_DIR のパスを確認しておきましょう。

SQL – ディレクトリオブジェクトの確認
-- ディレクトリオブジェクト一覧(DBAロール必要)SELECT directory_name, directory_pathFROM   dba_directoriesWHERE  directory_name = 'DATA_PUMP_DIR';-- 実行ユーザーにREAD/WRITE権限があるか確認SELECT grantee, privilege, directory_nameFROM   dba_tab_privsWHERE  directory_name = 'DATA_PUMP_DIR';

② 対象表領域とそのオブジェクトを確認

SQL – 表領域ごとのオブジェクト数確認
-- 表領域に属するテーブル一覧SELECT owner, table_name, tablespace_nameFROM   dba_tablesWHERE  tablespace_name = 'USERS'ORDER BY owner, table_name;-- 表領域ごとのオブジェクト数サマリSELECT tablespace_name,       COUNT(*) AS object_countFROM   dba_segmentsGROUP BY tablespace_nameORDER BY tablespace_name;

注意:表領域モードは対象表領域のオブジェクトを所有するスキーマのオブジェクトすべてが対象になります。SYSなど内部スキーマのオブジェクトが含まれる表領域(SYSTEM, SYSAUXなど)では使用しないでください。

expdpで表領域単位にエクスポートする

基本コマンド

bash – expdp 基本構文
expdp ユーザー名/パスワード \  directory=DATA_PUMP_DIR \  dumpfile=ファイル名.dmp \  logfile=ログファイル名.log \  tablespaces=表領域名

使用例:USERS表領域をエクスポート

bash – USERS表領域のエクスポート
expdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts_$(date +%Y%m%d).dmp \  logfile=users_ts_$(date +%Y%m%d).log \  tablespaces=USERS

複数の表領域を一括エクスポート

bash – 複数表領域を一括エクスポート
expdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=multi_ts_%U.dmp \  logfile=multi_ts.log \  tablespaces=USERS,APP_DATA,IDX_DATA \  filesize=2G                           # ファイルを2GB単位に分割

ポイント:ファイル名に %U を含めると複数ファイルに分割したとき 0199 の連番が付きます。大容量の表領域を扱う場合は filesize オプションと組み合わせましょう。

主要オプション一覧

オプション 説明
COMPRESSION 圧縮指定(ALL/DATA_ONLY/METADATA_ONLY/NONE) compression=ALL
PARALLEL 並列ワーカー数(Enterprise Edition + Advanced Compression要) parallel=4
FILESIZE 出力ファイルの最大サイズ(超えると%Uで分割) filesize=5G
EXCLUDE 特定オブジェクト種別を除外 exclude=INDEX
CONTENT DATA_ONLY/METADATA_ONLYで内容を限定 content=DATA_ONLY

impdpで表領域単位にインポートする

基本コマンド

bash – impdp 基本構文
impdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts.dmp \  logfile=users_ts_import.log \  tablespaces=USERS

impdp の tablespaces パラメータの意味:インポート時に指定した場合は「dumpfile内のデータのうち、指定した表領域に属するオブジェクトだけをインポートする」というフィルタとして機能します。dumpfileがフル(FULL=Y)で取得されていても、特定の表領域だけを選んで復元できます。

SQLFILE オプションでSQLを確認してからインポート

実際にインポートする前に、実行されるDDLをファイルに出力して確認できます。

bash – SQLFILE でDDL確認(実際のインポートは行われない)
impdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts.dmp \  tablespaces=USERS \  sqlfile=check_ddl.sql

REMAP_TABLESPACEで別の表領域に再配置する

インポート先の表領域名をエクスポート元と変えたい場合は remap_tablespace を使います。環境移行(本番→検証)やストレージ再構成に欠かせないオプションです。

bash – REMAP_TABLESPACE の基本
# USERS → NEW_USERS に再配置してインポートimpdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts.dmp \  logfile=remap_import.log \  remap_tablespace=USERS:NEW_USERS

複数の表領域を同時に再配置

複数の remap_tablespace を並べて指定できます。

bash – 複数の表領域を再配置
impdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=multi_ts.dmp \  logfile=remap_multi.log \  remap_tablespace=APP_DATA:NEW_APP_DATA \  remap_tablespace=IDX_DATA:NEW_IDX_DATA

注意:remap_tablespace の移行先の表領域は事前に作成しておく必要があります。存在しない表領域を指定するとインポートがエラーになります。

REMAP_SCHEMAと組み合わせた環境移行パターン

本番から検証環境へのデータ移行では、スキーマ名と表領域名を同時に置き換えることが多いです。remap_schemaremap_tablespace を組み合わせましょう。

bash – スキーマ名・表領域名を同時に置き換え
# 本番スキーマ PROD_USER → 検証スキーマ DEV_USER# 本番表領域 PROD_DATA  → 検証表領域 DEV_DATA に移行impdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=prod_backup.dmp \  logfile=dev_import.log \  remap_schema=PROD_USER:DEV_USER \  remap_tablespace=PROD_DATA:DEV_DATA \  table_exists_action=REPLACE
TABLE_EXISTS_ACTION 動作 用途
SKIP 既存テーブルはスキップ(デフォルト) 追加インポート
APPEND 既存テーブルにデータを追記 差分追加
TRUNCATE 既存テーブルをTRUNCATEしてからインポート 全件置き換え
REPLACE 既存テーブルをDROPしてからCREATE+インポート 完全置き換え(制約・インデックスも再作成)

並列実行(PARALLEL)でパフォーマンスを向上させる

parallelオプションで複数のワーカープロセスを使い、エクスポート・インポートを高速化できます。ファイル名に %U を含めて並列ファイル出力と組み合わせるのが基本です。

bash – 並列4ワーカーでエクスポート
# expdp: parallel=4 の場合 %U が 01〜04 の4ファイルに分割されるexpdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts_%U.dmp \  logfile=users_ts_exp.log \  tablespaces=USERS \  parallel=4# impdp: 同じく parallel=4 で高速インポートimpdp system/password \  directory=DATA_PUMP_DIR \  dumpfile=users_ts_%U.dmp \  logfile=users_ts_imp.log \  tablespaces=USERS \  parallel=4

ポイント:PARALLELはOracle Enterprise Edition + Data Pump機能ライセンスが必要です。Standard Editionでは使用できません。CPUコア数以下のワーカー数を目安に設定しましょう。

ログ確認と実行中の進捗確認

実行中ジョブの進捗を確認する

別ターミナルからexpdp/impdpのジョブに接続してステータスを確認できます。

bash / SQL – 実行中ジョブの確認
-- SQLでData Pumpジョブの状態確認SELECT owner_name, job_name, state, degree,       attached_sessions, datapump_sessionsFROM   dba_datapump_jobsWHERE  state = 'EXECUTING';-- 実行中のexpdp/impdpに再アタッチして進捗確認expdp system/password attach=SYS_EXPORT_TABLESPACE_01-- アタッチ後にSTATUSコマンドで進捗表示Export> STATUS

よくあるエラーと対処法

エラー 原因 対処法
ORA-39002
invalid operation
ディレクトリオブジェクトが存在しない、または権限がない CREATE DIRECTORYでディレクトリ作成後、GRANT READ,WRITE ON DIRECTORYで権限付与
ORA-39166
Object not found
指定した表領域名が存在しない(大文字・小文字に注意) 表領域名は通常大文字。SELECT tablespace_name FROM dba_tablespaces;で確認
ORA-31684
Object already exists
インポート先に同名のオブジェクトが存在する table_exists_action=REPLACEまたはTRUNCATEを指定する
ORA-01658
unable to create INITIAL extent
インポート先の表領域の空き容量不足 表領域を拡張するか、remap_tablespaceで別の表領域に移行
ORA-39083
Object type failed to create
参照先スキーマ・オブジェクトが移行先にない 依存オブジェクトを先にインポートするか、remap_schemaで対応

よくある質問(FAQ)

tablespaces モードとschemas モードの使い分けは?

schemas モードは「特定ユーザーのすべてのオブジェクト」が対象です。1人のユーザーが複数の表領域にオブジェクトを持っている場合でも取得できます。一方 tablespaces モードは「特定の表領域に格納されているオブジェクト」が対象で、複数ユーザーにまたがるオブジェクトも含まれます。ユーザー単位で整理されている場合は schemas、物理配置(表領域)単位で管理している場合は tablespacesを使いましょう。

expdpで取得したdumpfileは古いバージョンのOracleにインポートできますか?

Data Pumpのdumpfileはバージョン間の互換性に注意が必要です。新しいバージョンで取得したdumpfileを古いバージョンにインポートする場合は、expdp時に VERSION=移行先バージョン(例: VERSION=12.2)を指定して互換性のあるフォーマットで出力します。逆(古い→新しい)は基本的に問題ありません。

インポートを途中でキャンセルしたい場合は?

Ctrl+C を押すとインタラクティブモードに入ります。そこで STOP_JOB=IMMEDIATE(即時停止)または KILL_JOB(ジョブ削除)を実行します。

Import> STOP_JOB=IMMEDIATE  -- セーフな停止(再開可能)Import> KILL_JOB            -- ジョブを完全削除

まとめ

Data Pumpによる表領域単位のエクスポート・インポートのポイントを整理します。

やりたいこと 使うパラメータ
表領域単位でエクスポート expdp ... tablespaces=表領域名
表領域単位でインポート impdp ... tablespaces=表領域名
インポート先の表領域を変える remap_tablespace=旧:新
スキーマ名と表領域名を同時に変える remap_schema=旧:新 remap_tablespace=旧:新
大容量を高速処理 parallel=N dumpfile=file_%U.dmp

表領域モードは物理配置に基づいた柔軟なバックアップ・移行を可能にします。remap_tablespace と組み合わせることで、本番から検証環境への環境再構築や、ストレージ再配置もシンプルに実現できます。