Oracle 11.2以降で exp/imp によるバックアップ・リストアに失敗する

exp で取得した .dmp ファイルを imp でリストアしようとすると、トリガやビューを作成する際に以下の様なエラーが発生して imp に失敗した。本来あるはずのテーブルが存在しない。



IMP-00017: following statement failed with ORACLE error 942:
IMP-00003: ORACLE error 942 encountered
ORA-00942: table or view does not exist


原因を調べていくと imp が失敗しているというより、 exp の時点でレコード数(行数)が0のテーブルが バックアップ の対象となっていないようだ。調査するとOracleのドキュメントにこの現象についての説明があった。



Oracle Database 11gリリース2(11.2)では、デフォルトで、DEFERRED_SEGMENT_CREATIONパラメータがTRUEに設定されます。
つまり、作成した表は、データの最初の行が表に挿入されるまでセグメントがありません。 オリジナルのエクスポートではセグメントのない表が無視されます。
したがって新しい表を作成しても、エクスポートの前にデータを挿入しないと、それらの表はエクスポートされません。
(データ・ポンプ・エクスポートではこの制限がありません。これはセグメントのない表が無視されないためです。)


Oracle 11.2 から、データが挿入されていない行はセグメントがないため exp の対象とならないとのこと。この動作を決定するパラメータである「DEFERRED_SEGMENT_CREATION」は、ディスク領域の削減のための機能。



「多数の表を作成するけれども、当面はデータを投入しない」といったケースでは、この設定によってディスク領域を節約することができます。
アプリケーションのインストール時などには多数の表が作成されることが多いので、この設定によって時間を短縮することができます。
半面、表に最初の行を挿入する際に新しいセグメントが作成されることになるため、そのタイミングではパフォーマンスが多少劣化することになります。


テーブル定義のディスク領域は大した量ではないため「DEFERRED_SEGMENT_CREATION」はFALSEにする。imp/expが失敗するケースがある事自体が問題。


C:\>sqlplus SYS/manager@dbsrv01 as sysdba

SQL*Plus: Release 11.2.0.1.0 Production
Copyright (c) 1982, 2010, Oracle. All rights reserved.

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
に接続されました。

SQL> SHOW PARAMETER DEFERRED_SEGMENT_CREATION

deferred_segment_creation boolean TRUE

SQL> ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE;

システムが変更されました。

但し、この問題はexpのみでDataPumpでは発生しない。