回滾段損壞的修復實例
2024-07-21 02:06:51
供稿:網友
前幾天同事打電話過來,說公司的開發庫每天死4,5次
正好今天回公司,順道看了一下
檢查alertlog,發現成百上千的報錯,全部是:
errors in file d:/oracle/admin/croot/bdump/crootsmon.trc:
ora-01578: oracle data block corrupted (file # 22, block # 14715)
ora-01110: data file 22: 'd:/oracle/oradata/croot/trbs1.ora'
file#=22的文件是回滾段表空間中的一個數據文件,很明顯回滾段數據塊損壞了。
但是數據庫還算能用,可以正常打開,但是無法正常關閉,
關閉的時候報:
shutting down instance (immediate)
license high water mark = 90
mon oct 25 12:03:23 2004
oracle instance croot (pid = 6) - error 1578 encountered while recovering transaction (2, 50).
mon oct 25 12:03:23 2004
errors in file d:/oracle/admin/croot/bdump/crootsmon.trc:
ora-01578: oracle data block corrupted (file # 22, block # 14715)
ora-01110: data file 22: 'd:/oracle/oradata/croot/trbs1.ora'
然后整個實例就crash了
檢查壞塊所在的對象,發現是rbs01,再檢查dba_rollback_segs視圖,發現除了rbs01是online狀態,其它的都是partitial available狀態,手工將其余的回滾段online以后,就無法再次offline了,立刻有active的transaction占據回滾段,停掉了所有的其它會話,仍然是這種情況,查看v$trasaction視圖,已經沒有任何記錄顯示還有正在運行的事務了。
這種情況,無法正常地drop掉回滾段,自然也就沒辦法drop掉回滾段表空間。
由于是開發庫,根本就是處于非歸檔模式,也沒有什么定時的備份,所以恢復數據庫也不用想了。
不過也好在是開發庫,那些事務丟了也根本無所謂。
于是,關閉數據庫,修改初始化參數文件,添加隱含參數:
_corrupted_rollback_segments=(rbs1,rbs2,rbs4,rbs5,rbs6,rbs7,rbs8,rbs9,rbs10)
全部標志為corrupted的,然后啟動數據庫到mount狀態
drop掉file#=22的數據文件
然后recover database;alter database open;
數據庫打開以后,再次檢查v$rollname視圖,發現只有system表空間中的回滾段存在了,ok,再去dba_rollback_segs視圖檢查狀態,發現除了system回滾段其它的都處于need recover狀態,好,沒錯。開始刪除。
直接drop掉所有的回滾段,drop掉回滾段表空間,然后創建新的表空間,創建新的回滾段,將所有回滾段online,中間出了個小插曲,后面提到。
最后,正常關閉數據庫,修改init參數,將_corrupted_rollback_segments這行注釋掉,最后正常啟動數據庫。隨便找幾張表,作幾個insert測試了一下,沒有問題,ok,修復完成。
小插曲:創建新的回滾段時出了一個問題,耽誤了一段時間,因為是8i的庫,system表空間是dmt的,所以回滾段表空間也必須是dmt的,開始按照習慣創建了一個lmt的表空間,然后創建回滾段的時候總是報錯,說非系統回滾段無法使用system表空間,想了好一陣,才想起dmt和lmt的這回事兒,然后drop掉新建的lmt表空間,創建了一個dmt的表空間,再重新創建回滾段,沒有問題了。
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。