標籤:io ar sp 資料 div on 問題 工作 bs
oracle 11g 新增了一個參數:deferred_segment_creation,含義是段延遲建立,預設是true。具體是什麼意思呢?
如果這個參數設定為true,你建立了一個表T1,並且沒有向其中插入資料,那麼這個表不會立即分配extent,也就是不佔資料空間,只有當你insert資料後才分配空間。這樣可以節省少量的空間。
一、問題提出:
這帶來一個問題:如果你通過EXP命令來匯出整個使用者時,你會發現所有沒有資料的表都導不出來。如何解決這個問題呢?
二、問題分析:
1、既然建立的表沒有分配extent,那麼在user_segments視圖中必然查不到,但是在user_tables中一定是能查到的,這樣我們只要找到user_tables中有的,並且user_segments中沒有的表,就能找出來哪些表是沒有建立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、為了一次性批量把所有這樣的“空表”都解決,可以通過批量sql實現:
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的文法:
conn /as sysdba
alter system set deferred_segment_creation=false;
--如果還想調回來:
conn /as sysdba
alter system reset deferred_segment_creation;
--檢查測試資料庫:
show parameters deferred_segment_creation;
四、注意事項:
1、現在網上提到的辦法都是先往表中間insert 一條資料,然後再rollback,使之分配空間,這種辦法比較笨,不推薦。
2、通過move的辦法也能得到相同的效果,但也不推薦。
工作之:oracle 11g deferred_segment_creation段延遲建立(轉載他人)