1. 程式人生 > >exp匯出資料時丟表

exp匯出資料時丟表

友軍發來訊息,說使用exp匯出某個schema的資料的時候,發現有些表沒有匯出來。
因為一直沒有使用exp的習慣,就使用exp\expdp再次匯出一次,分析二者的日誌,發現exp的確有些表沒有匯出。


問題產生的原因:
在11gR2之前,oracle實在表被建立時就分配空間;
從11gR2(11.2.0.1)中引入了一個新特性:deferred segment creation。11gR2之後,引數deferred_segment_creation預設是true,表示表中插入第一條資料才會分配磁碟空間。空表還沒有在磁碟上分配空間,不能被exp匯出。

deferred segment creation特性的具體內容就不提了,請看官方文件去!

deferred_segment_creation特性的缺點是:
1.由於要在第一次insert或其他載入資料方式時才產生segment段,而段的建立需要在表空間上分配空間allocate space,若短期內大量空表存在插入的需求,則可能在短期內出現空間分配爭用
2.deferred_segment_creation引入了少量的bug.

針對deferred_segment_creation特性的建議:
1.對於存在較多空表或空分割槽且存在空間壓力的,對效能、響應時間沒有太高要求的系統可以考慮使用該特性
2.對效能、響應時間有較高要求的庫建議關閉該特性,deferred_segment_creation=false


問題解決方法:
1.最簡單的解決方案是使用expdp代替exp。

2.找出這些表,並進行修改,然後再嘗試exp匯出
select 'alter table '||table_name||' allocate extent;' from user_tables where segment_created = 'NO';

可以檢視一下表定義,就會發現這些表和已經有資料的表的定義是有區別的。重點是關注ddl語句中storage()部分
select dbms_metadata.get_ddl('TABLE','<TABLE_NAME>','<SCHEMA-NAME>') from dual;