当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle坏块处理之dbms_repair的用法(三)
发布时间:2010/11/1 10:56:44 来源:www.xue.net 编辑:城市总裁吧

    对每个索引都要进行dump_orphan_keys。

    SQL> select index_name, count(*) from orphan_key_table

    2  group by index_name;

    INDEX_NAME                       COUNT(*)

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

    ID_INX                                491

    NAME_INX                              491

    5)使用skip_corrupt_blocks,使查询或者DML时跳过坏块

    SQL> declare

    2  begin

    3  dbms_repair.skip_corrupt_blocks (

    4  schema_name => 'SYS',

    5  object_name => 'TEST',

    6  object_type => dbms_repair.table_object,

    7  flags => dbms_repair.skip_flag);

    8  end;

    9  /

    PL/SQL 过程已成功完成。

    SQL> select table_name, skip_corrupt from dba_tables

    2  where table_name = 'TEST';

    TABLE_NAME                     SKIP_COR

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

    TEST                           ENABLED

    6)使用dbms_repair.rebuild_freelists重建freelists,使得该块不再被放到freelists,当中,也就是该块将不会再被使用。

    SQL> declare

    2  begin

    3  dbms_repair.rebuild_freelists (

    4  schema_name => 'SYS',

    5  object_name => 'TEST',

    6  object_type => dbms_repair.table_object);

    7  end;

    8  /

    declare

    *

    第 1 行出现错误:

    ORA-10614: Operation not allowed on this segment

    ORA-06512: 在 "SYS.DBMS_REPAIR", line 400

    ORA-06512: 在 line 3

    不过我们可以看到,对于SYS用户下面的对象好像不能进行此操作。

    4、重建索引

    SQL> select count(id) from test;

    COUNT(ID)

    ----------

    19998

    SQL> select count(name) from test;

    COUNT(NAME)

    -----------

    19998

    SQL> select count(*) from test;

    COUNT(*)

    ----------

    19507

    我们可以看到上面的三个查询,对于第1和第2个使用索引进行查询和不使用索引进行查询的结果是不一样的。下面我们使用rebuild试试。

    SQL> alter index id_inx rebuild;

    索引已更改。

    SQL> alter index name_inx rebuild;

    索引已更改。

    SQL> select count(id) from test;

    COUNT(ID)

    ----------

    19998

    SQL> select count(name) from test;

    COUNT(NAME)

    -----------

    19998

    SQL> select count(*) from test;

    COUNT(*)

    ----------

    19507

    可以是不能通过rebuild来重建索引的。只能通过DROP然后再CREATE。

    SQL> drop index id_inx;

    索引已删除。

    SQL> drop index name_inx;

    索引已删除。

    SQL> create index id_inx on test(id);

    索引已创建。

    SQL> create index name_inx on test(name);

    索引已创建。

    SQL> select count(id) from test;

    COUNT(ID)

    ----------

    19507

    SQL> select count(name) from test;

    COUNT(NAME)

    -----------

    19507

    SQL> select count(*) from test;

    COUNT(*)

    ----------

    19507

    到此该表已经可以正常使用了,但同时也丢失了一些数据,所以在使用dbms_repair进行恢复的时候要充分考虑到数据的重要性和恢复的后果。同时也应该考虑是否有其它别的恢复方法,不然贸贸然的行事最后可能得不偿失。

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved