oracle数据库改字段数据类型造成索引失效的bug
问题说明:
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会破坏原来索引,需要重建索引