使用DBMS_REPAIR確定和跳過壞塊

renjixinchina發表於2014-03-17


以下命令使用sys使用者執行

1.       建立修復表DBMS_REPAIR.ADMIN_TABLES

 

SQL> BEGIN

  2    DBMS_REPAIR.ADMIN_TABLES (

  3    TABLE_NAME => 'REPAIR_TABLE',

  4    TABLE_TYPE => dbms_repair.repair_table,

  5    ACTION => dbms_repair.create_action,

  6    TABLESPACE => '&tablespace_name');

  7  END;

  8  /

 

PL/SQL procedure successfully completed

2.        確定壞塊BMS_REPAIR.CHECK_OBJECT

SQL>

SQL> set serveroutput on

SQL> DECLARE num_corrupt INT;

  2  BEGIN

  3    num_corrupt := 0;

  4    DBMS_REPAIR.CHECK_OBJECT (

  5    SCHEMA_NAME => '&schema_name',

  6    OBJECT_NAME => '&object_name',

  7    REPAIR_TABLE_NAME => 'REPAIR_TABLE',

  8    corrupt_count => num_corrupt);

  9    DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));

 10  END;

 11  /

 

number corrupt: 1

 

PL/SQL procedure successfully completed

3.        查詢檢測到的壞塊

SQL>

SQL> select BLOCK_ID, CORRUPT_TYPE, CORRUPT_DESCRIPTION

  2  from REPAIR_TABLE;

 

  BLOCK_ID CORRUPT_TYPE CORRUPT_DESCRIPTION

---------- ------------ --------------------------------------------------------------------------------

    992620         6148

4.        標記壞塊DBMS_REPAIR.FIX_CORRUPT_BLOCKS

SQL>

SQL> DECLARE num_fix INT;

  2  BEGIN

  3    num_fix := 0;

  4    DBMS_REPAIR.FIX_CORRUPT_BLOCKS (

  5    SCHEMA_NAME => '&schema_name',

  6    OBJECT_NAME=> '&object_name',

  7    OBJECT_TYPE => dbms_repair.table_object,

  8    REPAIR_TABLE_NAME => 'REPAIR_TABLE',

  9    FIX_COUNT=> num_fix);

 10    DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix));

 11  END;

 12  /

 

num fix: 0

 

PL/SQL procedure successfully completed

5.       設定DML跳過壞塊DBMS_REPAIR.SKIP_CORRUPT_BLOCKS

SQL>

SQL> BEGIN

  2    DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (

  3    SCHEMA_NAME => '&schema_name',

  4    OBJECT_NAME => '&object_name',

  5    OBJECT_TYPE => dbms_repair.table_object,

  6    FLAGS => dbms_repair.SKIP_FLAG);

  7  END;

  8  /

 

PL/SQL procedure successfully completed

 

SQL>

6.       注意事項:

1 使用DBMS_REPAIR跳過壞塊後,重啟索引如果需要訪問這些壞塊將報錯,如果有唯一約束,插入重複資料將報ORA-1錯誤

2 如果想取消壞塊掉過可以使用dbms_repair.NOSKIP_FLAG

3 使用SKIP_CORRUPT_BLOCKS,後如果想從表清楚壞塊資料,可以使用alter table MOVE,然後dbms_repair.NOSKIP_FLAG取消掉過,壞塊的資料就被清除掉了,也可以使用(重建表或者truncate table的方式)

4 CHECK_OBJECT過程將在段頭獲取一個 LOCK (TM) in MODE=3 Row-X (SX)鎖這將阻塞其他程式獲取DDL或者獨佔TM

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

相關文章