【Oracle】バージョンが違うDBでData Pumpを使うときの注意点完全ガイド|version指定・互換性・エラー対処まで

【Oracle】バージョン違いでData Pumpを使うときの注意点|互換性とオプションの違い Oracle

Oracleデータベースのバージョンアップやシステム移行で、異なるバージョン間でのData Pump(expdp/impdp)を使ったデータ転送は多くの現場で発生します。しかし、バージョンが違う環境でそのままダンプファイルをインポートしようとすると、ORA-39142ORA-31693といったエラーが発生することがあります。

本記事では、Data Pumpのバージョン互換性の基本ルールから、versionパラメータの使い方、バージョン別の制限事項、よくあるエラーの対処法まで、実務で役立つ情報を網羅的に解説します。

この記事でわかること

  • Data Pumpのバージョン互換性の基本ルール(上位→下位・下位→上位)
  • versionパラメータの指定方法と使用できる値
  • バージョン指定時に使えない機能・制限事項
  • impdp側の推奨オプション
  • ダンプファイルのバージョン確認方法
  • ORA-39142・ORA-31693などのエラー対処法
  • 実務でよく使うコマンドのまとめ
スポンサーリンク

Data Pumpのバージョン互換性の基本ルール

Data Pumpのバージョン互換性には、以下の基本ルールがあります。

原則:下位→上位は問題なし、上位→下位はversion指定が必要

Data Pumpのダンプファイルには、エクスポートしたOracleのバージョン情報が埋め込まれています。インポート先のバージョンがダンプファイルのバージョン以上であれば通常通りインポートできます。逆に、インポート先のバージョンがダンプファイルより低い場合はそのままではインポートできません

エクスポート元 インポート先 可否 対処
Oracle 11g Oracle 19c ○ そのまま可能 なし
Oracle 12c Oracle 19c ○ そのまま可能 なし
Oracle 19c Oracle 19c ○ 同バージョン なし
Oracle 19c Oracle 12c × そのままは不可 expdpでversion=12.2を指定
Oracle 19c Oracle 11g × そのままは不可 expdpでversion=11.2を指定
Oracle 12c Oracle 11g × そのままは不可 expdpでversion=11.2を指定
Oracle 21c Oracle 19c × そのままは不可 expdpでversion=19.1を指定
注意:バージョンが古い環境へのインポートは、そのバージョンに存在しない機能(Identity列、パーティション新機能など)が含まれている場合、versionを指定してエクスポートしても一部オブジェクトがスキップされることがあります。

versionパラメータの使い方

上位バージョンのDBから下位バージョンへエクスポートする場合、expdpversionパラメータを指定します。

基本構文

expdp user/password \
  dumpfile=data.dmp \
  schemas=HR \
  directory=DATA_PUMP_DIR \
  version=12.2

versionに指定できる値

指定値 意味 使用例
バージョン番号(例: 12.2) そのバージョン向けの形式でエクスポート version=12.2
COMPATIBLE DB初期化パラメータのCOMPATIBLE値に合わせる version=COMPATIBLE
LATEST 現在のDBバージョンで最新形式(デフォルト) version=LATEST

バージョン番号の指定例

  • Oracle 11gR2:version=11.2
  • Oracle 12cR1:version=12.1
  • Oracle 12cR2:version=12.2
  • Oracle 18c:version=18.1
  • Oracle 19c:version=19.1
  • Oracle 21c:version=21.1
ポイント:versionパラメータはexpdp(エクスポート)側でのみ有効です。impdpでも指定できますが、実際にはエクスポート時に指定したバージョンが優先されます。インポート先のDBバージョンと合わせた形式のダンプを作成するには、エクスポート時に指定してください。

version指定時の制限事項

古いバージョン向けにversionを指定してエクスポートする場合、そのバージョンに存在しない機能は自動的にスキップまたはエラーになります。

