[Oracle]DBMS_REPAIR包修复损坏数据块(5)
文章作者 100test 发表时间 2007:03:14 13:53:39
来源 100Test.Com百考试题网
程序包主体已创建。
这个包主要对外提供一个函数F_DUMP_FROM_ROWID,另外两个函数是为了包中内部调用的。这个函数的输入参数分别是逻辑ROWID,表所在的SCHEMA,索引名称和抽取的列在索引中的位置。前三个参数分别由ORPHAN_KEY_TABLE表的KEY、SCHEMA_NAME和INDEX_NAME三个字段的值提供,最后一个参数的默认值为1,对于单列索引或复合索引的第一个字段的抽取,可以省略这个参数。
由于dbms_repair包一般是由DBA执行的,因此一般把这个包也建立在SYS帐户中,如果用普通用户建立,需要对DBA_TAB_COLUMNS和DBA_IND_COLUMNS的单独授权。下面测试一下函数的功能。
SQL> SELECT P_DUMPROWID.F_DUMP_FROM_ROWID(KEY, SCHEMA_NAME, INDEX_NAME) DUMP FROM ORPHAN_KEY_TABLE
2 WHERE INDEX_NAME = IND_TEST_ID AND ROWNUM < 6.
DUMP
-------------------------------------------
1
2
3
4
5
SQL> SELECT P_DUMPROWID.F_DUMP_FROM_ROWID(KEY, SCHEMA_NAME, INDEX_NAME, 1) DUMP FROM ORPHAN_KEY_TABLE
2 WHERE INDEX_NAME = IND_TEST_NAME AND ROWNUM < 6.
DUMP
-------------------------------------------
ACCESS$
AGGXMLIMP
AGGXMLINPUTTYPE
ALL_ALL_TABLES
ALL_APPLY
好了,剩下的事情就简单了。我们将ORPHAN_KEY_TABLE表中的记录转变后,重新插入到TEST表中即可。
SQL> INSERT INTO YANGTK.TEST (ID, NAME)
2 SELECT
3 P_DUMPROWID.F_DUMP_FROM_ROWID(A.KEY, A.SCHEMA_NAME, A.INDEX_NAME),
4 P_DUMPROWID.F_DUMP_FROM_ROWID(B.KEY, B.SCHEMA_NAME, B.INDEX_NAME)
5 FROM ORPHAN_KEY_TABLE A, ORPHAN_KEY_TABLE B
6 WHERE A.KEYROWID = B.KEYROWID
7 AND A.INDEX_NAME = IND_TEST_ID
8 AND B.INDEX_NAME = IND_TEST_NAME .
已创建549行。
SQL> SELECT * FROM YANGTK.TEST WHERE ID = 1.
ID NAME
---------- ------------------------------
1 ACCESS$
SQL> SELECT * FROM YANGTK.TEST WHERE ID = 123.
ID NAME
---------- ------------------------------
123 ALL_REPCONFLICT
SQL> COMMIT.
至此,已经成功的恢复了数据。