版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
同事迁移数据库后,在新的环境下,部分索引状态变为UNUSABLE,即不可使用的非正常状态。造成这个问题的原因可能是因为根据用户导出DMP文件时,表对象存在于不同的表空间中,我记得第一次在命令行导入该表时还出了一些问题的。出现这种问题,想要直接删除该索引还删不掉,弹出框显示:You cannot delete primary/unique key indexes。此时该表中存在大量的数据,无法删除,测试rebuild也失败了。
通过以下SQL可以查询哪些索引是无效的:
select index_name from user_indexes where status <> 'VALID';
查询结果显示该索引确实处于不可用状态,没毛病。
接着,重新打开一个plsql窗口,并且以system用户登录,new一个sql window,把下面内容黏贴进去,执行一下就可以解决。
declare
-- 指向所有 UNUSABLE 状态的 index 的游标
cursor c is
select index_name, owner
from dba_indexes
where status='UNUSABLE';
owner dba_indexes.owner%type;
index_name dba_indexes.index_name%type;
begin
open c;
loop
fetch c into index_name, owner;
exit when c%notfound;
execute immediate 'alter index ' || owner || '.' || index_name || ' rebuild';
end loop;
close c;
end;
记住一定要使用DBA权限的用户登录,再执行。