ORACLE壞塊(ORA-01578)處理方法

chenmolin發表於2004-11-18

ORACLE 的壞塊即 ORA-01578 錯,同時還可能伴隨 ORA-01110 錯,這種錯誤對於初學者或是那些沒有實踐經驗的 dba 來說無疑是很棘手的。我當初就深受其害,寫下這篇文章則是希望對大家有所幫助。

[@more@]

 

 

一、 出問題時的情景

1、 我的一個計費的入庫的程式停掉,報的便是 ORA-01578 錯,對應用相關的表 tg_bill03 SQL>select from tg_cdr03 where rownum<10; 這樣是可以的,但做 SQL>select count(*) from tg_bill03; 時則報 ORA-01578 錯。

2、 檢查 alter.log 中看到一幾條報錯資訊:

Errors in file /oracle816/app/admin/billing/udump/ora_7281_billing.trc:

ORA-01578: ORACLE data block corrupted (file # 126, block # 88490)

ORA-01110: data file 126: '/dev/vgjf7/rdata471'

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

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

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

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

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

三、 解決方法

這種問題的解決方法是很多的,如果你用的是歸檔方式,則可以基於時間點恢復來解決。不過這裡介紹一種比較方便的解決方式,因為我的庫沒有開歸檔。 Metaline 關於 ORA-01578 的文字也很多,不過我看過後總覺得都不那麼實用,不能解決實際的問題。

1、 解決這種問題的第一步是首先你要確定是什麼段、哪個段壞了,是索引還是表?

A、 開啟 alter.log ,找到 ORA-01578 的報錯資訊,並記錄下 file# block 的值,我這裡是 126 88490

B、 執行以下語句看哪個段壞了

SQL>Select * from dba_extents

2 where file_id=

3 and between block_id and block_id+blocks-1;

這裡的 F 指的是 file#,B 指的是 block#

我的顯示結果指出是 tg_bill03 出現了壞塊。

2 、如果確定下來壞的是索引段,這時你就可以輕舒一口氣了,只要把這個索相刪除然後重建一下就可以了,如果出現壞的是表段,則應往下走了。

3、 記錄下這個表的建表語句

為我方便,建議使用 PL/SQL Developer 來完成,如果你沒有可以在 http://www.allroundautomations.com/plsqldev.html 去下載一個,操作步驟是這樣的。

A、 以表的 owner pl/sql developer 連入 oracle

B、 在左面的樹狀欄中找到這個表 tg_bill03, 右擊該表 ->view->View SQL, 記錄下 sql ,以備以下步驟中重建索引。

4、 實際處理了,以我的那個表為例

A、 以 tg_bill03 owner 連入 oracle

B、 使用診斷事件 10231

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

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

SQL>CREATE TABLE tg_bill03_tmp as select * from tg_bill03;

C、 更名原表,並把 tg_bill03_tmp tg_bill03

SQL>alter table tg_bill03 rename to tg_bill03_bak;

SQL>alter table tg_bill03_tmp to tg_bill03;

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

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

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

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

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

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

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

結篇:其實壞塊涉及的內容很多的,如果壞塊發生的回滾段表空間、資料字典 (system 表空間 ) 或聯機日誌,這些處理都是特難的,需要與 oracle supporter 聯絡。

 

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

相關文章