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