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

    1、模拟坏块

    SQL> create tablespace test01 datafile 'G:oracleproduct10.2.0oradataora10gtest01.dbf' size 1m;

    表空间已创建。

    SQL> create table test(id number,name varchar2(30)) tablespace test01;

    表已创建。

    SQL> insert into test select rownum,object_name from dba_objects;

    insert into test select rownum,object_name from dba_objects

    *

    第 1 行出现错误:

    ORA-01653: 表 SYS.TEST 无法通过 8 (在表空间 TEST01 中) 扩展

    SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;

    已创建9999行。

    SQL> commit;

    提交完成。

    SQL> insert into test select rownum,object_name from dba_objects where rownum<10000;

    已创建9999行。

    SQL> commit;

    提交完成。

    SQL> select count(*) from test;

    COUNT(*)

    ----------

    19998

    SQL> create index id_inx on test(id);

    索引已创建。

    SQL> create index name_inx on test(name);

    索引已创建。

    SQL> shutdown immediate

    数据库已经关闭。

    已经卸载数据库。

    ORACLE 例程已经关闭。

    然后使用UltraEdit等工具编辑数据文件,修改里面的部分内容。

    SQL> startup

    ORACLE 例程已经启动。

    数据库装载完毕。

    数据库已经打开。

    SQL> select count(*) from test;

    select count(*) from test

    *

    第 1 行出现错误:

    ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 19)

    ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF'

    可见我们已经模拟出坏块的情景。

    2、使用analyze table 或DBV检测坏块的信息

    SQL> analyze table test validate structure;

    analyze table test validate structure

    *

    第 1 行出现错误:

    ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 19)

    ORA-01110: 数据文件 7: 'G:ORACLEPRODUCT10.2.0ORADATAORA10GTEST01.DBF'

    通过对表进行analyze之后,该表的相关坏块信息会写入到跟踪文件中,我们可以通过脚本获得此跟踪文件:

    SQL> @G:oracleget_trace.sql;

    TRACE_FILE

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

    G:ORACLEPRODUCT10.2.0ADMINORA10GUDUMPora10g_ora_3528.trc

    查看ora10g_ora_3528.trc,下面是其中的部分信息:

    Corrupt block relative dba: 0x01c00014 (file 7, block 20)

    ...

    Corrupt block relative dba: 0x01c00013 (file 7, block 19)

    ...

    跟踪文件中提示了数据文件7块19、20出现了坏块,下面使用DBV工具进行检测:

    使用DBV工具时,两个参数是必须的,一个是FILE,一个是BLOCKSIZE:

    G:oracleproduct10.2.0oradataora10g>dbv file=test01.dbf blocksize=8192

    DBVERIFY - 开始验证: FILE = test01.dbf

    页 19 标记为损坏

    Corrupt block relative dba: 0x01c00013 (file 7, block 19)

    ...

    页 20 标记为损坏

    Corrupt block relative dba: 0x01c00014 (file 7, block 20)

    ...

    页 23 标记为损坏

    Corrupt block relative dba: 0x01c00017 (file 7, block 23)

    ...

    页 31 标记为损坏

    Corrupt block relative dba: 0x01c0001f (file 7, block 31)

    ...

    DBVERIFY - 验证完成

    检查的页总数: 128

    处理的页总数 (数据): 106

    失败的页总数 (数据): 0

    处理的页总数 (索引): 0

    失败的页总数 (索引): 0

    处理的页总数 (其它): 18

    处理的总页数 (段)  : 0

    失败的总页数 (段)  : 0

    空的页总数: 0

    标记为损坏的总页数: 4

    流入的页总数: 0

    最高块 SCN            : 1286361 (0.1286361)

    我们可以见到,使用DBV工具检测出了该对象存在了4个坏块,而上面我们使用analyze命令时只检测出部分的坏块。

    3、使用dbms_repair包进行坏块处理

    1)首先建立repair_table,用于存放dbms_repair.check_object检测出来的坏块信息

    SQL> declare

    2  begin

    3  dbms_repair.admin_tables

    4  (table_name => 'REPAIR_TABLE',--表名

    5  table_type => dbms_repair.repair_table,

    6  action => dbms_repair.create_action,

    7  tablespace => 'USERS');--用于指定该表存放的表空间

    8  end;

    9  /

    PL/SQL 过程已成功完成。

    SQL> col owner format a10

    SQL> col object_name format a20

    SQL> col object_type format a20

    SQL> select owner, object_name, object_type

    2  from dba_objects

    3  where object_name like '%REPAIR_TABLE';

    OWNER      OBJECT_NAME          OBJECT_TYPE

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

    SYS        REPAIR_TABLE         TABLE

    SYS        DBA_REPAIR_TABLE     VIEW

    Oracle自动创建了一个DBA_REPAIR_TABLE视图。

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