主な制限事項(version=11.2 を指定した場合の例)

  • Identity列(12c以降):エクスポートされない
  • パーティション新機能(12c以降のInterval-Range等):スキップされる
  • インビジブルカラム(12c以降):含まれない
  • JSON列(21c以降のNative JSON):対応しない
  • VARCHAR2(32767)(12c以降のEXTENDED DATA TYPES):エラーになる場合あり
  • PDB関連オブジェクト(12c以降のマルチテナント):対応しない

version指定時に併用を推奨するオプション

互換性問題を減らすために、以下のオプションを組み合わせて使うことが多いです。

expdp user/password \
  dumpfile=data.dmp \
  schemas=HR \
  directory=DATA_PUMP_DIR \
  version=12.2 \
  exclude=statistics \
  transform=segment_attributes:n
オプション 意味 推奨理由
exclude=statistics 統計情報をエクスポートから除外 バージョン差異による統計情報の非互換を回避
transform=segment_attributes:n セグメント属性(tablespace等)を除外 移行先のtablespace名が異なる場合に有効
exclude=db_link DBリンクを除外 移行先に同名DBリンクがない場合のエラー回避
exclude=grant 権限情報を除外 ユーザー・ロール構成が異なる環境向け

impdp側の推奨オプション

バージョンが異なるDB間のインポートでは、impdp側でも以下のオプションを指定するとエラーを減らしてスムーズにインポートできます。

impdp user/password \
  dumpfile=data.dmp \
  schemas=HR \
  directory=DATA_PUMP_DIR \
  data_options=skip_constraint_errors \
  transform=oid:n \
  exclude=statistics
オプション 効果 使い所
data_options=skip_constraint_errors 制約違反エラーをスキップしてインポート続行 FK制約・UNIQUE制約違反が発生しやすい移行時
transform=oid:n オブジェクトのOIDを再生成 同じDB内に同名オブジェクトが存在する場合
exclude=statistics 統計情報をインポートしない 移行後にDBMS_STATSで再収集するため
table_exists_action=replace 既存テーブルをDROPして再作成 既存テーブルを完全に置き換えたい場合
table_exists_action=append 既存テーブルにデータを追加 データを追記したい場合
remap_schema=old:new スキーマ名を変更してインポート 異なるスキーマ名の環境へ移行する場合
remap_tablespace=old:new tablespace名を変更してインポート 異なるtablespace構成の環境へ移行する場合
実務のポイント:バージョン移行時はtable_exists_action=replaceremap_tablespaceの組み合わせが頻繁に使われます。統計情報はexclude=statisticsで除外し、インポート後にDBMS_STATS.GATHER_SCHEMA_STATSで再収集するのがベストプラクティスです。

ダンプファイルのバージョン確認方法

入手したダンプファイルが何バージョンでエクスポートされたかを確認する方法を説明します。

方法1:impdpのSQLFILEオプション

sqlfileオプションを指定すると、実際にインポートせずDDLをファイルに出力できます。ファイル先頭にバージョン情報が含まれます。

impdp user/password \
  dumpfile=data.dmp \
  directory=DATA_PUMP_DIR \
  sqlfile=check.sql

出力されたcheck.sqlの先頭部分にバージョン情報が記載されます:

-- EXPORT FILE CREATED BY EXPORT:V19.00.00.00.00 AND IMPORT COMPATIBLE: 19.00.00.00.00
-- EXPORT DUMP FILE VERSION IS: 19.00.00.00.00
-- EXPORT COMPATIBILITY VERSION IS: 19.00.00.00.00

方法2:impdpのSHOW=Yオプション(19c以降)

Oracle 19c以降ではshow=yオプションでダンプファイルの内容確認が簡単にできます。

impdp user/password \
  dumpfile=data.dmp \
  directory=DATA_PUMP_DIR \
  show=y

方法3:V$DATAPUMP_JOBで確認

ジョブ実行中は以下のビューで状況確認できます。

-- 実行中のData Pumpジョブを確認
SELECT job_name, operation, job_mode, state, degree
FROM   v$datapump_job;

バージョン別の主な互換性制限

よく発生するバージョン組み合わせごとの主な制限事項をまとめます。

19c → 12c への移行

