|
13 END;
14 /
orphan key count: 549
PL/SQL 过程已成功完成。
SQL> DECLARE
2 num_orphans INT;
3 BEGIN
4 num_orphans := 0;
5 DBMS_REPAIR.DUMP_ORPHAN_KEYS (
6 SCHEMA_NAME => 'YANGTK',
7 OBJECT_NAME => 'IND_TEST_NAME',
8 OBJECT_TYPE => dbms_repair.index_object,
9 REPAIR_TABLE_NAME => 'REPAIR_TABLE',
10 ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
11 KEY_COUNT => num_orphans);
12 DBMS_OUTPUT.PUT_LINE('orphan key count: ' TO_CHAR(num_orphans));
13 END;
14 /
orphan key count: 549
PL/SQL 过程已成功完成。
注意对每个索引都要执行DUMP_ORPHAN_KEYS过程。
4.使用REBUILD_FREELISTS过程来修改FREELISTS。
如果坏块发生在FREELIST列表中的中部,则FREELIST列表后面的块都无法访问。在这个例子中,模拟产生的错误的位置不在FREELIST中,因此可以跳过这一步骤,一般情况下,由于无法定位确定坏块的位置,则需要执行此过程。
SQL> BEGIN
2 DBMS_REPAIR.REBUILD_FREELISTS (
3 SCHEMA_NAME => 'YANGTK',
4 OBJECT_NAME => 'TEST',
5 OBJECT_TYPE => dbms_repair.table_object);
6 END;
7 /
PL/SQL 过程已成功完成。
5.执行SKIP_CORRUPT_BLOCKS过程,使后续的DML操作跳过坏块
SQL> BEGIN
2 DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
3 SCHEMA_NAME => 'YANGTK',
4 OBJECT_NAME => 'TEST',
5 OBJECT_TYPE => dbms_repair.table_object,
6 FLAGS => dbms_repair.skip_flag);
7 END;
8 /
PL/SQL 过程已成功完成。
SQL> SELECT OWNER, TABLE_NAME, SKIP_CORRUPT FROM DBA_TABLES
2 WHERE OWNER = 'YANGTK';
OWNER TABLE_NAME SKIP_COR
---------------------------- ---------------------------- --------
YANGTK TEST ENABLED
YANGTK TEST1 DISABLED
YANGTK TEST_AAA DISABLED
YANGTK TEST_PART DISABLED
已选择4行。
6.重建索引
由于数据和索引仍然存在不一致的问题,因此必须重建索引。
SQL> SELECT * FROM YANGTK.TEST WHERE ID = 123;
未选定行
SQL> SELECT ID FROM YANGTK.TEST WHERE ID = 123;
ID
----------
123
SQL> ALTER INDEX YANGTK.IND_TEST_ID REBUILD;
索引已更改。
SQL> SELECT ID FROM YANGTK.TEST WHERE ID = 123;
ID
----------
123
注意:重建索引一定要先DROP INDEX,然后CREATE INDEX的方式。如果使用了REBUILD的方式,那么重建索引时的数据源是原来的索引,重建后仍然会保留着不一致的数据。
SQL> DROP INDEX YANGTK.IND_TEST_ID;
索引已丢弃。
SQL> DROP INDEX YANGTK.IND_TEST_NAME;
索引已丢弃。
SQL> CREATE INDEX YANGTK.IND_TEST_ID ON YANGTK.TEST(ID);
索引已创建。
SQL> CREATE INDEX YANGTK.IND_TEST_NAME ON YANGTK.TEST(NAME);
索引已创建。
SQL> SELECT ID FROM YANGTK.TEST WHERE ID = 123;
上一篇:Oracle如何配置逻辑备用数据库
下一篇:Sql server动态建立数据对象结构
|