[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一下。