1) 先取得壞塊中ROW ID的最小值,執(zhí)行以下的語(yǔ)句: SELECT dbms_rowid.rowid_create(1,,,,0) from DUAL;
2)取得壞塊中的ROW ID的最大值,執(zhí)行以下的語(yǔ)句: SELECT dbms_rowid.rowid_create(1,,,+1,0) from DUAL;
3)建立一個(gè)臨時(shí)表存儲(chǔ)那些沒(méi)有壞塊的數(shù)據(jù),執(zhí)行以下的語(yǔ)句: CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
4)保存那些不存在壞塊的數(shù)據(jù)到臨時(shí)表中,執(zhí)行以下的語(yǔ)句: INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid < ''; INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid >= '‘;
5) 根據(jù)臨時(shí)表中的數(shù)據(jù)重建表,重建表上的索引,限制。 使用10231診斷事件,在做全表掃描的時(shí)候跳過(guò)壞塊 可以在session級(jí)別設(shè)定: ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10'; 也可以在數(shù)據(jù)庫(kù)級(jí)別上設(shè)定,在初始化參數(shù)中加入:event="10231 trace name context forever, level 10" ,然后重啟數(shù)據(jù)庫(kù)。 然后從存在壞塊的表中取出不存在壞塊的數(shù)據(jù),執(zhí)行以下的語(yǔ)句: CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table; 最后rename生成的corrupt_table為原來(lái)表的名字,并重建表上的索引和限制。 使用dbms_repair包進(jìn)行恢復(fù) 使用dbms_repair標(biāo)記有壞塊的表,在做全表掃描的時(shí)候跳過(guò)壞塊,執(zhí)行以下的語(yǔ)句: Execute DBMS_REPAIR.SKip_CORRUPT_BLOCKS('',''); 然后使用eXP工具或者createtable as select的方法取出沒(méi)有壞塊數(shù)據(jù),然后重建表,表上的索引和限制?! ∥澹簤膲K的預(yù)先發(fā)現(xiàn)的方法