在給客戶培訓的過程中,發現客戶數據庫服務器存在一個奇怪的現象。客戶數據庫服務器環境爲AIX6+Oracle11gR2,具體現象如下:
執行EXP導出時,部分表提示 EXP-00011:表不存在錯誤,但是查詢user_all_tables視圖,此表確實是存在的,並且執行select語句也能成功,不過表爲空表,查看權限等也沒有問題。後來通過查詢資料,發現問題是由Deferred Segment Creation參數引起的。
Deferred Segment Creation,延遲段創建,Oracle11gR2新增參數, 具體用處是當新創建一個可能會有Segment的對象時,如果這個對象中還沒有任何記錄需要消耗一個Extent,那麼將不會在創建對象時自動創建Segment,這樣做的好處是在創建對象時大大提高了速度。但是這麼一來,因爲對象沒有Segment,執行EXP導出時,就會報EXP-00011錯誤。
以報錯的表cf_template爲例,執行以下查詢:
SQL> show parameter DEFERRED_SEGMENT_CREATION
NAME TYPE VALUE
------------------------------------ -------------------- --------------------
deferred_segment_creation boolean TRUE
發現Deferred Segment Creation已經打開,再執行:
SQL> select segment_name from user_segments where segment_name='CF_TEMPLATE';
no rows selected
沒有返回值,數據庫確實沒有給CF_TEMPLATE表創建Segment,這就驗證了爲什麼報錯的都是空表。
解決方法如下:
1. 設置deferred_segment_creation的值爲false
此方法只對以後的表有效,之前的表沒有Segment的還是沒有。
2. 創建表的時候聲明立即創建Segment
create table XXX (XXX XXX) SEGMENT CREATION IMMEDIATE;
3.對於已經創建但是還沒有Segment的表來說,可以執行alter table XXX allocate extent來使其創建出 Segment,當然也可以插入一條數據,使其創建Segment
http://www.360doc.com/content/14/0110/11/12809984_344064608.shtml