[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.

至此,已经成功的恢复了数据。


相关文章


[Oracle]DataGuard数据库灾难防护(4)
[Oracle]DataGuard数据库灾难防护(1)
Oracle协作套件:完全集成数据库
[Oracle]DataGuard数据库灾难防护(2)
[Oracle]DBMS_REPAIR包修复损坏数据块(5)
使用dbms_job包来实现数据库后台进程
综合辅导:ORACLESGA分配
[Oracle]DBMS_REPAIR包修复损坏数据块(3)
[Oracle]DBMS_REPAIR包修复损坏数据块(4)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