[Oracle] インポート時に表領域を移動する | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

インポートでは通常テーブルやインデックスなどのオブジェクトはエクスポートデータベースと同じ表領域にインポートされます。


エクスポートデータベースと異なる表領域にインポートしたい場合はちょっと工夫が必要です。


エクスポートデータベースと異なる表領域にインポートするには、デフォルト表領域を利用する方法と、インポートデータベースにあらかじめオブジェクトを作成しておく方法が考えられます。

1.デフォルト表領域を利用する方法

インポートでは、エクスポートデータベースで使用していた表領域と同じ表領域がインポートデータベースに存在しない場合、エラーにはならず、インポートユーザーのデフォルト表領域にオブジェクトが作成されます。


ゆえにこのような状況にある場合は、インポートユーザーのデフォルト表領域をインポートオブジェクトを格納したい表領域にしてインポートを行えば、エクスポートデータベースと異なる表領域にインポートすることが可能です。


ただし、この方法では、テーブルとインデックスを異なるの表領域に作成したい場合にはうまく対応できないことがあります。


これはデフォルト表領域にはテーブル用とインデックス用の区別がないため、エクスポートデータベースで使用していたテーブル、インデックスの表領域がともにインポートデータベースに存在しない場合には、両方ともインポートユーザーのデフォルト表領域に作成されてしまうからです。


このような場合には、一旦テーブル、インデックスともにデフォルト表領域にインポートした後、ALTER INDEX ~ REBUILD文でインデックス用の表領域を指定してインデックスを再構築するなどしなければなりません。


また、LOB記憶域をテーブルと異なる表領域にしている場合にも同じような問題があります。


ただ、こちらはインデックスの場合よりも深刻で、インポート時にデフォルト表領域は使用されず、

ORA-00959: 表領域'xxxxxx'は存在しません。

というエラーが発生してしまいます。


よってこの方法は使えないということになります。


2.あらかじめオブジェクトを作成しておく方法

Enterprise Managerなどを使ってエクスポートデータベースから出力したテーブルやインデックスの定義文の表領域設定部分を編集し、あらかじめインポートデータベース上で実行してオブジェクトを作成すれば、エクスポートデータベースと異なる表領域にインポートすることが可能です。


この時、通常のインポートを行うと、既にオブジェクトが存在しているために作成エラーが発生してしまいますが、IGNORE=Yというオプションを指定すると、既にオブジェクトが存在していて作成エラーが発生しても無視されるため、あらかじめ作成しておいたテーブルに問題なくデータ行がインポートされます。


この方法であれば、1.の方法では難しかったインデックスやLOB記憶域を異なる表領域に格納するという設定も全く問題ありません。


テーブルやインデックスの数が多すぎる場合には定義文の作成が大変ではありますが、そのような場合には定義文をSQLスクリプトファイルとして常にどこかに保存しておくようにすればいいでしょう。