壞塊問題(摘抄總結)

why566發表於2008-11-04

--產生壞塊問題的常見原因:

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

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

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

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

--常用的處理方法:

? 恢復資料檔案

1) 先offline受影響的資料檔案,執行以下的語句:
   ALTER DATABASE DATAFILE 'name_file' OFFLINE;
2) 保留有壞塊的資料檔案,然後複製備份的資料檔案。如果恢復的資料檔案要求路徑不同,執行以下的語句:
   ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
3) 恢復資料檔案,執行以下語句:
   RECOVER DATAFILE 'name_of_file';
4) Online恢復後的資料檔案,執行以下的語句:
   ALTER DATABASE DATAFILE 'name_of_file' ONLINE;

? RMAN恢復壞的block(9i以上版本可用)
 使用這種方法要求資料庫版本是9.2.0以上,要求配置了Rman的catalog資料庫,資料庫為歸檔方式,並且有完整的物理備份。
 使用RMAN的BLOCKRECOVER命令
 Rman>run{blockrecover datafile 5 block 11,16;}
 也可以強制使用某個SCN號之前的備份,恢復資料塊。
 Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}

? 使用10231診斷事件,在做全表掃描的時候跳過壞塊

? 透過ROWID RANGE SCAN 儲存資料

? 使用DBMS_REPAIR

--診斷步驟:

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

A、 開啟 alter.log ,找到 ORA-01578 的報錯資訊,並記錄下 file# 及 block 的值,我這裡是 126 和 88490 。
    ORA-01578: ORACLE data block corrupted (file # 126, block # 88490)
    ORA-01110: data file 126: '/dev/vgjf7/rdata471'

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

SQL>Select * from dba_extents where file_id= and between block_id and block_id+blocks-1;

這裡的 F 指的是 file#,B 指的是 block#,我的顯示結果指出是 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 ,在做全表掃描的時候跳過壞塊。

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 聯絡。


--Oracle的專門工具dbv來檢查壞塊

關鍵字     說明 (預設)
---------------------------------------------------
FILE       要驗證的檔案 (無)
START      起始塊 (檔案的第一個塊)
END        結束塊 (檔案的最後一個塊)
BLOCKSIZE  邏輯塊大小 (2048)
LOGFILE    輸出日誌 (無)
FEEDBACK   顯示進度 (0)
PARFILE    引數檔案 (無)
USERID     使用者名稱/口令 (無)
SEGMENT_ID 段 ID (tsn.relfile.block) (無)

用法:
c:\>dbv file=d:\oracle\oradata\ora816\system01.dbf logfile=d:\a.log blocksize=8192

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

相關文章