機能 制限内容 対処
Automatic Indexing エクスポートされない 手動でインデックス作成
Real-Time Statistics 統計情報がスキップされる exclude=statisticsで除外し再収集
Polymorphic Table Functions スキップされる 移行後に手動作成
Blockchain Table サポートなし 代替設計が必要
JSON Relational Duality サポートなし(21c以降) 対象外

12c → 11g への移行

機能 制限内容 対処
Identity列(GENERATED AS IDENTITY) エクスポートされない シーケンス+デフォルト値に変換
インビジブルカラム エクスポートされない 移行後に手動追加
VARCHAR2(32767) エラーが発生する場合あり VARCHAR2(4000)以内に変更
マルチテナント関連 サポートなし 対象外
Temporal Validity エクスポートされない 手動対応が必要

21c → 19c への移行

機能 制限内容 対処
Native JSON型 19cではBLOBに変換される 移行後にデータ型確認
Blockchain Table(21c新機能部分) 一部制限あり 設計の見直しが必要
IF EXISTS構文 DDL内の新構文がスキップされる場合あり SQLFILEで事前確認
重要:バージョン指定でエクスポートしてもエラーなくimpdpが完了したとしても、一部のオブジェクトがサイレントにスキップされることがあります。必ずimpdpのログファイルを確認し、スキップ・警告がないかチェックしてください。

よくあるエラーと対処法

ORA-39142: ダンプファイルのバージョンが新しい

ORA-39142: incompatible version number 19.1 in dump file
"DATA_PUMP_DIR":"data.dmp"

原因:インポート先のOracleバージョンより新しいバージョンでエクスポートされたダンプファイルをインポートしようとしている。

対処:エクスポート元でversionパラメータにインポート先のバージョンを指定して再エクスポートする。

# エクスポート元(19c)でインポート先(12c)向けに再エクスポート
expdp user/password \
  dumpfile=data_for_12c.dmp \
  schemas=HR \
  directory=DATA_PUMP_DIR \
  version=12.2

ORA-31693: オブジェクトのロードに失敗

ORA-31693: Table data object "HR"."EMPLOYEES" failed to load/unload
ORA-02354: error in exporting/importing data
ORA-01555: snapshot too old

原因:エクスポート中にSNAPSHOT TOO OLD(UNDO領域の不足)が発生している。大きなテーブルや長時間のエクスポートで起きやすい。

対処:

  • UNDO表領域のサイズを増やす
  • UNDO_RETENTIONパラメータを増やす
  • エクスポート対象を分割して実行する
  • 夜間など更新が少ない時間帯に実行する
-- UNDO領域の使用状況確認
SELECT tablespace_name, status, sum(blocks), sum(bytes)/1024/1024 AS mb
FROM   dba_undo_extents
GROUP  BY tablespace_name, status;

-- UNDO_RETENTIONの確認と変更(DBA権限必要)
SELECT name, value FROM v$parameter WHERE name = 'undo_retention';
ALTER SYSTEM SET undo_retention = 3600;  -- 3600秒(1時間)

ORA-39341: 新機能を含むオブジェクト

ORA-39341: object type TABLE:"HR"."EMPLOYEES" contains
features not supported in version 12.2

原因:エクスポート対象のオブジェクトが、指定したversionではサポートされていない機能を使用している。

