Oracleデータベースのバージョンアップやシステム移行で、異なるバージョン間でのData Pump(expdp/impdp)を使ったデータ転送は多くの現場で発生します。しかし、バージョンが違う環境でそのままダンプファイルをインポートしようとすると、ORA-39142やORA-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を指定 |
versionを指定してエクスポートしても一部オブジェクトがスキップされることがあります。versionパラメータの使い方
上位バージョンのDBから下位バージョンへエクスポートする場合、expdpにversionパラメータを指定します。
基本構文
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を指定してエクスポートする場合、そのバージョンに存在しない機能は自動的にスキップまたはエラーになります。
- 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=replaceとremap_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で事前確認 |
よくあるエラーと対処法
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はOracle 12c Release 2(12.2.0.x)の形式を指定します。version=12のようにメジャーバージョンのみ指定した場合、そのメジャーバージョンの最初のリリース(12.1.0.1)相当として扱われることがあります。移行先のバージョンに合わせてメジャー・マイナー両方を正確に指定することを推奨します。versionパラメータを指定できますが、ダンプファイルに埋め込まれたバージョン情報はエクスポート時のものが使われます。実際に効果があるのはexpdp(エクスポート)時のversion指定です。バージョン互換性の問題を解決するには、必ずエクスポート側で指定してください。sqlfileオプションを使うとDDLをファイルに出力でき、ファイル先頭にエクスポート時のバージョン情報が記載されます。コマンド例:impdp user/pass dumpfile=data.dmp directory=DIR sqlfile=check.sqlOracle 19c以降では
show=yオプションでより簡単に確認できます。exclude=statisticsを推奨します。大規模移行の場合は段階的なバージョンアップも検討してください。COMPATIBLEはDBの初期化パラメータで、どのバージョンの機能まで使用可能かを制御します。一方、versionはData Pumpのエクスポート時に指定するパラメータで、どのバージョン形式でダンプファイルを作成するかを指定します。version=COMPATIBLEと指定すると、DBのCOMPATIBLEパラメータの値に合わせた形式でエクスポートされます。例えばCOMPATIBLE=12.2.0の環境ではversion=12.2相当になります。まとめ
- 下位→上位のインポートは通常通り可能(11g→19cなど)
- 上位→下位はexpdpでversion指定が必要(19c→12cなど)
- versionにはバージョン番号・COMPATIBLE・LATESTが指定できる
- バージョン指定でも新機能を使ったオブジェクトはエクスポートされない場合がある
- インポート時は
data_options=skip_constraint_errors・exclude=statisticsを活用する - ORA-39142はダンプが新しすぎる→エクスポート側でversion指定して再エクスポート
- ORA-31693はUNDO不足→UNDO_RETENTIONの増加か実行時間帯の変更
- 必ずimpdpのログファイルを確認し、スキップ・警告がないかチェックすること

