oracle数据库改字段数据类型造成索引失效的bug

发布时间 2023-04-19 15:13:18作者: yorkiiz
问题说明:

oracle的varchar2最大长度为4000,由于某个字段长度超过4000,所以就将其数据类型改成了CLOB,结果报错:

java.sql.SQLException: ORA-01502: 索引 'DEV.SYS_C0019380' 或这类索引的分区处于不可用状态

问题解决:

查看索引状态:

当时有条索引的状态不是valid

select index_name,status from USER_INDEXES WHERE TABLE_NAME = 'T_CREDIT_FAHAI_PERSON_CPWS';

重建索引,索引状态变成valid可用状态,问题解决

ALTER INDEX SYS_C0019389 REBUILD;
问题重现:

当时改索引的过程是a(varchar)--->a(long)--->a(clob),新建字段c,保存a中数据,删除a中所有数据,修改a字段数据类型,a(varchar)先改成a(long),再改成a(clob),然后把数据从c中复制到a

此时出现了一个现象,索引数量增加了一条,然后索引状态不可用了

原因解释:

主键索引是normal类索引,每条clob字段是lob类型索引,新增一个clob字段都会多加一条索引,而修改字段类型成clob会破坏原来索引,需要重建索引