web-dev-qa-db-fra.com

Quelqu'un peut-il expliquer l'erreur ORA-29861 en anglais simple et sa cause possible?

J'ai une application implémentée dans le cadre Grails utilisant Hibernate sous-jacent. Après un certain temps, j'ai eu une erreur Oracle DB et l'ai résolue en reconstruisant l'index incriminé. Je me demande si quelqu'un peut proposer la ou les causes possibles et les moyens de l'empêcher de se produire.

Causé par: org.springframework.jdbc.UncategorizedSQLEException:

Opération de mise en veille prolongée: impossible d'exécuter la mise à jour par lots JDBC; non classé SQLException pour SQL [update RSS_ITEM set guid = ?, pubdate = ?, link = ?, rss_source_id = ?, title = ?, description = ?, rating_raw = ?, rating_tuned = ?, date_created = ?, date_locked =? où RSS_ITEM_ID =?]; État SQL [99999]; code d'erreur [29861]; ORA-29861: l'index de domaine est marqué LOADING/FAILED/UNUSABLE

; l'exception imbriquée est Java.sql.BatchUpdateException: ORA-29861: l'index de domaine est marqué LOADING/FAILED/UNUSABLE

26
hko19

Pour localiser l'utilisation d'index cassé:

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');

Pour reconstruire l'index, utilisez:

alter index INDEX_NAME rebuild;
28
vagovszkym

Les index de domaine sont un type spécial d'index. Il est possible de créer le nôtre à l'aide d'OCI, mais il est probable que vous utilisiez l'un des types d'index proposés par Oracle Text. Je dis cela car votre tableau semble inclure des colonnes de texte libre.

L'index de texte le plus couramment utilisé est le type d'index CTXSYS.CONTEXT. Le point sur ce type d'index est qu'il n'est pas géré de manière transactionnelle, afin de minimiser l'effort impliqué dans l'indexation de documents volumineux. Cela signifie que lorsque vous insérez ou mettez à jour un document dans votre tableau, il n'est pas indexé immédiatement. Il s'agit plutôt d'un processus d'arrière-plan, tel qu'un travail de base de données, qui démarre régulièrement la synchronisation d'index. L'index est inutilisable pendant sa synchronisation. Si la resynchronisation échoue pour une raison quelconque, vous devrez supprimer et recréer l'index.

Est-ce un événement régulier pour vous? Si c'est le cas, vous devrez peut-être réévaluer votre demande. Peut-être qu'un autre type d'index (tel que CTXSYS.CTXCAT) pourrait être plus approprié. Une chose qui me frappe dans votre message d'erreur est que votre instruction UPDATE touche beaucoup de colonnes, y compris ce qui ressemble à la clé primaire. Cela me fait penser que vous avez une seule instruction de mise à jour générique qui définit chaque colonne, qu'elle ait réellement changé ou non. C'est une mauvaise pratique avec des index normaux; cela tuera votre application si vous utilisez des index de texte.

15
APC

http://ora-29861.ora-code.com/

Cause : Une tentative d'accès à un index de domaine en cours de construction ou marqué comme ayant échoué par une DDL infructueuse ou marqué comme inutilisable par une opération DDL a été tentée. .

Action : Attendez si l'index spécifié est marqué LOADING Supprimez l'index spécifié s'il est marqué FAILED Drop ou reconstruisez l'index spécifié s'il est marqué UNUSABLE.

J'espère que cela devrait suffire au contexte. Pouvez-vous comprendre le problème à partir de cela?

4
skaffman