対処:

  • エラーの原因となっているオブジェクト・機能を特定する
  • そのオブジェクトをエクスポート対象から除外する(exclude=TABLE:"TABLENAME"
  • 手動で移行先バージョン対応のDDLに書き直してインポートする

ORA-31684: オブジェクトが既に存在する

ORA-31684: Object type USER:"HR" already exists

原因:インポート先にすでに同名のユーザー・オブジェクトが存在している。

対処:table_exists_action=replaceまたはexclude=userを指定する。詳しくはORA-31684の対処法を参照。

実務でよく使うコマンドまとめ

用途 コマンド例 備考
上位→下位へのエクスポート expdp user/pass schemas=HR directory=DIR dumpfile=data.dmp version=12.2 versionに移行先のバージョンを指定
統計情報を除外してエクスポート expdp user/pass schemas=HR directory=DIR dumpfile=data.dmp version=12.2 exclude=statistics バージョン差異による統計問題を回避
制約エラーを無視してインポート impdp user/pass dumpfile=data.dmp directory=DIR data_options=skip_constraint_errors FK違反等をスキップして続行
スキーマを変更してインポート impdp user/pass dumpfile=data.dmp directory=DIR remap_schema=HR:HR_NEW 異なるスキーマ名の環境への移行
テーブルスペースを変更してインポート impdp user/pass dumpfile=data.dmp directory=DIR remap_tablespace=USERS:DATA 異なるtablespace構成の環境へ
ダンプファイルのバージョン確認 impdp user/pass dumpfile=data.dmp directory=DIR sqlfile=check.sql ファイル先頭にバージョン情報が出力される
既存テーブルを置き換えてインポート impdp user/pass dumpfile=data.dmp directory=DIR table_exists_action=replace DROP後に再作成するため注意
ジョブ実行状況の確認 SELECT * FROM v$datapump_job; 実行中ジョブのステータス確認

よくある質問(FAQ)

version=12.2 と version=12 の違いは何ですか?
version=12.2はOracle 12c Release 2(12.2.0.x)の形式を指定します。version=12のようにメジャーバージョンのみ指定した場合、そのメジャーバージョンの最初のリリース(12.1.0.1)相当として扱われることがあります。移行先のバージョンに合わせてメジャー・マイナー両方を正確に指定することを推奨します。
impdp側でもversionを指定できますか?
impdp側でもversionパラメータを指定できますが、ダンプファイルに埋め込まれたバージョン情報はエクスポート時のものが使われます。実際に効果があるのはexpdp(エクスポート)時のversion指定です。バージョン互換性の問題を解決するには、必ずエクスポート側で指定してください。
ダンプファイルのバージョンはどこで確認できますか?
impdpのsqlfileオプションを使うとDDLをファイルに出力でき、ファイル先頭にエクスポート時のバージョン情報が記載されます。コマンド例:impdp user/pass dumpfile=data.dmp directory=DIR sqlfile=check.sql
Oracle 19c以降ではshow=yオプションでより簡単に確認できます。
Oracle 11g から 21c への移行で注意することは?
11g→21cは2つのメジャーバージョンをまたぐため、比較的スムーズにインポートできます(下位→上位)。ただし文字コード(AL32UTF8推奨)や初期化パラメータの変更、廃止された機能(DBMS_METADATA等の挙動変化)への対応が必要です。また、11gのダンプをそのままインポートすると一部の統計情報やセグメント属性が引き継がれるため、exclude=statisticsを推奨します。大規模移行の場合は段階的なバージョンアップも検討してください。
COMPATIBLEパラメータとversionパラメータの違いは何ですか?
COMPATIBLEはDBの初期化パラメータで、どのバージョンの機能まで使用可能かを制御します。一方、versionはData Pumpのエクスポート時に指定するパラメータで、どのバージョン形式でダンプファイルを作成するかを指定します。version=COMPATIBLEと指定すると、DBのCOMPATIBLEパラメータの値に合わせた形式でエクスポートされます。例えばCOMPATIBLE=12.2.0の環境ではversion=12.2相当になります。

まとめ

Data Pumpバージョン互換性のポイント

  • 下位→上位のインポートは通常通り可能(11g→19cなど)
  • 上位→下位はexpdpでversion指定が必要(19c→12cなど)
  • versionにはバージョン番号・COMPATIBLE・LATESTが指定できる
  • バージョン指定でも新機能を使ったオブジェクトはエクスポートされない場合がある
  • インポート時はdata_options=skip_constraint_errorsexclude=statisticsを活用する
  • ORA-39142はダンプが新しすぎる→エクスポート側でversion指定して再エクスポート
  • ORA-31693はUNDO不足→UNDO_RETENTIONの増加か実行時間帯の変更
  • 必ずimpdpのログファイルを確認し、スキップ・警告がないかチェックすること

あわせて読みたい