[Oracle]DBMS_REPAIR包修复损坏数据块(4)

文章作者 100test 发表时间 2007:03:14 13:53:43
来源 100Test.Com百考试题网


2 恢复数据

使用DBMS_REPAIR包的目的不仅是为了使表重新可以访问,而且使用这个包还能在一定程度上恢复被因坏块而无法读取的数据。

由于坏块产生在表上,因此索引是可以访问,所有被索引的列的数据都可以恢复。遗憾的是,Oracle的文档并没有给出恢复的方法,我查询了METALINK和ASKTOM也没有找到相应的答案,所以,恢复的工作只能靠自己摸索进行。这部分的内容完全是建立在我对Oracle数据类型理解的基础上的,虽然我已经对我的程序进行过测试,但是由于没有文档可以参考,而且测试环境相对比较单一,因此,我并不能确保我提供的包和函数一定没有错误。如果想将这种方法应用的正式系统中,请首先做好备份工作。

言归正传,在上面的步骤中,使用DUMP_ORPHAN_KEYS过程保存了坏块中的索引键值,下面就通过这些保存的键值来进行数据的恢复。

先看一下ORPHAN_KEY_TABLE的表结构:

SQL> DESC ORPHAN_KEY_TABLE

名称 是否为空? 类型

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

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

由于字段名基本上都是自解释的,这里就不再过多描述了,需要说明的是KEYROWID和KEY两个字段。

KEYROWID存放的是该索引键值对应的表中的ROWID,而KEY保存的就是索引的键值。

但是查询KEY的值发现,并非像想象中一样,存放的是1、2、3……或ALL_TABLES、ACCESS$……等值,而是以逻辑ROWID方式存放的。

SQL> SELECT KEY FROM ORPHAN_KEY_TABLE WHERE INDEX_NAME = IND_TEST_ID AND ROWNUM = 1.

KEY

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

*BAAAAAACwQL

SQL> SELECT KEY FROM ORPHAN_KEY_TABLE WHERE INDEX_NAME = IND_TEST_NAME AND ROWNUM = 1.

KEY

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

*BAAAAAAHQUNDRVNTJP4

如何将逻辑ROWID转化为NUMBER或VARCHAR2类型呢?Oracle的文档并没有找到相应的解决方法。

于是抱着尝试的想法对这个字段DUMP一下。


相关文章


[Oracle]DBMS_REPAIR包修复损坏数据块(5)
使用dbms_job包来实现数据库后台进程
综合辅导:ORACLESGA分配
[Oracle]DBMS_REPAIR包修复损坏数据块(3)
[Oracle]DBMS_REPAIR包修复损坏数据块(4)
使用新的list分割方法提高灵活性
Oracle9i新特性研究系列之七
[Oracle]DBMS_REPAIR包修复损坏数据块(1)
[Oracle]DBMS_REPAIR包修复损坏数据块(2)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