EXP-00003:未找到的存儲定義,處理Oracle11g導出空表,導出時不含空表(缺少表)的情況,空表分配Segment空間,

        在以往的項目中我們遇到這樣一種情況,Oralce數據庫導出後,在目標庫上做導入時發現缺表、少表,這是什麼原因導致的呢?

        原來Oracle11g中有個新特性,當表中無數據時,數據庫不會給空表分配Segment,以節省空間。

        那麼如何處理空表的導出或給空表分配Segment空間呢?

      方法一:

        在空表中insert一行記錄,再Rollback回滾就產生Segment了

        該方法是在在空表中插入數據,再刪除,則產生Segment,導出時則可導出分配了Segment的“空表”。

      方法二:

        設置Oracle數據庫deferred_segment_creation參數

        登錄Oracle DBA用戶,查看deferred_segment_creation當前值,默認爲true,將其修改爲false即可。

SQL> show parameter deferred_segment_creation 
NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
deferred_segment_creation            boolean     TRUE 
SQL> alter system set deferred_segment_creation=false; 
系統已更改。 
SQL> show parameter deferred_segment_creation 
NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
deferred_segment_creation            boolean     FALSE

        *需注意的是:該值修改後對已經存在的空表不產生作用,只對設置後的庫和表有效。如需導出之前的空表,只能用第一種方法。

        下面提供一種對已經存在的空表 導出的批量處理方法:

        首先使用下面的sql語句查詢一下當前用戶下的所有空表

        select table_name from user_tables where NUM_ROWS=0;

        然後用一下SQL語句執行查詢

        select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

        執行結果如下:

        alter table tabName1 allocate extent;

        alter table tabName2 allocate extent;

        alter table tabName3 allocate extent;

        alter table tabName4 allocate extent;

        粘貼上面的SQL語句執行後,再進行導出即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章