剛lg問我11g無法導出空表,實驗了下,果真如此。
原因:11g默認創建一個表時不分配segment,只有在插入數據時才會產生(當然也可以強制分配),以節省磁盤空間。
對於已經存在的空表解決辦法:
就是想辦法讓空表有segment,第一種:可以通過插入數據的方式(不想要這些數據可以回滾),只要有insert動作就會分配segment;
第二種:就是強制分配:alter table tablename allocate extent;
為了后面創建的表能直接分配segment:修改參數deferred_segment_creation(11g新增的)。該參數即指是否延遲創建segment,默認為true。如果想讓表創建時就分配segment,那么久應該修改該參數為false即alter system set deferred_segment_creation=false;
實驗:
deferred_segment_creation參數未做修改,默認的為true。
第一步:創建一個表test1,執行導出,結果提示該表不存在,如下截圖所示
第二步:修改參數deferred_segment_creation為false后再導出,仍然出錯(同上截圖)
第三步:強制分配segment再導出 成功
SQL> alter table TEST1 allocate extent;
Table altered
第四步:在創建一個空表test2(注意此時deferred_segment_creation為false),執行導出 成功
附11g默認創建的表其sql如下:
create table TEST1
(
id NUMBER,
name VARCHAR2(255)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
而如果該表插入了數據或執行強制分配segment或創建該空表時已經將deferred_segment_creation參數設為false,則其創建后查看其sql為如下:
create table TEST2
(
id NUMBER,
name VARCHAR2(255)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);