甘いもん好きおやじのブログ

日常の面白いことを描きます。

【ORACLE】フツーのエクスポート・インポートとデータポンプの違い

ORACLEデータベースのバックアップの仕方の一つ
ORACLEデータベースのバックアップと聞いて、まず思い浮かぶのがエクスポート、インポートコマンドだと思います。
10gからは、その高機能版であるデータポンプが登場しました。
※ここでは、エクスポート、インポートコマンドはexp/imp、データポンプはexpdp/impdpと呼びます。
exp/imp、expdp/impdpで取得できるORACLEのデータは、何でしょうか?
私は以下の図の範囲だと考えています。

イメージ 1


よくテーブルをエクスポートして、他のデータベースにインポートすることがあります。
これは、エクスポート元とインポート先のディスクの違いやOSの違いを意識せずに出来ます。
DBAが物理的な部分ディスクとか表領域を揃えて置けば、テーブルを持ってくる開発者の人はテーブル名だけを意識していればいいわけです。
また、ディスクとディレクトリまでしか準備出来ていなくても、表領域ごと持ってくることが出来るので、データベースの移行の時にも使います。
テーブル一つから、データベース全体まで気軽に取得し、入れるときは必要なものを指定して入れることが出来ます。
確かにORACLEのオブジェクトについてのの知識は必要だし、オプションも豊富なので高度な使い方をするには勉強が必要になりますが、使いこなせるようになると職場で重宝がられます。

■exp/impとexpdp/impdpの違い
・exp/imp
 10gまでサポートされている。11gからはサポートされていない。
 こんな感じのコマンド。
  exp xxx/xxx file=a.dmp log=a.log tables=a
  imp xxx/xxx file=a.dmp log=a_imp.log tables=a
 すぐに使える
 数百万クラスのテーブル

・expdp/impdp
 使うにあたり準備がいる
  ディレクトリを作る
   create or replace directory DUMPDIR as '';
   grant read,write on directory DUMPDIR to xxx;
  sterams_poolを設定
 こんな感じのコマンド。
 expdp xxx/xxx dumpfile=a.dmp logfile=a.log tables=a
 impdp xxx/xxx dumpfile=a.dmp logfile=a_imp.log tables=a
 数千万クラス

exp/impよりもexpdp/impdpの方が、内部動作が複雑だし設定をミスっているとORA-エラーが出て対処が必要になる場合もあり敷居が高い印象です。
私も使う前はそうでした。
10gの頃のデータポンプはまだバグが多く取得に時間が掛かったりするデータ型があったりして、expで対応することも多かったです。
実際、数百万件の単純な型しか持たないテーブルだと差は感じないのですが、LOBや構造体など複雑な型を持つテーブルを数千万県単位で取得するときあh、その速度の違いに驚きました。
インポートに関しても同じようにデータポンプの方が速いです。