EXP COMPRESS以及EXP/IMP EXPDP/IMPDP匯入表結構注意

dbasdk發表於2014-09-12
關於EXP COMPRESS引數
一直對這個引數有些疑惑。當然此引數一定不是所謂的壓縮備份檔案的空間,
而它的解釋為
COMPRESS   import into one extent
字面意思為把所有的EXTENT壓縮到INIT 分割槽中。但是這個實際上這個只在資料字典管理
的中生效。但是在本地管理表空間中實際initial 也是有用的但是他不會分配到一個EXTENT中,
因為本地管理表空間預設EXTENT管理的方式是AUTO。分割槽大小是大小是64K,1M,8M..的方式,
但是他一定會分配足夠的空間
所以
測試期間我建立了一個大約20M的表,然後DELETE全部記錄,COMMIT掉
然後做如下操作:
exp ppzhu/gelc123@bendi  COMPRESS=n tables=test1 file=c:\test1n.dmp
exp ppzhu/gelc123@bendi  COMPRESS=y tables=test1 file=c:\test1y.dmp


然後進行匯入
imp ppzhut1/gelc123@bendi fromuser=ppzhu touser=ppzhut1 file=c:\test1y.dmp
發現一共分了20個EXTENT
SQL> select count(*) from dba_extents where segment_name='TEST1' AND OWNER='PPZHUT1';
 
  COUNT(*)
----------
        20
每個1M
然後檢視其建立表的語句如下:
create table PPZHUT1.TEST1
(
  IT INTEGER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 20M
    minextents 1
    maxextents unlimited
  );




然後刪除表匯入COMPRESS=n的匯出的DMP如下:
可以看到實際COMPRESS=n是實際的佔用空間,
SQL> select count(*) from dba_extents where segment_name='TEST1' AND OWNER='PPZHUT1';
 
  COUNT(*)
----------
         1
 
SQL> select sum(blocks)*8/1024 from dba_extents where segment_name='TEST1' AND OWNER='PPZHUT1';
 
SUM(BLOCKS)*8/1024
------------------
            0.0625
 
檢視建表語句
-- Create table
create table PPZHUT1.TEST1
(
  IT INTEGER
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
沒有問題。
同樣的EXPDP也會有這樣的問題,IMPDP的時候需要加上引數
TRANSFORM=SEGMENT_ATTRIBUTES:n


這也是為什麼匯出表結構的時候需要使用COMPRESS=n的原因。
所以總結一下匯出表結構的方式:
1、EXP使用COMPRESS=n匯出(ROWS=N)
2、EXPDP不使用任何引數,IMPDP使用TRANSFORM=SEGMENT_ATTRIBUTES:n匯入(CONTENT=METADATA_ONLY)

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

相關文章