關於 資料壞塊 的整理和總結

rainbowbridg發表於2007-05-15

資料庫中表,出現了壞塊。對於這個問題,在網上早就有了各種各樣的討論和解決辦法,現在總結如下,以希望在關鍵時刻能用得上:
一、 資料表出現壞塊,設定10231事件來進行EXP,然後在IMP的方法
對於這種情況來說,如果沒有熱備份,或者時間匆忙,來不及從備份中恢復,那麼我們只能丟失一部分資料,先儘可能的修復在說了。 一般情況下,出現資料壞塊,並不影響資料庫的啟動(非system 資料庫檔案損壞),但是一旦我們使用到了相關資料,就會報出類似如下資訊的錯誤:ORA-01578: ORACLE 資料塊損壞(檔案號4,塊號35),我們需要用以下的sql來進行查詢,以確保損壞的僅僅是我們資料庫中的表的資料:
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id =4 AND 35 between block_id AND block_id + blocks - 1 (注意:如果是TEMP壞,則沒有返回值)
這個時候,用dbv來檢查檔案號為4的資料檔案,將會報錯誤資訊;
由於出現壞塊,EXP 在這個時候是不能進行的,我們必須設定如下事件,以讓資料庫在進行FTS的時候繞過資料壞塊:
ALTER SYTEM set EVENTS = '100231 trace name context forever, level 10';
再次進行EXP,就可以匯出資料了。
二、 用dbms_repair包 exec DBMS_REPAIR.ADMIN_TABLES('REPAIR_TABLE',1,1,'USERS');
exec DBMS_REPAIR.ADMIN_TABLES('ORPHAN_TABLE',2,1,'USERS');
exec dbms_repair.check_object(schema_name => 'SYSTEM',object_name => 'TEST',corrupt_count => cc);
select *from repair_table;
exec dbms_repair.fix_corrupt_blocks(schema_name => 'SYSTEM',object_name => 'TEST',fix_count => cc);
exec dbms_repair.skip_corrupt_blocks(schema_name => 'SYSTEM',object_name => 'TEST',flags => 1);
exec dbms_repair.dump_orphan_keys(schema_name => 'SYSTEM',object_name => 'I_TEST',object_type => 2,
repair_table_name => 'REPAIR_TABLE',orphan_table_name => 'ORPHAN_TABLE',key_count => CC);
exec dbms_repair.rebuild_freelists(schema_name => 'SYSTEM',object_name => 'TEST');

三、 用 9i 的特性:blockrecover 來修復壞塊 RMAN > RUN {
BLOCKRECOVER DATAFILE 2 BLOCK 12, 13 DATAFILE 7 BLOCK 5, 98, 99 DATAFILE 9 BLOCK 19;
}
RMAN > RUN {
BLOCKRECOVER DATAFILE 3 BLOCK 2,3,4,5
TABLESPACE sales DBA 4194405, 4194409, 4194412
FROM DATAFILECOPY
}

Rman > RUN {
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 RESTORE UNTIL TIME 'SYSDATE-2';
}
Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}
RMAN> blockrecover datafile 2 block 14 from backupset;
四、 用BBED 來修復壞塊
五、 資料塊損壞後,如何建立索引?
對於一般的索引,我們可以刪除掉該索引,然後重建;如果該索引為主鍵,我們只能先disable該主鍵,disable後,相關索引也自然沒有了,然後我們再重建索引
六、 模擬資料壞塊 我們一般用UE、winhex等軟體可以來模擬壞塊的情況。這些都是windows的情況,在unix的情況下,我們可以透過以下方法來處理: a. dd命令 b. orapatch 命令:
$orapatch open tools001.dbf write
patch>set hex --要用十六進位制
patch>display 177 --orapatch以512位元組為工作模式,假定想破壞第11個block即為:8k/512*11+1(file header)
patch>find 00400003 --選一個要編輯的點
patch>modify 00400002 --破壞
patch>exit

http://www.itpub.net/showthread.php?s=&threadid=201766&perpage=15&pagenumber=1

[@more@]

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

相關文章