網上找的辦法
oracle 11g 新增了乙個引數:deferred_segment_creation,含義是段延遲建立,預設是true。具體是什麼意思呢?
如果這個引數設定為true,你新建了乙個表t1,並且沒有向其中插入資料,那麼這個表不會立即分配extent,也就是不佔資料空間,只有當你insert資料後才分配空間。這樣可以節省少量的空間。
1 設定deferred_segment_creation 引數為false後,無論是空表還是非空表,都分配segment。
在sqlplus中,執行如下命令:
sql>alter system set deferred_segment_creation=false;
檢視:
sql>show parameter deferred_segment_creation;
該值設定後只對後面新增的表產生作用,對之前建立的空表不起作用。
注意並且要重新啟動資料庫,讓引數生效
2 使用allocate extent的說明
使用allocate extent可以為資料庫物件分配extent。其語法如下:
-----------
allocate extent
-----------
可以針對資料表、索引、物化檢視等手工分配extent。
allocate extent使用樣例:
allocate extent
allocate extent(size integer [k | m])
allocate extent(datafile 'filename')
allocate extent(instance integer) www.2cto.com
allocate extent(size integer [k | m] datafile 'filename')
allocate extent(size integer [k | m] instance integer)
針對資料表操作的完整語法如下:
-----------
alter table [schema.]table_name allocate extent [()]
-----------
故,需要構建如下樣子簡單的sql命令:
-----------
alter table atabelname allocate extent
-----------
3.2 構建對空表分配空間的sql命令,
查詢當前使用者下的所有空表(乙個使用者最好對應乙個預設表空間)。命令如下:
-----------
sql>select table_name from user_tables where num_rows=0;
-----------
[b][color=red]上面num_rows有時是空的,oracle自動定時統計,用num_rows做條件查詢不妥,改用segment_created欄位
修改後的語句
-----------
sql>select table_name from user_tables where segment_created = 'no';
-----------
修改後的sql則能正確查詢出不能匯出的空表。
[/color][/b]
根據上述查詢,可以構建針對空表分配空間的命令語句,如下:
-----------
sql>select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
-----------
[b][color=red]
同上面修改的一樣,sql改為
-----------
sql>select 'alter table '||table_name||' allocate extent;' from user_tables where segment_created = 'no';
-----------
生成批量的拼接sql後,執行下再exp就可以匯出空表了
[/color][/b]
批量輸出上述生成的sql語句,建立c:\createsql.sql,其內容如下:
-----------
set heading off;
set echo off;
set feedback off;
set termout on;
spool c:\allocate.sql;
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off; www.2cto.com
-----------
執行c:\createsql.sql,命令如下:
-----------
sql>@ c:\createsql.sql;
-----------
執行完畢後,得到c:\allocate.sql檔案。
開啟該檔案會看到,已經得到對所有空表分配空間的命令sql語句。
3.4 執行sql命令,對空表分配空間:
執行c:\allocate.sql,命令如下:
-----------
sql>@ c:\allocate.sql;
-----------
執行完畢,表已更改。
3.4 此時執行exp命令,即可把包括空表在內的所有表,正常匯出。
oracle11g無法匯出空表問題
產生原因 oracle11g為了節約空間,對空表不分配segment 解決方法 方法1.用如下語句設定空表可匯出 alter system set deferred segment creation false注意 該值設定後需重新啟動資料庫,讓引數生效。並且該值只對後面新增的表產生作用,對之前建立...
oracle11g匯出空表
該引數意思是當建立物件 如表 初始時沒有資料,是否立即建立segment。預設是true。這會導致在按使用者匯出時,沒有segment的物件不會匯出。首先執行下面的語句 select alter table table name allocate extent from user tables wh...
oracle 11g匯出空表
oracle 11g 用exp命令匯出庫檔案備份時,發現只能匯出來一部分表而且不提示錯誤,之前找不到解決方案只能把沒匯出來的表重新建建立。後來發現是所有的空表都沒有匯出來。於是想好好查查,因為在以前的10g版本中沒有這樣的問題。查資料發現oracle 11g中有個新特性 新增了乙個引數 deferr...