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