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