エクスポート/インポート

パラメータ設定とログ確認が重要。



エクスポート/インポートとは

異なるハードウェア構成およびソフトウェア構成のプラットフォーム上にある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 データベース全体エキスポート/インポートを行う場合は「Y」。
OWNER   なし スキーマ単位モードエキスポート/インポートを行う場合は「Y」。
TABLES なし テーブル単位モードエクスポート/インポートを行う場合、対象テーブル名を指定する。
<指定方法>
TABLES=AAA ←基本
TABLES=('AAA','BBB') ←複数テーブル
TABLES=('AAA%') ←正規表現もできちゃう!
TABLES=('AAA:200012') ←パーティションテーブルの一部を指定
USERID なし 処理実行ユーザを指定する。
PARFILE なし パラメータファイルモード時にパラメータ記述ファイルを指定する。。
FILE expdat.dmp 処理対象ダンプファイルを指定。複数指定も可能。
LOG なし ログファイル出力先。指定すべき。
DIRECT   ダイレクトパスを利用(「Y」)した方が、従来型パスより早くなる可能性が高い。
ROWS 表データ移行フラグ。
表定義のみエキスポートしたいなら「N」。
INDEXES 索引移行フラグ。
GRANTS オブジェクト権限移行フラグ。
CONSTRAINTS 表制約移行フラグ。
TRIGGERS   トリガー移行フラグ。
STATISTICS EXP:ESTIMATE 
IMP:ALWAYS
統計情報の移行方法を指定。統計情報をコピーしたくない場合は「NONE」。
COMPRESS   エクステント圧縮フラグ。
Y:データを1つの初期エクステントに統合しようとする。
N:セグメントの記憶パラメータ設定に従う。
CONSISTENT   データの一貫性を保障したいなら「Y」。
ただし、エクスポート実行時に更新量が多いとロールバックセグメント消費量が大きくなる。
更新の発生しない時間帯に利用するなら「Y」でOK。
COMPILE   パッケージ/プロシージャなどをインポート時にコンパイルするかどうかを指定。
IGNORE   オブジェクト作成エラーの処理方法。
「Y」を指定するとエラーは無視される。
表の定義情報を変更したい場合、あらかじめ作成しておいてインポートというテクニックが有効。
FROMUSER   エキスポート元ユーザを指定。
TOUSER   インポート先ユーザを指定。
FEEDBACK 指定した行数の処理完了ごとにピリオドを表示できる。
大量データを対象に処理する時に、進捗把握のために利用すると便利。
BUFFER OS固有 1回あたりの行フェッチバッファサイズ。
対象データ量が多い場合に大きくすると早くなる場合あり。
基本的にでかいほどパフォーマンス効果高いが、SGA圧迫しない程度にね。ex.10485760(=10M)
RECORDLENGTH OS固有 1回あたりの行フェッチバッファサイズ。
BUFFERと同義。ダイレクトパスエクスポート時は、このパラメータでの指定が必要。
インポートに関しては常にBUFFER指定でいいみたい。インポートで使う機会なし?
COMMIT   「Y」を指定すると各行の挿入後にコミット処理。「N」の場合は表単位にコミット処理。
RBSが極端に大きくなることをふせぎ、大容量インポート時のパフォーマンスが向上する。
なんで、デフォルト「Y」とちゃうのやろ?
FILESIZE OS依存 ダンプファイルの最大サイズ制限(ex.2G)がOSによってはある。
このパラメータにてサイズをしてしておくことで、FILEにて指定した複数ファイルへ分割出力できる。
VOLSIZE OS依存 FILESIZEのテープ使用時バージョン。
INDEXFILE   なし 指定したファイルに索引作成用SQL文が生成される。
CONSTRAINTS にy を設定しておくと表制約も同時に生成。
SHOW   エクスポートファイルの内容が画面に表示される。インポートは実行されない。


ポイント

パラメータ多すぎなのでポイントを整理してみる。

■まずは、実行モード選択
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へインポートする。


エクスポート/インポートについて雰囲気は伝わったでしょうか?
あとは、オプションを変更するなどして、いろいろ試してみよう♪
エラーが出た場合、まずはログ確認で!

 

参考書籍

以下の本の「ExportとImport(第11章)」も参考になると思います。とても役に立った本の一つです。
Oracle使いへの王道

もう1冊宣伝するなら以下の本の「データベースの移行(part7-9)」。こちらもオススメ。
Oracle データベース管理を極める13章