2012年11月29日 星期四

第二十四回 dbv 和 backup validate

上上週小弟一個系統在  v$database_block_corruption 中出了幾個 corruption list ,找出了所在位置的物件,問了開發者,是個不重要的 table ,因此就只做將之 truncate 掉後就沒有再理會。

但是之後雖然每天的備份都成功,但是 v$database_block_corruption 中的 list 卻不會被清除,因為該空間雖然己經歸還給系統,但是在該 datafile 使用 dbv 去驗證時還是會出現有 corruption block 的現象,除非有人重新使用這塊空間,系統才會將之 format 。在之後的備份的驗證才不會重新被驗證到。證明該 block 己經是良好的 block 。

開了 SR 後, Support 要我依照 336133.1的引導,具體說來,該份文件就是指導你如何暫時建立一個 dummy 物件將該空間使用掉後,由系統 FORMAT 後,在下次的 backup validate 或者是備份成功後,就會由 v$database_block_corruption 的 list 裏消失,雖然我一開始只有 truncate table 的方式也是可以,但是該 list 除非在重新被使用到之前,區塊損壞的記錄是不會消失的。

所以我就依據文件的引導,指定了一個 table 到該損壞的 datafile 去讓他成長,文件提供了一個 trigger ,可以直接在做 insert 動作時發現該 block 己被修復,事實上該 trigger 不建立,整個流程一樣是 work 的。

因為我 block corruption 的部份有數十個,如果有建立 trigger 的話,有可能會發生,只修了其中一部份區塊,但其餘區塊未被修復。所以第二次 test run 時,我就沒建立 trigger 了。一直將 table 塞到滿為止。

後來使用 dbv 指令確認該檔案沒有損壞區塊後,再重新執行 backup validate datafile [number] ; 完成後,v$database_block_corruption 中的 list 就會被清除了。