ORA-01578壞塊解決方法

paulyibinyi發表於2008-04-28

一.   出問題時的情景

我在自己測試資料庫上給大表 tb_table導完資料後,建立索引時,出現以下錯誤

ORA-01578: ORACLE data block corrupted (file # 7, block # 28969)
ORA-01110: data file 7: 'D:\ORACLE\ORADATA\PAUL\GAME_LARGE.DBF'

檢視alert.log日誌時有以下錯誤

   Corrupt block relative dba: 0x01c07129 (file 7, block 28969)

Bad check value found during buffer read

Data in bad block -

   type: 6 format: 2 rdba: 0x01c07129

   last change scn: 0x0000.00035361 seq: 0x1 flg: 0x04

   consistency value in tail: 0x53610601

   check value in block header: 0x302a, computed block checksum: 0x8

   spare1: 0x0, spare2: 0x0, spare3: 0x0

二.    解決方法

1.執行以下語句看哪個段壞了

 select segment_type,owner||'.'||segment_name
from dba_extents
where
7 = file_id and 28969 between block_id and block_id+blocks -1

    segment_type             owner.segment_name

TABLE PARTITION       PAUL.TB_CASHFLOW_LOG

2.使用診斷事件

如果損失的是資料,ok
我們可以設定內部事件,使exp跳過這些損壞的block

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

取消內部事件設定

 如果你在初始化引數中設定的,注視之
如果在命令列設定的
alter system set events='10231 trace name context off';

3、建立一個臨時表tb_cashflow_log_tmp的表中除壞塊的資料都檢索出來

SQL>CREATE TABLE tb_cashflow_log_tmp as select * from tb_cashflow_log;

4
更名原表

SQL>alter table tb_cashflow_log rename to tb_cashflow_log _bak;

SQL>alter table tb_cashflow_log _tmp to tb_cashflow_log;

5
、在tb_cashflow_log上重新建立索引、約束、授權、trigger等物件

6
利用表之間的業務關係,把壞塊中的資料補足。

 

然後用DBV來檢驗壞塊:

E:\Oracle\oradata\paul>dbv file=block.dbf blocksize=8192


1. exp正常嗎, exp的資料imp到一個臨時表中, 看看資料的記錄數是否正確啊.

2.
如果正常, 直接刪除目前的資料表, 在利用測試資料重建這個表就好了.

3.
如果不正常. 使用10231trace event, 再使用create table as select 重建對應的表之後,  rename當前表, 再將對應的資料塊, dump出來, 自己構建相應的資料內容吧^_^.

 

二、事後分析產生這種問題的原因

1
  十之八九這個Oracle開啟了非同步I/O(async io)或增加了寫程式。

2
  硬體的I/O出現了錯誤。

3
  作業系統的I/O或快取出現我問題,比如作業系統對於非同步I/O的補丁沒有打。

4
  手動的修改了資料檔案中的資料,我模擬這個錯誤用的便是這種方式。

 

四、如何儘量減少問題及問題的損失呢

 
分析了產生問題的原因,我認為可以採取以下幾個措施

1
  在為提高效能為作業系統開啟非同步I/O時,一定要與及作業系統技術支援聯絡把作業系統與非同步I/O相關的補丁要打全。

2
  制定一個良好的備份恢復策略,最好有表的exp備份

3
  要及時的檢查硬體的狀態,及時更換驅動器部件

 

這次測試資料庫又出現系統表空間有壞塊,目前情況下只能透過重建庫來解決了,重新匯入備份的資料

要是索引塊壞的話還是比較好處理,重建索引即可

所以最好保證不出問題,要有良好的備份.

 

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

相關文章