Oracle エクスポート/インポート
目次
はじめに
Oracle のエクスポート/インポートツールには大別して2種類があります。
exp(Export)/imp(Import)expdp(Data Pump Export)/impdp(Data Pump Import)
exp / imp は古くからあるツールで、expdp / impdp は Oracle 10g から追加された後発のエクスポート/インポートツールです。両者のファイルフォーマットには互換性がなく、現在では expdp / impdp の利用が推奨されていますが、現場では exp / imp が使われることもあります。
exp / imp では PC 内のローカルフォルダを自由に指定できましたが、expdp / impdp では Oracle のディレクトリオブジェクトを必ず経由する必要があるため、exp / imp のほうが手軽に使用できるメリットがあります。DB 管理者でない場合、ディレクトリオブジェクトの作成を依頼する必要もあったりします。この違いは、従来の exp / imp がクライアント側で動作するのに対し、expdp / impdp はサーバー側で動作する、という仕組みの違いから生じています。expdp / impdp はサーバー側で動作するため高速で並列処理も可能というメリットがあります。
このメモ書きでは、よく使う形式での両者の使用方法をシンプルに整理します。
exp(Export)
exp ユーザー名/パスワード file=ダンプファイル名 owner=スキーマ名 statistics=none
例)
exp HOGE/hoge file=HOGE_20220921_1431.dmp owner=HOGE statistics=none
d ※statistics=none は「統計情報を出力しない」という意味になります。ほとんどのケースではインポート先で統計情報を再収集するので、 statistics=none として省略するのが一般的です。
imp(Import)
imp ユーザー名/パスワード file=ダンプファイル名 fromuser=インポート元のスキーマ touser=インポート先のスキーマ ignore=y
fromuser、touser が少しわかりにくいですが、
fromuser: ダンプファイル内に格納されている元のスキーマ名(エクスポート時の owner)
ダンプファイル内に存在しないスキーマを指定した場合、何もインポートされません。touser: インポート先のスキーマ名(データを入れる先)
インポート先のスキーマはあらかじめ作成しておく必要があります。
存在しないスキーマを指定するとエラーになります。
例)
imp HOGE_20220921/hoge file=HOGE_20220921_1431.dmp fromuser=HOGE touser=HOGE_20220921 ignore=y
expdp(Data Pump Export)
expdp ユーザー名/パスワード DUMPFILE=ダンプファイル名 SCHEMAS=スキーマ名
例)
expdp Hoge/hoge DUMPFILE=HOGE_20220921_1531.dmp SCHEMAS=Hoge
ダンプファイルはディレクトリオブジェクトのフォルダ内に作成されます。
サブディレクトリを指定することはできません。
デフォルト(DATA_PUMP_DIR)のディレクトリオブジェクトのフォルダは以下の SQL で取得できます。
SELECT * FROM ALL_DIRECTORIES
WHERE DIRECTORY_NAME = 'DATA_PUMP_DIR';
| OWNER | DIRECTORY_NAME | DIRECTORY_PATH | ORIGIN_CON_ID |
|---|---|---|---|
| SYS | DATA_PUMP_DIR | C:\app\oracle\admin\orcl\dpdump\ | 0 |
デフォルト以外のフォルダに出力したい場合はディレクトリオブジェクトを作成し、directory オプションで指定します。
impdp(Data Pump Import)
expdp と同様にダンプファイルはディレクトリオブジェクトが定義されているフォルダに配置する必要があります。
デフォルトではエクスポート時と同名の表領域にインポートしようとし、同じ表領域がない場合はエラーになるので、明示的に表領域(エクスポート時の表領域:インポート先の表領域)を指定する必要があります。
impdp ユーザー名/パスワード dumpfile=ダンプファイル名 schemas=エクスポート時のスキーマ remap_schema=エクスポート時のスキーマ:インポート先のスキーマ table_exists_action=replace remap_tablespace=エクスポート時の表領域:インポート先の表領域
例)
impdp HOGE_20220921/hoge dumpfile=HOGE_20220921_1531.DMP schemas=HOGE remap_schema=HOGE:HOGE_20220921 table_exists_action=replace remap_tablespace=HOGE_TABLESPACE:USERS
impdp で ORA-39358 が発生した時
C:\hoge>impdp HOGE_20220921/hoge dumpfile=HOGE_20220921_1531.DMP schemas=HOGE remap_schema=HOGE:HOGE_20220921 table_exists_action=replace remap_tablespace=HOGE_TABLESPACE:USERS
Import: Release 12.2.0.1.0 - Production on 木 10月 23 14:30:55 2025
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
ORA-39002: 操作が無効です
ORA-39358: エクスポート・ダンプ・ファイルのバージョン19.0.0.0.0はターゲットのバージョン12.2.0と互換性がありません
上位バージョンで expdp したダンプファイルは 下位バージョンではインポートできない、というエラーです。
Google 検索すると「expdp で VERSION を指定しておく」という解決策が出てきますが、expdp し直すことができないケースもあります。
実は impdp でVERSION に上位バージョンを指定するとインポートできます 。
以下のようにエクスポートしたバージョンを指定します。
impdp HOGE_20220921/hoge dumpfile=HOGE_20220921_1531.DMP schemas=HOGE remap_schema=HOGE:HOGE_20220921 table_exists_action=replace remap_tablespace=HOGE_TABLESPACE:USERS VERSION=19
バージョンチェックがスキップされるだけなので、バージョン間で互換性のないデータはインポートできないと思いますが、特殊なデータ型が含まれていないケースではデータをインポートできます。困った時には試してみてください。