2009-05-19 6 views
0

J'ai juste eu un crash de base de données oracle9 et il m'a laissé avec quelques fichiers .trc. Certains d'entre eux ont spécifié des index qui n'étaient pas corrects et j'ai abandonné et lu ces index.Comment corriger une incompatibilité de nombre de lignes Table/Index oracle

Cependant, quand je lance:

ANALYZE TABLE TABLESPACE.TABLE VALIDATE STRUCTURE CASCADE; 

Je reçois encore une erreur: ora_00900, sqlstate: 4200

Cela crée un fichier .trc avec:

Table/Index row count mismatch 
table 1172 : index 1250, 0 
Index root = tsn: 9 rdba: 0x0240390b 

Que dois-je faire avec cette information?

Je trouve ce lien, mais je ne suis pas sûr de savoir comment l'utiliser: http://www.freelists.org/post/oracle-l/Table-index-mismatch-trace-file,1

Répondre

3

L'erreur indique que vos index (peut-être pas ceux que vous pensiez) sont toujours mauvais. À partir de votre lien, si vous exécutez la requête via SQL * PLUS, il vous sera demandé un numéro rdba. Entrez la valeur de votre message d'erreur "0x0240390b" (sans guillemets). Cela renverra un numéro de fichier et un numéro de bloc.

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; 

Ensuite, lancez la requête suivante:

select owner, segment_name, segment_type 
from dba_segments 
where header_file = <rfile#> 
    and header_block = <block#> 

Cela vous donnera l'index offensant pour être abandonnées et recréés.

+0

cela peut-il être modifié donc je n'ai pas à taper la commande via sqlplus? J'ai un accès plus facile aux outils comme l'écureuil. –

+0

Dans la première requête, remplacez le texte '&& rdba' (y compris les guillemets) par '0x0240390b' (y compris les guillemets). Ensuite, exécutez la requête où vous voulez. –

+0

Got it, cette requête fonctionne. Cependant, la deuxième requête ne le fait pas. La table dba_extents a file_id = 9 hits, mais rien ne correspond à la partie block_id de la clause where. –

0

Pour être honnête, avec une erreur comme cela, je recommande l'ouverture d'un SR avec Oracle - vous voulez vous assurer que vous ne perdez pas vos données!

Questions connexes