最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle分区表全局索引失效如何处理
时间:2026-08-24 09:28:49 编辑:袖梨 来源:一聚教程网
全局索引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)不受影响,不用查
修复已失效的全局索引:UNUSABLE + REBUILD 是唯一稳解
直接 ALTER INDEX ... REBUILD 风险高:若索引当前是 VALID,重建全程锁索引;若已是 UNUSABLE,某些 Oracle 版本会拒绝执行并报 ORA-01408(误导性错误)。正确做法是显式两步控制:
- 先快速置为不可用:
ALTER INDEX idx_name UNUSABLE;—— 毫秒级,几乎不阻塞 DML - 再重建:
ALTER INDEX idx_name REBUILD TABLESPACE ts_name PARALLEL 4;—— 指定表空间和并行度可提速 - 如需归档安全,加
LOGGING:REBUILD LOGGING PARALLEL 4 - 切勿用
UPDATE GLOBAL INDEXES补救:它只是 DDL 子句,不是修复命令,对已失效索引完全无效
下次做 DROP PARTITION 时如何预防失效
UPDATE GLOBAL INDEXES 是预防手段,但只对“未来”的 DDL 生效,对已发生的失效毫无作用。使用前必须注意三点:
- 它仅支持
DROP、EXCHANGE、SPLIT、MERGE、MOVE,不支持TRUNCATE PARTITION或ADD PARTITION - 语法必须紧接主语句后、分号前,不能换行或被注释隔开,否则 Oracle 直接忽略
- 加了仍报
ORA-01502?大概率是:DDL 执行中断(如被 kill、实例崩溃)、索引本身已有UNUSABLE状态,或执行账号缺少对索引的ALTER权限
最易被忽略的是:即使加了 UPDATE GLOBAL INDEXES,如果操作中途失败,索引状态可能卡在中间态,残留为 UNUSABLE,且 Oracle 不会自动清理——必须显式重建,不能重试原 DDL。