oracle_ora-600_13011_lors_d_un_delete

oracle ORA-600 13011 index delete

Oracle - ORA-600 13011 lors d'un DELETE

J'ai rencontré l'ORA-600 suivant à chaque fois que qu'un DELETE était lancé sur une table avec une condition where particulière :

ORA-00600: internal error code, arguments: [13011], [57783], [5214302], [2], [5214302], [17], [], []

Pour résoudre ce problème, j'ai commencé par faire un “analyze table” de la table en question :

analyze table MYTABLE validate structure cascade;

<note important>La commande ANALYZE TABLE pose un lock sur la table. Cette dernière ne sera donc pas accessible pendant l'opération qui prend malgré tout un certain temps. Attention donc si la base est en cours d'utilisation. A savoir qu'il est possible de faire un ANALYZE TABLE sur une base de standby en mode READ-ONLY.</note>

Au bout d'un moment, la commande me fait bien une erreur et me renvoie un fichier de trace :

ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file

Il suffit d'aller dans le répertoire défini par le paramètre “user_dump_dest” pour trouver la trace en question. Dans cette dernière, je trouve l'erreur suivante :

row not found in index tsn: 6 rdba: 0x018aa874

A priori, il s'agit d'un index qui pose problème, une ligne de la table ne serait pas indexée provoquant un “trou” dans l'index. Pour trouver index en question, il faut lancer la requête suivante :

SELECT dbms_utility.data_block_address_file(
         to_number(trim(leading '0' from
replace('&&rdba','0x','')),'XXXXXXXX')
       ) AS rfile#,
       dbms_utility.data_block_address_block(
         to_number(trim(leading '0' from
replace('&&rdba','0x','')),'XXXXXXXX')
       ) AS block#
FROM dual;

Lorsque le script vous demande la valeur de la variable “rdba”, indiquez celle récupérée dans l'erreur “row not found”. Dans mon cas, il s'agit de la valeur “0x018aa874”. La requête retournera normalement deux valeurs :

    RFILE#     BLOCK#
---------- ----------
         6     698484

Une dernière requête permettra avec ces deux valeurs de trouver l'index :

select owner, segment_name, segment_type from  dba_segments 
where header_file = ‹rfile#› and header_block = ‹block#›;

Une fois le nom de l'index obtenu, un drop/create, ou même un simple rebuild devrait corriger le problème d'ORA-600 :

alter index OWNER.NAME rebuild;
  • oracle_ora-600_13011_lors_d_un_delete.txt
  • Dernière modification: 2010/12/03 07:52
  • (modification externe)