ORACLE 数据库:如何修复失效的索引

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

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、问题预防:可以在数据库中创建定时作业,每间隔一段时间,搜索该账号下失效的索引,找到后立即重建,确保无失效索引,确保应用系统高可用。具体操作,请看附件。

 重建失效索引脚本3_20230908.zip


ORACLE 数据库:如何修复失效的索引

1、问题描述:ERP系统在运行时,有时会遇上这种错误:ORA-01502:index 'K3CLOUD.IDX_BD_MATER_OLDNUM' or partition of such...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息