[Oracle]DBMS_REPAIR包修复损坏数据块(1)
文章作者 100test 发表时间 2007:03:14 13:53:48
来源 100Test.Com百考试题网
1 、DBMS_REPAIR包的使用
Oracle提供的DBMS_REPAIR包可以发现、标识并修改数据文件中的坏块。
DBMS_REPAIR包的工作原理比较简单——将检查到的坏块标注出来,使随后的dml操作跳过该块。同时,DBMS_REPAIR包还提供了几个过程,可以用来保存索引的键值(这些键值指向被标注为坏块的block)的过程,以及修复freelists和segment bitmap的过程。
DBMS_REPAIR包不但可以检测出坏块,根据表被索引的情况,还可以用来在一定程度上恢复坏块中的数据。
需要注意,DBMS_REPAIR包没有进行授权,默认情况下,只有sys用户可以执行。
下面通过一个完整的例子来说明DBMS_REPAIR包的使用。
第一步:构造测试环境
首先建立一个测试用表空间,由于需要用UltraEdit打开数据文件修改部分内容来模拟错误,因此数据文件要建的小一些。
SQL> CREATE TABLESPACE TEST DATAFILE E:\ORACLE\ORADATA\TEST\TEST.DBF SIZE 1M
2 EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT MANUAL.
表空间已创建。
SQL> CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(30)) TABLESPACE TEST.
表已创建。
SQL> INSERT INTO TEST SELECT ROWNUM, OBJECT_NAME FROM DBA_OBJECTS.
已创建6232行。
SQL> COMMIT.
提交完成。
SQL> CREATE INDEX IND_TEST_ID ON TEST (ID).
索引已创建。
SQL> CREATE INDEX IND_TEST_NAME ON TEST (NAME).
索引已创建。
为了确保数据库已经把刚才插入的数据写到数据文件中,现在重起数据库。
SQL> CONN /@TEST AS SYSDBA
已连接。
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 89201304 bytes
Fixed Size 453272 bytes
Variable Size 62914560 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
第二步:模拟错误的产生
用UltraEdit打开数据文件,只要修改了数据文件中任意的一个位置,都会造成数据文件错误。但我们测试需要将错误发生位置定位在TEST表中。
SQL> CONN YANGTK/YANGTK@TEST