ORACLE資料庫壞塊的處理 (一次壞快處理過程)
今天處理了一個資料庫壞塊的問題,這種問題碰到很多次了,特此把處理過程紀錄如下:
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"-->把壞的資料檔案copy走-->拷貝備份檔案過來-->"recover datafile "-->"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進去,否則這樣恢復的資料庫要使用的話會存在很大的風險。
寫了這麼多,我發現怎麼講壞塊給講到資料庫恢復裡面去了。其實說起來壞塊的處理只要備份工作做得好,還是挺容易解決的。大不了從備份中恢復一份出來,如果沒有備份,那就要看運氣了。
1.根據報錯的資訊,用dbv確認一下,是否真的檔案有壞塊了,如果有,那繼續,用下面的SQL查詢出壞塊為index還是資料,如果是索引,刪除重建即可,如果是資料,那麻煩了,還要進行下一步動作。
SELECT SEGMENT_NAME, SEGMENT_TYPE FROM DBA_EXTENTS
WHERE FILE_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
B. 就是找負責AP的人員,根據表之間的資料關聯關係來把丟失的資料拼出來。
C. 如果你是9i的資料庫,用rman做的備份,rman中提供了一個指令,也可以從rman的備份中來恢復壞塊,恢復時資料庫可以是online的狀態。指令如下:
blockrecover datafile
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)Oracle資料庫物件
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 一次壞塊的處理過程(一)
- 一次壞塊的處理過程(二)
- 一次壞塊的處理過程 [轉]
- 資料庫壞塊處理資料庫
- Oracle壞塊處理Oracle
- ORACLE 壞塊處理Oracle
- 教你如何處理Oracle資料庫中的壞塊Oracle資料庫
- 資料庫壞塊Corrupt block的處理方法資料庫BloC
- ORACLE資料庫壞塊的處理 (通過re-create table方法)Oracle資料庫
- Oracle壞塊處理相關Oracle
- Oracle壞塊問題處理Oracle
- oracle corrupt block壞塊處理OracleBloC
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- [zt] 如何處理Oracle資料庫中的壞塊[final]Oracle資料庫
- rootvg壞塊處理
- 處理塊損壞
- 一次使用BBED處理壞塊
- ORA-01578(資料塊損壞)跳過壞塊處理辦法
- 一次不完全恢復中途Kill rman後的問題處理+壞塊處理過程
- Oracle 11.2.0.4.4 ADG 備庫資料檔案壞塊處理Oracle
- MySQL資料庫INNODB表損壞修復處理過程分享MySql資料庫
- 【BLOCK】Oracle壞塊處理命令參考BloCOracle
- oracle壞塊模擬處理(筆記)Oracle筆記
- Oracle 壞塊處理三板斧Oracle
- Oracle壞塊修復處理實驗Oracle
- 一個簡單易用的資料庫壞塊處理方案資料庫
- DBA實踐---壞塊處理
- BAD Block 壞塊的處理BloC
- 對oracle中出現的壞塊的處理方法Oracle
- undo表空間損壞的處理過程
- Oracle資料庫出現ORA-19566 LOB壞塊的處理記錄Oracle資料庫
- 第7章 處理塊損壞
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- ORACLE壞塊(ORA-01578)處理方法Oracle
- oracle資料庫改壞spfile引數重啟處理方法Oracle資料庫
- 一次資料庫異常的處理過程資料庫