用定時器 + bat腳本做oracle的備份,已經備份了幾個月了。這幾天突然發現備份出來的dmp數據完全沒法重新導入到新的數據庫中。
起初以為是版本問題,或者導出參數的問題,于是在網上不停的搜索、嘗試,最后還是沒發現問題原因。
算了還是研究一下導入日志中的錯誤,于是將日志中出錯誤的表嘗試單獨導出,居然出現EXP-00011::表不存在 錯誤,可是數據庫中明明有這個表呀。根據這個方向再上網一查,終于找到原因了,原來在11g中空表是默認是不占Segment的,導致備份導出的時候壓根就沒導出那些空表,這樣才出現備份的dmp沒法導入的問題,敢情我幾個月的備份工作都白做了。
可ORACLE 你媽X的,備份導出時沒導出空表這么大的事情你居然沒有任何提示,你他*媽的是為了創造客服賺錢的機會么?
哎,處理過程如下:
1.用system帳號進入:
1.1 查看是否為true
show parameter deferred_segment_creation;
1.2 修改為false
alter system set deferred_segment_creation=false;
2.用數據庫帳號登錄:
2.1 查找所有數據表為空的表
select table_name from user_tables where NUM_ROWS=0;
2.2 把這些表組成修改Segment的腳本:
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
2.3 將2.2中查詢的結果導出來,或者復制出來,并執行修改所有空表。
這個時候就能把所有空表導出來了。
感謝以下兩位的帖子,給了我很大幫助
http://arthas-fang.iteye.com/blog/875258
http://wanwentao.blog.51cto.com/2406488/545154