ORACLE資料庫壞塊的處理 (一次壞快處理過程)

oracle_ace發表於2009-11-20
今天處理了一個資料庫壞塊的問題,這種問題碰到很多次了,特此把處理過程紀錄如下:

1.根據報錯的資訊,用dbv確認一下,是否真的檔案有壞塊了,如果有,那繼續,用下面的SQL查詢出壞塊為index還是資料,如果是索引,刪除重建即可,如果是資料,那麻煩了,還要進行下一步動作。

SELECT SEGMENT_NAME, SEGMENT_TYPE FROM DBA_EXTENTS
WHERE FILE_ID = and BETWEEN BLOCK_ID
AND BLOCK_ID + BLOCKS - 1

2.在做這一步之前,先對資料所在的表進行備份,比如exp或者create newtable等等方法,注意第二種方法要把索引,約束等都備份出來。如果運氣好的話,資料可以全部備份出來,那就簡單了,將原表刪除,重建,把資料弄進來即可;運氣不好的話,某些資料還在壞區上不能匯出,那就要使用事件10231跳過壞區,把好的資料先弄出來。SQL如下:

ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’

然後再create new table或者exp來匯出資料,注意匯出完畢後用下列SQL把這個診斷事件關閉。

ALTER SYSTEM SET EVENTS ''10231 trace name context off ''

3.步驟2運氣不好就有可能會丟失資料,要保證資料不丟失,有三個辦法:

A.   如果資料庫的archive是全的,那就拿出表所在的資料檔案最近一次的備份,用dbv檢查一下,確認無壞塊後,用它來恢復正式庫的資料。步驟是"alter database datafile offline"--&gt把壞的資料檔案copy走--&gt拷貝備份檔案過來--&gt"recover datafile "--&gt"alter database datafile online"。

B.   就是找負責AP的人員,根據表之間的資料關聯關係來把丟失的資料拼出來。

C.   如果你是9i的資料庫,用rman做的備份,rman中提供了一個指令,也可以從rman的備份中來恢復壞塊,恢復時資料庫可以是online的狀態。指令如下:

blockrecover datafile block  from backupset;

4.其實上面的恢復動作也可作為system表空間的恢復,如果是undo某一個段壞掉了,可以使用下面的步驟:

A.   先備份建立rollbacksegment 的指令碼(特別是Dictionary方式),把監聽器停掉,所有的session斷開,看看v$transaction裡面有沒有活動的,如果有也刪除掉。

B.   把資料庫開在restrict模式下進行恢復,方法是嘗試重新建立undo表空間和回滾段,建立完成,把回滾段online。

C.   確定資料庫可以正常開啟後,把舊的回滾段offline掉,舊的表空間刪除。

如果說資料庫都打不開了,那就要使用備份的undo檔案進行恢復,這樣丟失資料最小。另外oracle提供了一個隱含引數"_corrupted_rollback_segments=(被損壞的段名)",強制性的把資料庫開啟,不過這時資料庫是在不一致的狀態下,開啟後趕快做一個資料庫exp,重建資料庫並imp進去,否則這樣恢復的資料庫要使用的話會存在很大的風險。

寫了這麼多,我發現怎麼講壞塊給講到資料庫恢復裡面去了。其實說起來壞塊的處理只要備份工作做得好,還是挺容易解決的。大不了從備份中恢復一份出來,如果沒有備份,那就要看運氣了。
 
 

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

相關文章