出现情况:
如果某个索引由于介质损坏而不可用,那么终端用户会收到错误消息。只要试图使用受损表空间中的某个索引对一个表进行插入或删除操作,那么就会出现错误消息。当且仅当更新操作不影响索引列时,更新操作才会成功。如果试图使用丢失的索引,那么查询就会生成错误。这些问题也会延伸至约束。针对存在外键关系的子表的DML要求父标的主键索引可用。如果父表的主键索引不可用,那么即使子表的索引可用仍然会为DML锁定子表。此时不影响约束列的更新操作是唯一的例外。
解决方法:
方法一:
假设数据库在archivelog模式中运行,那么索引表空间可以像其他表空间一样被还原与恢复。
方法二:
1)将受损得表空间脱机。
2)确定受损表空间中的索引。
3)删除受损表空间并删除其数据文件。
4)创建一个新的表空间。
5)在新的表空间内生成所有索引。
为了确定表空间中的索引,需要查询数据字典视图DBA_SEGMENTS:
SQL> select owner,segment_name from dba_segments where tablespace_name='INDX' and segment_type='INDEX';
使用下面的命令可以删除表空间:
SQL> drop tablespace indx including contents and datafiles;
这个命令会从数据字典和控制文件中删除对指定表空间及其数据文件的所有引用、删除表空间的所有对象以及从磁盘中删除物理文件。
使用Data Pump在删除表空间之前抽取出索引创建语句可能是一种更好的方法。
$ expdp hr/hr directory=dp_dir dumpfile=ind.dmp include=index
$ impdb hr/hr direcotry=dp_dir dumpfile=ind.dmp sqlfile=ind.sql
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11411056/viewspace-733734/
,如需转载,请注明出处,否则将追究法律责任。