在以往的項目中我們遇到這樣一種情況,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語句執行後,再進行導出即可。