ORACLE 数据库:如何修复失效的索引
1、问题描述:ERP系统在运行时,有时会遇上这种错误:ORA-01502:index 'K3CLOUD.IDX_BD_MATER_OLDNUM' or partition of such index is in unusable state
这意思是,语句在执行时,需要使用索引,但索引失效(UNUSABLE,不可用)了。数据库反馈这个错误,意在告诉运维人员,需要修复失效的索引。
2、问题分析:我们可以在数据库里,使用下面的语句,查询失效的索引:
select ui.table_name, ui.index_name, ui.subobject_name, parted, to_char(uo.last_ddl_time,'yyyy/mm/dd hh24:mi:ss') last_ddl_time
from (select table_name, index_name, null subobject_name, 'NO' parted, status from user_indexes where status='UNUSABLE'
and partitioned='NO' and temporary='N' and index_type like '%NORMAL%'
union all
select ui.table_name, ui.index_name, uip.partition_name subobject_name, 'PART' parted, uip.status from user_ind_partitions uip
inner join user_indexes ui on (ui.index_name=uip.index_name) where uip.status='UNUSABLE'
and ui.partitioned='YES' and ui.temporary='N' and ui.index_type like '%NORMAL%'
union all
select ui.table_name, ui.index_name, uisp.subpartition_name subobject_name, 'SUBPART' parted, uisp.status from user_ind_subpartitions uisp
inner join user_ind_partitions uip on (uip.index_name=uisp.index_name and uip.partition_name=uisp.partition_name)
inner join user_indexes ui on (ui.index_name=uip.index_name)
where uisp.status='UNUSABLE' and ui.partitioned='YES' and ui.temporary='N' and ui.index_type like '%NORMAL%') ui
left join user_objects uo on (uo.object_name=ui.index_name and (uo.subobject_name=ui.subobject_name or ui.subobject_name is null))
14 order by ui.table_name, ui.index_name;
TABLE_NAME INDEX_NAME SUBOBJECT_NAME PARTED
------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ --------------
LAST_DDL_TIME
--------------------------------------
T_BD_MATERIAL IDX_BD_MATER_OLDNUM NO
2023/11/15 10:18:13
Elapsed: 00:00:03.24
上述脚本查询出当前账号下:失效索引所属的表,索引名,是否分区表,以及失效时间。
上述脚本,不仅非分区索引,对于本地分区索引,以及子分区索引,也可以可以查询。
3、问题处理:找到失效索引后,可以用附件中的存储过程脚本修复失效索引,下面是修复失效的过程:
4、问题思考:引发索引失效的原因,主要是索引键记录的ROWID,也就是键值对应的行的位置,和实际情况不匹配了,也就是,根据这索引键,找不到它所在的行了。此时,需要重建索引,让索引键值中的ROWID,真正对应上键值所在的物理行记录。
5、问题预防:可以在数据库中创建定时作业,每间隔一段时间,搜索该账号下失效的索引,找到后立即重建,确保无失效索引,确保应用系统高可用。具体操作,请看附件。
ORACLE 数据库:如何修复失效的索引
本文2024-09-23 01:16:58发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-144954.html