ORACLE壞塊(ORA-01578)處理方法
2024-08-29 13:45:10
供稿:網友
Oracle的壞塊即ORA-01578錯,同時還可能伴隨ORA-01110錯,這種錯誤對于初學者或是那些沒有實踐經驗的dba來說無疑是很棘手的。我當初就深受其害,寫下這篇文章則是希望對大家有所幫助。
一、出問題時的情景
1、 我的一個計費的入庫的進程停掉,報的便是ORA-01578錯,對應用相關的表tg_bill03做SQL>select from tg_cdr03 where rownum<10;這樣是可以的,但做SQL>select count(*) from tg_bill03;時則報ORA-01578錯。
2、 檢查alter<sid>.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<sid>.log,找到ORA-01578的報錯信息,并記錄下file#及block的值,我這里是126和88490。
B、 執行以下語句看哪個段壞了
SQL>Select * from dba_extents
2 where file_id=<F>
3 and <B> 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聯系。不過這些方面的壞的機率很少很少的,在以后的文章中我也會做介紹。