一、 insert一行,再rollback就產生segment了。
該方法是在在空表中插入數據,再刪除,則產生segment。導出時則可導出空表。
二、 設置deferred_segment_creation 參數
該參數值默認是TRUE,當改爲FALSE時,無論是空表還是非空表,都分配segment。修改SQL語句:
alter system set deferred_segment_creation=false scope=both;
需注意的是:該值設置後對以前導入的空表不產生作用,仍不能導出,只能對後面新增的表產生作用。如需導出之前的空表,只能用第一種方法。
三、 用以下這句查找空表
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
把查詢結果導出,執行導出的語句,強行修改segment值,然後再導出即可導出空表,
注意:數據庫插入數據前,修改11g_R2參數可以導出空表
查找空表
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
四、 oracle10g以上版本的expdp和impdp工具,用此工具也可以導出空的表
oracle expdp/impdp 用法詳解
1) 創建邏輯目錄,該命令不會在操作系統創建真正的目錄,最好以system等管理員創建。
create directory db_bak as 'd:\test\dump';
2) 查看管理理員目錄(同時查看操作系統是否存在,因爲Oracle並不關心該目錄是否存在,如果不存在,則出錯)
select * from dba_directories;
3) 給system用戶賦予在指定目錄的操作權限,最好以system等管理員賦予。
grant read,write on directory db_bak to system;
4) 導出數據
l 按用戶導
expdp system/manager@orcl schemas=system dumpfile=expdp.dmp DIRECTORY=db_bak
l 並行進程parallel
expdp system/manager@orcl directory=db_bak dumpfile=system3.dmp parallel=40 job_name=system3
l 按表名導
expdp system/manager@orcl TABLES=emp,dept dumpfile=expdp.dmp DIRECTORY=db_bak;
l 按查詢條件導
expdp system/manager@orcl directory=db_bak dumpfile=expdp.dmp Tables=emp query='WHERE deptno=20';
l 按表空間導
expdp system/manager DIRECTORY=db_bak DUMPFILE=tablespace.dmp TABLESPACES=temp,example;
l 導整個數據庫
expdp system/mtmadmin DIRECTORY=db_bak DUMPFILE=full.dmp FULL=y
5) 五、還原數據
l 1)導到指定用戶下
impdp system/manager DIRECTORY=db_bak DUMPFILE=expdp.dmp SCHEMAS=system;
l 2)改變表的owner
impdp system/manager DIRECTORY=db_bak DUMPFILE=expdp.dmp TABLES=system.dept REMAP_SCHEMA=system:system;
l 3)導入表空間
impdp system/manager DIRECTORY=db_bak DUMPFILE=tablespace.dmp TABLESPACES=example;
l 4)導入數據庫
impdb system/mtmadmin DIRECTORY=db_bak DUMPFILE=full.dmp FULL=y;
l 5)追加數據
impdp system/manager DIRECTORY=db_bak DUMPFILE=expdp.dmp SCHEMAS=system TABLE_EXISTS_ACTION=append;