異なるハードウェア構成およびソフトウェア構成のプラットフォーム上にあるOracle データベース間で、データオブジェクトの転送を行うためのオラクル標準ツール。
「エクスポート」にてDB情報(オブジェクト定義や表データなど)をダンプファイルに抽出し、
「インポート」にてダンプファイルの情報を利用してDB情報を出力する。
各ユーティリティはOSコマンド「exp」「imp」とパラメータオプションを指定して実行する。
エクスポート実行方法には以下の3種類がある(インポートの場合はexp部分がimpに変わるだけ)。
■コマンドライン
$ exp [パラメータ]...
コマンドの後ろにパラメータを列記して実行する。
■対話方式
$ exp
プロンプトにパラメータが表示されるので、随時入力して実行する(基本的なパラメータしか指定できない)。
■パラメータファイル
$ exp parfile={ファイル名}
ファイルにパラメータを記述しておき、parfileにて指定して実行する。
基本的にこの方法を採用すべき。記録が残るし流用も簡単だから。
(どの実行方法でも)利用するためには以下のオラクル権限が必要。
CREATE SESSION
EXP_FULL_DATABASE ←別のユーザ所有の表をエキスポートしたい時。
IMP_FULL_DATABASE ←別のユーザ所有の表をインポートしたい時。
移行対象のレベルに応じて以下の3モードが用意されている。
・データベース全体
・スキーマ単位
・テーブル単位
※詳しくは後述パラメータ一覧参照
パラメータファイル起動時の基本的な実行方法は以下のとおり。
エクスポート:exp parfile=パラメータファイル名
インポート :imp parfile=パラメータファイル名
処理実行時のオプションはパラメータファイルに記述して処理を行う。
基本的なパラメータを以下に示す。
パラメータ | EXP | IMP | デフォルト値 | 説明 |
FULL | ○ | ○ | N | データベース全体エキスポート/インポートを行う場合は「Y」。 |
OWNER | ○ | なし | スキーマ単位モードエキスポート/インポートを行う場合は「Y」。 | |
TABLES | ○ | ○ | なし | テーブル単位モードエクスポート/インポートを行う場合、対象テーブル名を指定する。 <指定方法> TABLES=AAA ←基本 TABLES=('AAA','BBB') ←複数テーブル TABLES=('AAA%') ←正規表現もできちゃう! TABLES=('AAA:200012') ←パーティションテーブルの一部を指定 |
USERID | ○ | ○ | なし | 処理実行ユーザを指定する。 |
PARFILE | ○ | ○ | なし | パラメータファイルモード時にパラメータ記述ファイルを指定する。。 |
FILE | ○ | ○ | expdat.dmp | 処理対象ダンプファイルを指定。複数指定も可能。 |
LOG | ○ | ○ | なし | ログファイル出力先。指定すべき。 |
DIRECT | ○ | N | ダイレクトパスを利用(「Y」)した方が、従来型パスより早くなる可能性が高い。 |
|
ROWS | ○ | ○ | Y | 表データ移行フラグ。 表定義のみエキスポートしたいなら「N」。 |
INDEXES | ○ | ○ | Y | 索引移行フラグ。 |
GRANTS | ○ | ○ | Y | オブジェクト権限移行フラグ。 |
CONSTRAINTS | ○ | ○ | Y | 表制約移行フラグ。 |
TRIGGERS | ○ | Y | トリガー移行フラグ。 | |
STATISTICS | ○ | ○ | EXP:ESTIMATE IMP:ALWAYS |
統計情報の移行方法を指定。統計情報をコピーしたくない場合は「NONE」。 |
COMPRESS | ○ | Y | エクステント圧縮フラグ。 Y:データを1つの初期エクステントに統合しようとする。 N:セグメントの記憶パラメータ設定に従う。 |
|
CONSISTENT | ○ | N | データの一貫性を保障したいなら「Y」。 ただし、エクスポート実行時に更新量が多いとロールバックセグメント消費量が大きくなる。 更新の発生しない時間帯に利用するなら「Y」でOK。 |
|
COMPILE | ○ | N | パッケージ/プロシージャなどをインポート時にコンパイルするかどうかを指定。 | |
IGNORE | ○ | N | オブジェクト作成エラーの処理方法。 「Y」を指定するとエラーは無視される。 表の定義情報を変更したい場合、あらかじめ作成しておいてインポートというテクニックが有効。 |
|
FROMUSER | ○ | N | エキスポート元ユーザを指定。 | |
TOUSER | ○ | N | インポート先ユーザを指定。 | |
FEEDBACK | ○ | ○ | 0 | 指定した行数の処理完了ごとにピリオドを表示できる。 大量データを対象に処理する時に、進捗把握のために利用すると便利。 |
BUFFER | ○ | ○ | OS固有 | 1回あたりの行フェッチバッファサイズ。 対象データ量が多い場合に大きくすると早くなる場合あり。 基本的にでかいほどパフォーマンス効果高いが、SGA圧迫しない程度にね。ex.10485760(=10M) |
RECORDLENGTH | ○ | ○ | OS固有 | 1回あたりの行フェッチバッファサイズ。 BUFFERと同義。ダイレクトパスエクスポート時は、このパラメータでの指定が必要。 インポートに関しては常にBUFFER指定でいいみたい。インポートで使う機会なし? |
COMMIT | ○ | N | 「Y」を指定すると各行の挿入後にコミット処理。「N」の場合は表単位にコミット処理。 RBSが極端に大きくなることをふせぎ、大容量インポート時のパフォーマンスが向上する。 なんで、デフォルト「Y」とちゃうのやろ? |
|
FILESIZE | ○ | ○ | OS依存 | ダンプファイルの最大サイズ制限(ex.2G)がOSによってはある。 このパラメータにてサイズをしてしておくことで、FILEにて指定した複数ファイルへ分割出力できる。 |
VOLSIZE | ○ | ○ | OS依存 | FILESIZEのテープ使用時バージョン。 |
INDEXFILE | ○ | なし | 指定したファイルに索引作成用SQL文が生成される。 CONSTRAINTS にy を設定しておくと表制約も同時に生成。 |
|
SHOW | ○ | N | エクスポートファイルの内容が画面に表示される。インポートは実行されない。 |
パラメータ多すぎなのでポイントを整理してみる。
■まずは、実行モード選択
FULL or OWNER or TABLES
■ファイル設定は基本
PARFILE / FILE / LOG
■移行対象とするか?
ROWS / INDEXES / GRANTS / CONSTRAINTS / TRIGGERS / STATISTICS
■移行先への反映方法は?
COMPRESS / CONSISTENT / COMPILE / IGNORE
■パフォーマンスを考慮しとこう
DIRECT / BUFFER / RECORDLENGTH
■別スキーマへのインポートなら
FROMUSER / TOUSER
他のパラメータは微調整レベル(?)
■インポート時間短縮テク
インデックス付きテーブルへデータをインポートする場合、一旦インデックスを削除してからインポート処理を実行した方がパフォーマンスは向上する。
理由:インデックスがある状態でインポートを実行すると、データ挿入単位ごとにインデックスメンテナンス処理が発生してしまうから。
具体的な手順はこんな感じ。
1.移行元環境にて、エクスポート処理を実行(INDEXES=Y)。
2.移行先環境にて、対象テーブルのインデックスを全部削除。
ex. drop index AAA;
3.移行先環境にて、インポート処理を実行(INDEXES=Y)。
インデックスは、データ挿入完了後に自動的に作成される。
■ヘルプ表示
exp help=y にて、コマンドパラメータなどヘルプ情報を表示できる。
■バージョン注意
上位バージョンのエクスポートにて生成したダンプファイルを、下位バージョンのインポート処理にて使用することはできない。
■他のツールも検討するべし
データ移行の方法は「エクスポート/インポート」だけではない。
SQL*LoaderやFast Unload for Oracleなどパフォーマンスに優れたツールもある。
OSとオラクルバージョンが同じ環境でのDB移行なら、オフラインバックアップコピーの方がよっぽど確実だし。
状況に応じて柔軟に対応できるようになるといいんだろな。
いくつか記載しとこう。
例1)表モードでのエクスポート
$ exp system/***** parfile=params1.dat log=20040601.log
-- params.dat --
file=expdat.dmp
tables=(scott.emp,blake.dept)
grants=y
direct=y
---------------
scottのテーブルempとblakeのテーブルdeptをファイルexpdat.dmpにエクスポートする。
記述しなかったパラメータについては、デフォルト値が採用される。
logの指定のように、コマンドとパラメータを混ぜて記述することも可能。
例2)表モードでのインポート
$ imp system/***** parfile=params2.dat
--- params2.dat ---
file=expdat.dmp
fromuser=scott
touser=blake
tables=(*)
---------------
ファイルexpdat.dmpを利用して、scottのテーブル全て(例1引継ぎならempのみ)をblakeへインポートする。
エクスポート/インポートについて雰囲気は伝わったでしょうか?
あとは、オプションを変更するなどして、いろいろ試してみよう♪
エラーが出た場合、まずはログ確認で!