oracle 11g deferred_segment_creation段延遲建立

聽海★藍心夢發表於2011-07-13
今天早上一大早,同事就說系統無法登入。檢視報錯資訊居然是:ORA-00942: 表或檢視不存在
因為昨晚給資料庫做了雙機dataguard,為了確保割接順利進行,我把備庫的資料庫刪了重新匯入了,今天早上又把備庫的資料恢復。難道是備庫中少匯入了表?
檢視昨晚備庫的匯出日誌,確實沒有這部分表。同事說這些表他確實是建在備庫上了。感覺非常奇怪,但是各種備份日誌都查不到錯誤資訊,而且備庫的備份日誌顯示:“成功終止匯出, 沒有出現警告。”檢視匯出列表,確實沒這些表。詭異的~~~
最後想到用的庫是最新版本的ORACLE 11R2,懷疑是遇到BUG了。一查資料發現,原來是ORACLE 11R2新引數的問題。
ORACLE 11g 新增了一個引數:deferred_segment_creation,從字面理解含義是段延遲建立,該引數取值範圍是true和false,預設是true。具體是如果deferred_segment_creation為true,當新建表並且沒有向其中插入資料的時候,這個表不會立即分配extent,即不佔資料空間,只有insert資料後才分配空間,這樣做可以節省少量的空間。但是也給初接觸oracle 11g的人帶來了麻煩,我就是受害者之一!!!
如果deferred_segment_creation為false,那就和之前版本建立表一樣,建立時即分配extent。
 
一、問題提出
如果deferred_segment_creation為預設值,當透過EXP命令來匯出整個使用者時,所有沒有資料的表都導不出來。
二、問題分析
1、新建表沒有分配extent,在user_segments檢視中必然查不到,但是在user_tables中是可以查到的。這樣就可以找出哪些表是沒有建立extent的:
select * from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
 
2、透過alter table xxx allocate extent 語句立即為其分配extent:
 
alter table t1 allocate extent (size 64k);
 
三、問題解決
 
1、批次處理所有“空表”:
select 'alter table '||table_name||' allocate extent(size 64k);' sql_text,table_name,tablespace_name
from user_tables
where table_name not in
(select segment_name from user_segments where segment_type = 'TABLE');
2、把sql_text列在sqlplus中執行一下就可以透過exp匯出。
 
3、如果覺得每次匯出都這樣做太麻煩,完全可以將deferred_segment_creation引數調為false,這樣調整後建的表都會立即分配空間,但是調整前的表都不會改變,因此還需要用1、2提到的辦法解決。
--調整deferred_segment_creation為false:
SQL> alter system set deferred_segment_creation=false;
--調整deferred_segment_creation為預設值:
SQL> alter system reset deferred_segment_creation;
 
四、其他方法
 
1、現在網上提到的辦法都是先往表中間insert一條資料,然後再rollback,使之分配空間。但是每次建表都這樣做也是比較麻煩,不推薦。
2、透過move(alter table table_name move;)的辦法也能得到相同的效果,因為move會使部分索引失效,所以也不推薦。
如果空間不是很緊張,還是建議把這個引數改成false。不過,如果你是用expdp代替exp的話,就不會出現這個問題。而且expdp比exp要快,只是exp先入為主,大家都比較習慣是用exp。oracle新增deferred_segment_creation這個引數的目的難到只是為了節省一點空間麼?而且也只是在建立表時沒分配extent,當插入資料的時候並不會節省空間,還是順便推薦大家以後多使用expdp?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-702058/,如需轉載,請註明出處,否則將追究法律責任。

相關文章