Outils pour utilisateurs

Outils du site


oracle_ora-600_13011_lors_d_un_delete

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

oracle_ora-600_13011_lors_d_un_delete [03/12/2010 07:52] (Version actuelle)
Ligne 1: Ligne 1:
 +{{tag>​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 :
 +<​code>​ORA-00600:​ internal error code, arguments: [13011], [57783], [5214302], [2], [5214302], [17], [], []</​code>​
 +
 +Pour résoudre ce problème, j'ai commencé par faire un "​analyze table" de la table en question :
 +<​code>​analyze table MYTABLE validate structure cascade;</​code>​
 +
 +<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 :
 +<​code>​ERROR at line 1:
 +ORA-01499: table/index cross reference failure - see trace file</​code>​
 +
 +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 :
 +<​code>​row not found in index tsn: 6 rdba: 0x018aa874</​code>​
 +
 +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 :
 +<​code>​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;</​code>​
 +
 +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 :
 +<​code> ​   RFILE# ​    ​BLOCK#​
 +---------- ----------
 +         ​6 ​    ​698484</​code>​
 +
 +Une dernière requête permettra avec ces deux valeurs de trouver l'​index :
 +<​code>​select owner, segment_name,​ segment_type from  dba_segments ​
 +where header_file = ‹rfile#​› and header_block = ‹block#​›;</​code>​
 +
 +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 :
 +<​code>​alter index OWNER.NAME rebuild;</​code>​
oracle_ora-600_13011_lors_d_un_delete.txt · Dernière modification: 03/12/2010 07:52 (modification externe)