基盤となるHibernateを使用してGrailsフレームワークにアプリケーションを実装しています。しばらく実行した後、Oracle DBエラーが発生し、問題のインデックスを再構築して解決しました。誰かが考えられる原因とそれを防ぐための方法を提案できるだろうか。
原因:org.springframework.jdbc.UncategorizedSQLException:
Hibernateオペレーション:JDBCバッチ更新を実行できませんでした。 SQLの未分類のSQLException [update RSS_ITEM set guid = ?、 pubdate = ?、 link = ?、 rss_source_id = ?、 title = ?、 description = ?、 rating_raw = ?、 rating_tuned = ?、 date_created = ?、 date_locked =?ここで、RSS_ITEM_ID =?]; SQL状態[99999];エラーコード[29861]; ORA-29861:ドメイン索引はLOADING/FAILED/UNUSABLEとマークされています
;ネストされた例外はJava.sql.BatchUpdateExceptionです:ORA-29861:ドメインインデックスはLOADING/FAILED/UNUSABLEとマークされています
壊れたインデックスを見つけるには:
select index_name,index_type,status,domidx_status,domidx_opstatus from user_indexes where index_type like '%DOMAIN%' and (domidx_status <> 'VALID' or domidx_opstatus <> 'VALID');
インデックスを再構築するには、以下を使用します。
alter index INDEX_NAME rebuild;
ドメインインデックスは、特殊なタイプのインデックスです。 OCIを使用して独自に構築することも可能ですが、Oracle Textが提供するインデックスタイプの1つを使用している可能性があります。テーブルにフリーテキスト列が含まれているようです。
最も一般的に使用されるテキスト索引は、CTXSYS.CONTEXT索引タイプです。このインデックスタイプについての要点は、大きなドキュメントのインデックス作成に伴う労力を最小限に抑えるために、トランザクションで維持されないことです。つまり、テーブルにドキュメントを挿入または更新しても、すぐにはインデックスが作成されません。代わりに、定期的にインデックスの同期を開始するデータベースジョブなどのバックグラウンドプロセスがあります。同期中はインデックスを使用できません。何らかの理由で再同期が失敗した場合は、インデックスを削除して再作成する必要があります。
これは定期的に発生しますか?もしそうなら、あなたはあなたのアプリケーションを再評価する必要があるかもしれません。おそらく、別の種類の索引(CTXSYS.CTXCATなど)の方が適切かもしれません。エラーメッセージについて私を驚かせることの1つは、UPDATEステートメントが主キーのように見えるものを含め、多くの列に触れることです。これにより、実際に変更されたかどうかに関係なく、すべての列を設定する単一の汎用更新ステートメントがあると思います。これは、通常のインデックスでは不適切です。テキストインデックスを使用している場合は、アプリケーションが強制終了されます。
http://ora-29861.ora-code.com/
原因:構築中のドメインインデックス、またはDDLの失敗により失敗した、またはDDL操作で使用不可のマークが付けられているドメインインデックスにアクセスしようとしました。
Action:指定されたインデックスがLOADINGとマークされている場合は待機するFAILEDとマークされている場合は指定されたインデックスを削除しますUNUSABLEとマークされている場合は指定されたインデックスを削除または再構築します。
うまくいけば、十分なコンテキストになるはずです。それから問題を理解できますか?