Oracle 壞塊處理。

2021-09-30 09:07:22 字數 2307 閱讀 6381

資料引用:

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

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.log中看到一幾條報錯資訊:

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  andbetween 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、  記錄下這個表的建表語句

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

ORACLE錶壞塊處理

1.對於普通表,可以考慮使用事件方式處理 事件10231 設定在全表掃瞄時忽略損壞的資料塊 alter system set events 10231 trace name context forever,level 10 exp匯出表資料,然後重建表,重新匯入表資料 alter system se...

Nand Flash壞塊處理

nand flash儲存器是flash儲存器的一種,為固態大容量記憶體的實現提供了廉價有效的解決方案。nand儲存器具有容量較大,改寫速度快等優點,適用於大量資料的儲存,如嵌入式產品中包括數位相機 記憶卡 體積小巧的u盤等。1989年,東芝公司發表了nand flash結構,強調降低每位元的成本,更...

處理Oracle資料庫中的壞塊

一 什麼是資料庫的壞塊 首先我們來大概看一下資料庫塊的格式和結構 資料庫的資料塊有固定的格式和結構,分三層 cache layer,transaction layer,data layer。在我們對資料塊進行讀取寫入操作的時候,資料庫會對要讀寫的資料塊做一致性的檢查,其中包括 資料塊的型別 資料塊的...