ORACLE 11g 用exp命令導出庫文件備份時,發現只能導出來一部分表而且不提示錯誤,之前找不到解決方案只能把沒導出來的表重新建建立。後來發現是所有的空表都沒有導出來。於是想好好查查,因為在以前的10g版本中沒有這樣的問題。查資料發現Oracle 11g中有個新特性:新增了一個參數“deferr ...
ORACLE 11g 用exp命令導出庫文件備份時,發現只能導出來一部分表而且不提示錯誤,之前找不到解決方案只能把沒導出來的表重新建建立。後來發現是所有的空表都沒有導出來。於是想好好查查,因為在以前的10g版本中沒有這樣的問題。
查資料發現Oracle 11g中有個新特性:新增了一個參數“deferred_segment_creation”含義是段延遲創建,預設是true。
具體是什麼意思呢?
如果這個參數設置為true,你新建了一個表Table1,並且沒有向其中插入數據,那麼這個表不會立即分配extent,也就是不占數據空間,即表也不分配 segment 以節省空間,所以這些表也沒能導出來。在系統表user_tables中也可以看到segment_treated的欄位里是“NO”或者“YES”說明瞭某張表是否分配了segment。說白了是為了可以節省少量的空間。
用下麵的SQL語句查詢,可以發現沒有導出的表其 segment_created 欄位值都是 'NO'。
Select segment_created,table_name from user_tables where segment_created = 'NO';
解決方法:需要為每張空表添加如下語句
alter table TableName allocate extent
1,查詢當前用戶下的所有空表(一個用戶最好對應一個預設表空間)。命令如下:
SQL>select table_name from user_tables where NUM_ROWS=0;
2,根據上述查詢,可以構建針對空表分配空間的命令語句,如下:
Select 'alter table '||table_name||' allocate extent;' from user_tables where
num_rows=0 or num_rows is null or segment_created = 'NO'
3,執行2中所有語句