小議IMP操作引數COMMIT=Y(三)

yangtingkun發表於2007-01-28

前一段時間在論壇上看到imp的COMMIT引數問題,於是打算簡單總結一下。

這篇文章討論COMMIT=Y對資料完整性的影響。

小議IMP操作引數COMMIT=Y(一):http://yangtingkun.itpub.net/post/468/254854

小議IMP操作引數COMMIT=Y(二):http://yangtingkun.itpub.net/post/468/255388


匯入時設定COMMIT=Y不僅會帶來效能方面的影響,更重要的時,設定了這個引數有可能導致資料的一致性出現問題,尤其是配合IGNORE=Y引數一起使用的時候。

如果設定了COMMIT=Y,那麼匯入過程會在一條資料或buffer中所有的資料插入後,進行提交。這意味著匯入操作不再是一個事務。因此,當匯入過程中途失敗,Oracle回滾的只是最後一次插入的事務,而前面插入的資料都以及提交了。這可能意味著使用者將很難恢復到匯入開始的時刻,而且也很難繼續匯入未完的資料。

當然,兩種情況可以避免出現這種問題。第一種情況就是匯入的表本身不存在,或者是空的。這樣可以簡單的DROP TABLE或TRUNCATE TABLE清除所有已經匯入的資料。

第二種情況是表本身有主鍵、唯一約束或唯一索引。這種情況雖然不是很容易恢復到匯入之前的狀態,但是利用主鍵等唯一約束,再次執行匯入時,所有以及插入的資料在重新匯入時都會報錯,而上次未匯入的資料則可以順利匯入。這種情況的問題是,由於匯入操作會導致唯一性衝突錯誤,IMP時會報大量的錯誤,匯入效能嚴重下降。匯入的效率可能下降將近10倍。

所以在對以及存在資料的表執行IMP的時候,應該儘量的避免設定COMMIT=Y引數。

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

相關文章