SQL
SELECT OBJECT_NAME, ORIGINAL_NAME, DROPTIME
FROM DBA_RECYCLEBIN
WHERE TYPE = 'INDEX' AND ORIGINAL_NAME = '你的索引名';
查看审计日志 (Audit Trail)
如果数据库开启了 DDL 审计(这是排查最准确的方法),可以查到是谁、在什么时间、从哪台机器执行了删除操作。
SQL
SELECT USERNAME, OS_USERNAME, TERMINAL, TIMESTAMP, SQL_TEXT
FROM DBA_AUDIT_TRAIL
WHERE ACTION_NAME = 'DROP INDEX' AND OBJ_NAME = '你的索引名';
查询历史会话 (ASH / AWR)
如果删除操作发生在近期,可以通过 ASH 视图查找曾经执行过 DROP 语句的会话记录。
SQL
SELECT SAMPLE_TIME, USER_ID, SQL_OPCODE, SQL_TEXT
FROM DBA_HIST_ACTIVE_SESS_HISTORY h
JOIN DBA_HIST_SQLTEXT t ON h.SQL_ID = t.SQL_ID
WHERE UPPER(t.SQL_TEXT) LIKE '%DROP INDEX%你的索引名%';
使用 LogMiner 挖掘日志
如果没有开启审计,且历史记录已被冲掉,最后的杀手锏是使用 LogMiner 去解析 Oracle 的归档日志 (Archive Logs)。这可以 100% 还原出执行 DROP INDEX 的准确时间和相关事务,但操作相对复杂。
情况二:索引状态失效 (UNUSABLE)
如果索引还在,但是查询报错或者变慢,可能是索引失效了。
1. 确认索引状态:
SQL
SELECT INDEX_NAME, STATUS, LAST_ANALYZED
FROM DBA_INDEXES
WHERE INDEX_NAME = '你的索引名';
如果 STATUS 显示为 UNUSABLE,说明索引失效。
2. 常见原因排查:
表结构维护操作: 最近是否有人对表执行了 ALTER TABLE ... MOVE 改变了数据的物理存储位置?(这会导致所有普通索引失效)。
分区表操作: 如果是分区表,近期是否执行了 DROP PARTITION、TRUNCATE PARTITION 或 SPLIT PARTITION,且没有加上 UPDATE GLOBAL INDEXES 子句?(这会导致全局索引失效)。