最近一個客戶因為機房停電,造成DB2資料庫無法啟動。用線上備份恢複資料庫後前滾資料,發現資料是正常的,唯獨一些大字段的值被置成了二進制0。對此問題研究并反複測試後,最終确認是BLOB字段設定成not logged而造成的。
這個屬性的意思就是在更新和新增BLOB字段值時,不會将修改和新增的BLOB的資料的值寫入歸檔日志。歸檔日志中隻會記錄字段被更新了,但更新的具體内容不記錄。
資料庫崩潰後,用線上備份來恢複資料庫,然後前滾資料到一個時間點,那麼從備份時間,到這個時間點之間,修改和新增的大字段資料被置成二進制0。因為在前滾的時候,資料庫是按照歸檔日志來恢複資料庫的,歸檔日志庫中隻記錄了字段被修改,沒有記錄修改成什麼,那資料庫隻好把他們都置0了。如果前滾到最小時間點,那應該是不會有資料被置0,因為備份時間到最小時間點之間,不會有大字段更新。
預設情況下,這個屬性是logged的。如果表已經建立,又想改為not logged的話,比較麻煩,需要将資料導出,drop掉表,建立表,然後把資料導回去。
IBM這樣設計主要考慮到性能問題,因為大字段可能會有好幾G大小,在更新的資料檔案的同時,在把這些資料寫入歸檔日志,一方面歸檔日志會增長的很快,另一方面對IO也是個巨大的壓力。是以,如果大字段很大的話,最好設定成not logged的。
解決這個問題的辦法:
方法一、修改屬性為logged,記錄内容。這個方法的前提是,評估對系統形成造成的影響,并合理的配置IO。IBM專家的建議是,将資料,歸檔日志,活動日志放在不同的卷組上,使用不同的IO
方法二、使用離線備份的方法,離線備份恢複時不需要前滾,自然也用不上歸檔日志了。但這樣會把備份後的資料丢掉了,隻能通過重做資料來做了。但這也比資料被置0好。看使用者是否能接受了。