• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

数据库相关:如何使用DBMS_REPAIR检测和修补数据坏块

发布: 2008-5-06 09:53 | 作者: GOD | 来源: 希赛网 | 查看: 86次 | 进入软件测试论坛讨论

领测软件测试网

 

  二、使用DBMS_REPAIR.CHECK_OBJECT进行检测

  CHECK_OBJECT procedure检查指定的object,并且将关于损坏和修补的指导信息装入Repair Table。它将效验指定object中所有块的一致性。而在此之前已标识的块就会被跳过。

  SQL> @checkObject
  SQL> set serveroutput on
  SQL>
  SQL> declare
  2 rpr_count int;
  3 begin
  4 rpr_count := 0;
  5 dbms_repair.check_object (
  6 schema_name => 'SYSTEM',
  7 object_name => 'T1',
  8 repair_table_name => 'REPAIR_TABLE',
  9 corrupt_count => rpr_count);
  10 dbms_output.put_line('repair count: ' || to_char(rpr_count));
  11 end;
  12 /
  repair count: 1
  PL/SQL procedure successfully completed.
  repair_table的结构如下:
  SQL> desc repair_table
  Name Null? Type
  ----------------------------------------- -------- ----------------------------
  OBJECT_ID NOT NULL NUMBER
  TABLESPACE_ID NOT NULL NUMBER
  RELATIVE_FILE_ID NOT NULL NUMBER
  BLOCK_ID NOT NULL NUMBER
  CORRUPT_TYPE NOT NULL NUMBER
  SCHEMA_NAME NOT NULL VARCHAR2(30)
  OBJECT_NAME NOT NULL VARCHAR2(30)
  BASEOBJECT_NAME VARCHAR2(30)
  PARTITION_NAME VARCHAR2(30)
  CORRUPT_DESCRIPTION VARCHAR2(2000)
  REPAIR_DESCRIPTION VARCHAR2(200)
  MARKED_CORRUPT NOT NULL VARCHAR2(10)
  CHECK_TIMESTAMP NOT NULL DATE
  FIX_TIMESTAMP DATE
  REFORMAT_TIMESTAMP DATE

  我们可以从repair_table中查询坏块的情况:

  SQL> select object_name, block_id, corrupt_type, marked_corrupt,
  2 corrupt_description, repair_description
  3 from repair_table;
  OBJECT_NAME BLOCK_ID CORRUPT_TYPE MARKED_COR
  ------------------------------ ---------- ------------ ----------
  CORRUPT_DESCRIPTION
  --------------------------------------------------------------------------------
  REPAIR_DESCRIPTION
  --------------------------------------------------------------------------------
  T1 3 1 FALSE
  kdbchk: row locked by non-existent transaction
  table=0 slot=0
  lockid=32 ktbbhitc=1
  mark block software corrupt

  三、从坏块中进行数据抽取

  从repair_table中可以知道file 6的block 3 坏了,但注意此时这个块还没有被标识为坏块,因此要在这个时候将任何有意义的数据赶快抽取出来。一旦该块被标识为坏块,整个块就会被跳过。

  1、 通过ALTER SYSTEM DUMP或trace中来获取块中包含的记录数 (nrows = 3).

  2、 查询损坏的object,尽量抽取尽可能多的信息。

  下面的查询可以用来从坏块中抢救数据。

  建立一个临时表(temp_t1)以方便数据的插入:

  SQL> create table temp_t1 as
  2 select * from system.t1
  3 where dbms_rowid.rowid_block_number(rowid) = 3
  4 and dbms_rowid.rowid_to_absolute_fno (rowid, 'SYSTEM','T1') = 6;
  Table created.
  SQL> select col1 from temp_t1;
  COL1
  ----------
  2
  3

  四、使用DBMS_REPAIR.FIX_CORRUPT_BLOCKS来标识坏块

  FIX_CORRUPT_BLOCKS procedure用来根据repair table中的信息修正指定objects中的坏块。当这个块被标识为坏了以后,做全表扫描将引起ORA-1578错。

  SQL> declare
  2 fix_count int;
  3 begin
  4 fix_count := 0;
  5 dbms_repair.fix_corrupt_blocks (
  6 schema_name => 'SYSTEM',
  7 object_name => 'T1',
  8 object_type => dbms_repair.table_object,
  9 repair_table_name => 'REPAIR_TABLE',
  10 fix_count => fix_count);
  11 dbms_output.put_line('fix count: ' || to_char(fix_count));
  12 end;
  13 /
  fix count: 1
  PL/SQL procedure successfully completed.

  查询repair_table可以看到block 3已经被标识:

  SQL> select object_name, block_id, marked_corrupt
  2 from repair_table;
  OBJECT_NAME BLOCK_ID MARKED_COR
  ------------------------------ ---------- ----------
  T1 3 TRUE

  这时再对table t1做全表扫描,ORA-1578将会出现。

  SQL> select * from system.t1;
  select * from system.t1
  *
  ERROR at line 1:
  ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
  ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

32/3<123>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网