Oracle日常問題-壞塊修復

chenoracle發表於2020-02-17

Oracle 日常問題- 壞塊 修復

一:問題現象

(1)NC 進行收款結算時報錯 (ORA-01578)

(2) 資料備份日誌 (exp) 報錯:

(3) 資料庫警告日誌報錯:

二:問題原因

機房意外斷電,導致資料庫資料塊損壞;

三:基本資訊

(1) 資料庫伺服器作業系統:

(2) 資料庫版本

四:檢視資料檔案號及名稱

select  file_id , tablespace_name , file_name , bytes / 1024 / 1024   from  dba_data_files order   by   1 ;

五:透過DBV 檢查檔案是否有壞塊

(1) 檢查 nnc_index01.dbf 檔案

dbv file='/oradata/nc/nnc_index01.dbf'

結論file_id=6(nnc_index01.dbf),block=196373,643867,459202 出現三個索引壞塊

(2) 檢查 nnc_index02.dbf 檔案

dbv file='/oradata/nc/nnc_index0 2 .dbf'

結論:file_id=8(nnc_index02.dbf),block=169072 出現一個索引壞塊

(3) 檢查 nnc_data01.dbf 檔案

dbv file='/oradata/nc/nnc_ data 01.dbf'

結論:file_id=5(nnc_data01.dbf) 無壞塊

(4) 檢查 nnc_data02.dbf 檔案

dbv file='/oradata/nc/nnc_ data 0 2 .dbf'

結論:file_id=7(nnc_data02.dbf),block=336465 出現一個資料壞塊

(5) 檢查 nnc_user01.dbf 檔案

dbv file='/oradata/nc/nnc_ user 01.dbf'

......

(6) 檢查 nnc_undotbs01.dbf 檔案

dbv file='/oradata/nc/nnc_ undotbs 01.dbf'

......

(7) 檢查 nnc_sysaux01.dbf 檔案

dbv file='/oradata/nc/nnc_ sysaux .dbf'

......

(8) 檢查 nnc_system01.dbf 檔案

dbv file='/oradata/nc/nnc_ system01.d bf'

......

六:檢視壞塊所屬段及型別

(1) 檢視 file=6(459202) 對應段型別及名稱

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 459202  between block_id and block_id + blocks - 1;

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復

(2) ) 檢視 file=6(643867) 對應段型別及名稱

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 643867  between block_id and block_id + blocks - 1;

(3) 檢視 file=6(1963727) 對應段型別及名稱

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 1963727  between block_id and block_id + blocks - 1;

(4) 檢視 file=8(169072) 對應段型別及名稱

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 8

   and 169072  between block_id and block_id + blocks - 1;

(5) 檢視 file=7( 336465 ) 對應段型別及名稱

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 7

   and 336465 between block_id and block_id + blocks - 1;

七:恢復之前需要先備份損壞資料塊對應的表

透過exp 備份不能直接備份出有壞塊的表,需要設定內部事件

ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';

透過expdp 備份可以直接跳過壞塊;

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復

八:檢視資料庫備份

歸檔模式,並且有rman 備份,有前兩天的 Rman 全備以及全備到今天的所有歸檔日誌;

恢復方式:基於資料塊的Rman 恢復

(1) 恢復 datafile=7 的所有壞塊

RMAN>backup validate datafile 7;

select * from v$database_block_corruption where file#=4;

RMAN>blockrecover datafile 7  block 336465  from backupset;

驗證壞塊位置

進行恢復

RMAN>blockrecover datafile 7 block 336465;

檢查是否恢復成功

(2) 恢復 datafile=6 的所有壞塊

RMAN>backup validate datafile 6;

select * from v$database_block_corruption where file#=6;

RMAN>blockrecover datafile 6  block  459202 ,  643867, 1963727 ;

驗證壞塊位置

進行恢復

檢查是否恢復成功

(3) 恢復 datafile=8 的所有壞塊

RMAN>backup validate datafile 8;

RMAN> blockrecover datafile 8  block  169072 ;

驗證壞塊位置

進行恢復

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復

檢查是否恢復成功

Oracle日常問題-壞塊修復

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

Oracle日常問題-壞塊修復

Oracle日常問題-壞塊修復


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

相關文章