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

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

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

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

领测软件测试网

 五、使用DBMS_REPAIR.DUMP_ORPHAN_KEYS来修补相关的index

  DUMP_ORPHAN_KEYS将会显示指向数据坏块中记录的index entries

  下列查询显示与坏块相关的index。

  SQL> select index_name from dba_indexes
  2 where table_name in (select distinct object_name from repair_table);
  INDEX_NAME
  ------------------------------
  T1_PK
  SQL> @dumpOrphanKeys
  SQL> set serveroutput on
  SQL>
  SQL> declare
  2 key_count int;
  3 begin
  4 key_count := 0;
  5 dbms_repair.dump_orphan_keys (
  6 schema_name => 'SYSTEM',
  7 object_name => 'T1_PK',
  8 object_type => dbms_repair.index_object,
  9 repair_table_name => 'REPAIR_TABLE',
  10 orphan_table_name => 'ORPHAN_KEY_TABLE',
  11 key_count => key_count);
  12 dbms_output.put_line('orphan key count: ' || to_char(key_count));
  13 end;
  14 /
  orphan key count: 3
  PL/SQL procedure successfully completed.
  orphan_key_table的结构如下:
  SQL> desc orphan_key_table
  Name Null? Type
  ----------------------------------------- -------- ----------------------------
  SCHEMA_NAME NOT NULL VARCHAR2(30)
  INDEX_NAME NOT NULL VARCHAR2(30)
  IPART_NAME VARCHAR2(30)
  INDEX_ID NOT NULL NUMBER
  TABLE_NAME NOT NULL VARCHAR2(30)
  PART_NAME VARCHAR2(30)
  TABLE_ID NOT NULL NUMBER
  KEYROWID NOT NULL ROWID
  KEY NOT NULL ROWID
  DUMP_TIMESTAMP NOT NULL DATE
  下列查询显示t1_pk index中有3个index entries与坏块有关:
  SQL> select index_name, count(*) from orphan_key_table
  2 group by index_name;
  INDEX_NAME COUNT(*)
  ------------------------------ ----------
  T1_PK 3

  在orphan_key_table 中的Index entry意味着该index应该重建,以保证一个table的指针和它的index指针返回同样的结果集合。

  六、使用DBMS_REPAIR.SKIP_CORRUPT_BLOCKS来跳过坏块

  SKIP_CORRUPT_BLOCKS用来决定在对指定object的index和table做搜索时是否跳过坏块。

  如果index和table不同步,那么一个‘SET TRANSACTION READ ONLY'的transaction可能会出现不一致的情况,例如一个查询仅仅指向index,而它的子查询却同时指向index和table。 如果table的block已经被标识为坏了,那么这两个查询将会返回不同的结果。

  建议:如果SKIP_CORRUPT_BLOCKS被enable,那么必须重建orphan_key_table中确定的所有indexes(或所有与该object相关的indexes,如果在DUMP_ORPHAN_KEYS被忽略的情况下)。

  SQL> @skipCorruptBlocks
  SQL> declare
  2 begin
  3 dbms_repair.skip_corrupt_blocks (
  4 schema_name => 'SYSTEM',
  5 object_name => 'T1',
  6 object_type => dbms_repair.table_object,
  7 flags => dbms_repair.skip_flag);
  8 end;
  9 /
  PL/SQL procedure successfully completed.

  下列查询显示跳过坏块已经enable。

  SQL> select table_name, skip_corrupt from dba_tables
  2 where table_name = 'T1';
  TABLE_NAME SKIP_COR
  ------------------------------ --------
  T1 ENABLED

  坏块中的记录被跳过后,全表扫描不再显示错误。

  SQL> select * from system.t1;
  COL1 COL2
  --------------------------------------------
  4 dddd
  5 eeee

  注意此时pk index还没有被修正。不能往t1 table中插入数据

  SQL> insert into system.t1 values (1,'aaaa');
  insert into system.t1 values (1,'aaaa')
  *
  SQL> select * from system.t1 where col1 = 1;
  no rows selected

  七、使用DBMS_REPAIR.REBUILD_FREELISTS重建freelists

  REBUILD_FREELISTS重建指定object的freelists。

  SQL> declare
  2 begin
  3 dbms_repair.rebuild_freelists (
  4 schema_name => 'SYSTEM',
  5 object_name => 'T1',
  6 object_type => dbms_repair.table_object);
  7 end;
  8 /
  PL/SQL procedure successfully completed.

  八、重建Index

  在orphan_key_table中确定的每一个index都必须重建,以保证查询结果的一致。

  SQL> alter index system.t1_pk rebuild online;
  Index altered.

  重建index后,就能往t1 table中插入数据。

  SQL> insert into system.t1 values (1, 'aaaa');
  1 row created.
  SQL> select * from system.t1;
  COL1 COL2
  --------------------------------------------
  4 dddd
  5 eeee
  1 aaaa

  以上的insert语句只是提供一个简单的例子。如果我们真能知道丢失的数据内容,那当然是最好的。临时表(temp_t1)应该用来存放所有从坏块中抽取的记录。

  到此时table T1已经可以被再用,但同时数据也有丢失。一般来说,在使用DBMS_REPAIR package之前,应认真考虑数据的丢失问题,因为从index segment和table dump中采集信息非常复杂,同时逻辑上的不一致也可能被引入。要记住:在DBMS_REPAIR package 初始版本中,“修补坏块”的功能仅仅是“将块标识为由软件引起的坏块”而已。

  在进行上述操作前,必须先阅读〈Oracle8i Administrator's Guide〉中“Detecting and Repairing Data Block Corruption"章节,同时对风险进行评估。所有操作最好是在Oracle工程师的指导下进行。

 

延伸阅读

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

33/3<123

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

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