Oracle 壞塊處理。

 

資料引用:http://www.knowsky.com/388986.html

親身操作成功!(當然那個壞塊的數據會丟失,如果要完整數據,只能用全備恢復,或用歸檔恢復了)

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#(這兩個值可以在報錯的ora_01578後面的信息裏找到,如:ORA-01578: ORACLE data block corrupted (file # 19, block # 1450394) )

          我的顯示結果指出是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(這個命令需到後臺SQLPLUS去執行,PL/SQL會報錯。)

    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、  要及時的檢查硬件的狀態,及時更換驅動器部件。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章