(转)ORA-01502
问题:ora-01502 索引或这类索引的分区处于不可用状态
引发:移动数据表分区,导致索引失效
解决:重建失效索引
1.
select index_name ,status from user_indexes where Status = 'UNUSABLE'; //查找失效索引名和状态
select 'alter index ' || index_name || ' rebuild online;' from user_indexes where Status = 'UNUSABLE' ; //构建重建索引语句
2.
create or replace procedure p_rebuild_all_index
(tablespace_name in varchar2,--这里是表空间名,如果不改变表空间,可以传入null
only_unusable in boolean) --是否仅对无效的索引操作
as
sqlt varchar(200);
begin
--只取非临时索引
for idx in (select index_name, tablespace_name, status from user_indexes where temporary = 'N') loop
--如果是如重建无效的索引,且当索引不是无效时,则跳过
if only_unusable = true and idx.status <> 'UNUSABLE' then
goto continue;
end if;
if (tablespace_name is null) or idx.status = 'UNUSABLE' then
--如果没有指定表空间,或索引无效,则在原表空间重建
sqlt := 'alter index ' || idx.index_name || ' rebuild ';
elsif upper(tablespace_name) <> idx.tablespace_name then
--如果指定的不同的表空间,则在指定表空间待建索引
sqlt := 'alter index ' || idx.index_name || ' rebuild tablespace ' || tablespace_name;
else
--如果表空间相同,则跳过
goto continue;
end if;
dbms_output.put_line(idx.index_name);
EXECUTE IMMEDIATE sqlt;
<<continue>>
null;
end loop;
end;
重建索引。如果表空间参数传入null,则在原表空间内重建索引,否则在目标表空间重建索引。如果表空间相同,则跳过。 only_unusable表示是否只对无效的索引进行重建
测试时:暂时令索引失效
1、
ALTER INDEX indexname UNUSABLE;
ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE;
--do something here
ALTER INDEX indexname REBUILD ONLINE;
2、
DROP INDEX indexname;
CREATE INDEX indexname ...
其中,ALTER INDEX indexname DISABLE | ENABLE; // Only for FBI (Function-Based Indexes) ,也就是说只有基于函数的索引才能临时禁用和启用。不是处处可用。
浙公网安备 33010602011771号