我有使用Spring JPA和Hibernate连接到ORACLE 11g数据库的Java应用程序。
有时,我需要在数据库中drop partition
并重建所有UNUSABLE global indexes
到USABLE状态。 (由于删除分区命令,索引变得不可用)
在我的分区被删除和UNUSABLE索引尚未重建之间,我的在线应用程序失败了ORA-01502 error
,如下所示。
Caused by: java.sql.BatchUpdateException: ORA-01502: index 'USER.INDEX_NAME' or partition of such index is in unusable state
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10070)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:213)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 94 more
在SQL中,可以通过设置skip_unusable_indexes=TRUE
来忽略UNUSABLE索引。这种方式查询优化器选择不使用索引的不同(昂贵)执行计划,并且由于索引不可用而不报告DML
查询的任何失败。
在Hibernate中是否有任何类似的选项可以用来在索引处于UNUSABLE状态时不会失败?
我正在使用的版本 休眠:3.6.9 甲骨文:11克 Java:7
答案 0 :(得分:0)
您可以尝试执行:
ALTER SESSION SET skip_unusable_indexes=true
与this类似,但此会话将返回到收集池并重新使用,因此这将影响多个查询。
如果我是你,我会问自己"为什么我的索引无法使用?"除非您正在执行某些维护或执行某些非常大的批处理,否则这种情况不应发生。你可能有一个24/7系统,你真的不想停止系统维护。在这种情况下,您可以系统地设置选项,而无需对代码进行单一更改。这样,系统会变慢,但在维护期间表现更好。 请记住,用于强制执行约束的索引无法被忽略,插入/更新查询无论如何都会失败。并添加一些自动检查,在特定时间报告PRO中的不可用索引。只是发送电子邮件的PL / SQL进程可以正常
另一种方法是仅在数据库更改期间更改选项:
ALTER SYSTEM SET skip_unusable_indexes=true;
ALTER TABLE T1 DROP PARTITION P1;
ALTER INDEX I1 REBUILD ONLINE
ALTER SYSTEM SET skip_unusable_indexes=false;
在dba.stackexchange.com中讨论了删除分区的更好方法。所以你并不孤单,但解决方案适用于Oracle 12C。
答案 1 :(得分:0)
您可以重建索引:
ALTER INDEX USER.INDEX_NAME REBUILD;