全局索引DROP PARTITION后变UNUSABLE是Oracle强制一致性保护机制,非操作失败;修复须先ALTER INDEX UNUSABLE再REBUILD,且必须查user_indexes确认status='UNUSABLE'后操作。
全局索引在 DROP PARTITION 后变成 UNUSABLE,不是操作出错,而是 Oracle 的强制一致性保护机制——它宁可停用索引,也不返回错误结果。修复必须手动执行两步:先置为不可用,再重建。
别凭经验猜,直接查数据字典。失效的索引不会报错,但状态字段明确标出问题:
SELECT index_name, status, funcidx_status FROM user_indexes WHERE table_name = 'YOUR_TABLE' AND index_type = 'NORMAL';status = 'UNUSABLE' 就是目标;funcidx_status = 'DISABLED' 通常和函数索引依赖有关,与分区无关,忽略即可user_ind_partitions 不适用;本地索引(LOCAL)不受影响,不用查直接 ALTER INDEX ... REBUILD 风险高:若索引当前是 VALID,重建全程锁索引;若已是 UNUSABLE,某些 Oracle 版本会拒绝执行并报 ORA-01408(误导性错误)。正确做法是显式两步控制:
ALTER INDEX idx_name UNUSABLE; —— 毫秒级,几乎不阻塞 DMLALTER INDEX idx_name REBUILD TABLESPACE ts_name PARALLEL 4; —— 指定表空间和并行度可提速LOGGING:REBUILD LOGGING PARALLEL 4
UPDATE GLOBAL INDEXES 补救:它只是 DDL 子句,不是修复命令,对已失效索引完全无效UPDATE GLOBAL INDEXES 是预防手段,但只对“未来”的 DDL 生效,对已发生的失效毫无作用。使用前必须注意三点:
DROP、EXCHANGE、SPLIT、MERGE、MOVE,不支持 TRUNCATE PARTITION 或 ADD PARTITION
ORA-01502?大概率是:DDL 执行中断(如被 kill、实例崩溃)、索引本身已有 UNUSABLE 状态,或执行账号缺少对索引的 ALTER 权限最易被忽略的是:即使加了 UPDATE GLOBAL INDEXES,如果操作中途失败,索引状态可能卡在中间态,残留为 UNUSABLE,且 Oracle 不会自动清理——必须显式重建,不能重试原 DDL。