ora-01502错误表明索引或其分区已处于unusable状态,导致dml操作立即失败;主因是分区ddl(如drop partition)未加update indexes子句,使全局索引失效,或exchange/split等操作引发元数据不一致。
ora-01502 报错直接说明索引或其分区已进入 unusable 状态,不是“可能没用上”,而是彻底不可用——dml(如 insert、update)和部分查询会立即失败。根本原因往往出在分区 ddl 操作时漏加 update indexes 子句。
为什么 ALTER TABLE DROP PARTITION 不加 UPDATE INDEXES 就会失效索引
Oracle 默认行为是:执行 ALTER TABLE ... DROP PARTITION 或 EXCHANGE PARTITION 时,**不自动维护关联索引**。尤其对全局索引(GLOBAL),只要表结构变动涉及分区边界,索引就立刻变 UNUSABLE;本地索引(LOCAL)虽按分区独立存在,但若操作触发了元数据不一致(如未带 INCLUDING INDEXES 的 EXCHANGE),也会整体置为 UNUSABLE。
常见误操作场景:
-
ALTER TABLE t DROP PARTITION p_old;→ 全局索引直接失效 -
ALTER TABLE t EXCHANGE PARTITION p_temp WITH TABLE t_staging;→ 未加INCLUDING INDEXES,本地索引状态翻为UNUSABLE -
ALTER TABLE t SPLIT PARTITION ...→ 缺少UPDATE INDEXES,新旧分区索引均不可用
UPDATE INDEXES 能修什么,不能修什么
UPDATE INDEXES 是 DDL 语句的可选子句,作用是在分区变更时**同步重建或调整索引段**,避免手动干预。但它只对“尚未失效”的索引起效——如果索引已经 UNUSABLE,再补加这个子句也没用。
生效前提与限制:
- 仅适用于
DROP、SPLIT、MERGE、EXCHANGE等分区 DDL,TRUNCATE PARTITION不支持该子句 - 对全局索引:自动重建整个索引(等价于隐式执行
ALTER INDEX idx REBUILD) - 对本地索引:仅重建受影响的分区索引段,其余保持
USABLE - 不支持
ADD PARTITION场景(新增分区不触发现有索引失效,无需此子句)
已经 UNUSABLE 了,怎么快速恢复
先确认状态,再分类型处理。别一上来就 REBUILD 全局索引——大表锁表时间可能超预期。
查状态用这两条:
SELECT index_name, index_type, status FROM user_indexes WHERE table_name = 'YOUR_TABLE';
SELECT index_name, partition_name, status FROM user_ind_partitions WHERE index_name IN (SELECT index_name FROM user_indexes WHERE table_name = 'YOUR_TABLE');
恢复策略:
- 若
user_indexes.status = 'UNUSABLE'(全局索引或本地索引整体失效)→ 必须先ALTER INDEX idx REBUILD - 若
user_indexes.status = 'VALID'但某几个user_ind_partitions.status = 'UNUSABLE'→ 可定向ALTER INDEX idx REBUILD PARTITION p_name - 唯一索引(
uniqueness = 'UNIQUE')不支持ONLINE重建,必须离线操作 - 重建后务必跑
DBMS_STATS.GATHER_INDEX_STATS,否则执行计划仍可能跳过该索引
下次做分区 DDL 前必须检查的三件事
预防永远比修复便宜。每次执行前花 30 秒确认:
- 目标表索引类型:
SELECT index_type FROM user_indexes WHERE table_name = 'T'—— 是GLOBAL还是LOCAL? - 是否含唯一约束:
SELECT uniqueness FROM user_indexes WHERE table_name = 'T'——UNIQUE索引禁用ONLINE,且 DDL 后需额外验证约束有效性 - DDL 语句末尾是否显式写了
UPDATE INDEXES(DROP/SPLIT等)或INCLUDING INDEXES(EXCHANGE)?漏写等于埋雷
真正容易被忽略的是:即使加了 UPDATE INDEXES,如果操作中途失败(比如空间不足、权限缺失),索引仍可能卡在 UNUSABLE 状态,且不会回滚——必须人工介入检查并清理残留临时段。











