Oracle處理損壞數據塊的處理操作
你是否在實際操作中遇到過這樣的狀況,有的時侯Oracle的數據文件只損壞了相關的數據塊而其他的東西卻完好無損。產生這樣的原因主要是因為間斷或隨機的I/O錯誤或是內存塊的錯誤。這時可以不用做整個數據文件的恢復,使datafile仍然處在在線的狀態。對此可以進行下面幾種Oracle處理損壞數據塊的處理操作。
** Oracle 9i 以后可以使用blockrecover命令(BMR):
可以先通過視圖v$database_block_corruption獲得當前被損壞數據的數據塊信息。此視圖中記錄了物理和邏輯兩類block corruption。
@ 物理的corruption:無法辨識該數據塊,checksum、header、footer校驗錯誤
@ 邏輯corruption:chechsum、header、footer校驗是正確的,但是該數據塊的內容時不一致的。
注意:BMR是不能用于恢復邏輯上的corruption的。在backup命令中checksum的校驗是默認開啟的,可以通過NOCHECKSUM選項屬性關閉。邏輯的校驗默認是關閉的,可以在backup、restore、recover、validate命令中添加CHECK LOGICAL開啟。
具體的操作方法為:
- rman> blockrecover datafile n1 block n1b1,
n1b2 datafile n2 block n2b1,n2b2;
** 對于用戶管理的備份和恢復方法。如果要恢復Oracle處理損壞數據的DB,只能進行整個數據文件的恢復。
- sql> alter database datafile 2 offline;
- sql> host ‘cp /backup/datafile1.bak /opt/demo/datafile1.dt’;
- sql> recover automatic datafile 2;
- sql> alter database datafile 2 online;
** 如果對于存在corruption block的表的使用不頻繁,在可以忍受的情況下,可以先屏蔽這些blocks,待以后再恢復。這就要使用dbms_repair包了。具體如下:
@ 建立修復表(修復表用于存放表、表分區或索引的損壞塊信息)。
- sql> exec dbms_repair.admin_tables
(’REPAIR_TABLE’, DBMS_REPAIR.REPAIR_TABLE, DBMS_REPAIR.CREATE_ACTION);
@ 確定Oracle處理損壞數據塊的個數
- sql> var cc number
- sql> exec dbms_repair.check_object
(’TBSPNAME’, ‘TABNAME’, corrupt_count=>:cc);- sql> print cc
@ 標記損壞塊。
- sql> var fc number
- sql> exec dbms_repair.fix_corrupt_blocks
(’TBSPNAME’, ‘TABNAME’,fix_count=>:fc);- sql> print fc;
@ 跳過損壞塊。此操作可以使涉及到損壞塊的查詢sql繼續執行,跳過該blocks,但是對于DML,則仍會顯示錯誤信息。
- sql> exec dbms_repair.skip_corrupt_blocks(’TBSPNAME’, ‘TABNAME’);
@ 確定指向Oracle處理損壞數據塊的索引入口。當上面確定了表的損壞塊后,仍有可能存在索引指向Oracle處理損壞數據塊,這些索引稱為“孤立鍵值”。對此可以使用dbms_repair包對孤立鍵值進行管理:
- sql> exec dbms_repair.admin_tables
(’ORPHAN_TAB’, DBMS_REPAIR, ORPHAN_TABLE, DBMS_REPAIR, CREATE_ACTION);- sql> var kc number
- sql> exec dbms_repair.dump_orphar_keys
(’TBSPNAME’,'INDEXNAME’, orphan_table_name=> ‘ORPHAN_TAB’, key_count=> :kc);- sql> print kc;
上述的相關內容就是對Oracle處理損壞數據塊的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】