技术开发 频道

处理Oracle数据库中的坏块

    4. 具体处理方法的介绍

    Ø 恢复数据文件方法:

    如果数据库是归档方式下,并且有完整的物理备份,就可以使用此方法来恢复。

    步骤如下:

    1) 先offline受影响的数据文件,执行以下的语句:

    ALTER DATABASE DATAFILE 'name_file' OFFLINE;

    2) 保留有坏块的数据文件,然后拷贝备份的数据文件。如果恢复的数据文件要求路径不同,执行以下的语句:

    ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';

    3) 恢复数据文件,执行以下语句:

    RECOVER DATAFILE 'name_of_file';

    4) Online恢复后的数据文件,执行以下的语句:

    ALTER DATABASE DATAFILE 'name_of_file' ONLINE;

    Ø 只恢复坏的block(9i以上版本可用)

    使用这种方法要求数据库版本是9.2.0以上,要求配置了Rman的catalog数据库,数据库为归档方式,并且有完整的物理备份。

    步骤如下:

    使用RMAN的BLOCKRECOVER命令 :

    Rman>run{blockrecover datafile 5 block 11,16;}

    也可以强制使用某个SCN号之前的备份,恢复数据块。

    Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}

    Ø 通过ROWID RANGE SCAN 保存数据

    1) 先取得坏块中ROW ID的最小值,执行以下的语句:

    SELECT dbms_rowid.rowid_create(1,<OBJ_ID>,<RFN>,<BL>,0) from DUAL;

    2)取得坏块中的ROW ID的最大值,执行以下的语句:

    SELECT dbms_rowid.rowid_create(1,<OBJ_ID>,<RFN>,<BL>+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 <owner.tablename> A WHERE rowid < '<low_rid>';

    INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM <owner.tablename> A WHERE rowid >= '<hi_rid>‘;

    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('<schema>','<tablename>');

    然后使用exp工具或者createtable as select的方法取出没有坏块数据,然后重建表,表上的索引和限制。

0
相关文章