ORA-08102: Index Key Not Found

lunedì 14 gennaio 2008 alle 14:04 | Pubblicato su Diario, Installation and Configuration | Lascia un commento

Alcuni giorni su log della nostra applicazione ho trovato l’errore ORA-08102, una cosa decisamente spiacevole. Si tratta di un RAC a due nodi versione 10.1.0.5, la mia prima 10g, l’unica 1ogR1 e uno dei più grossi database che abbiamo in gestione (supera i 100 GB). L’errore viene generato quando di notte gira un task che fa la storicizzazione di alcuni dati, ovvero li copia su altre tabelle e li cancella. Contemporaneamente su entrambe le istanze Oracle viene generato un trace di tutti i processi.

Dopo un po’ di analisi sono riuscito a identificare due record per i quali effettivamente manca la chiave su uno solo degli indici. Cercando sul metalink mi sono imbattuto nelle note 108134.3 e 395006.1 che mi hanno lasciato alquanto perplesso. In sostanza si dice che la causa del problema è una scrittura persa, o un problema simile da parte del sistema operativo. La cosa più assurda di quelle note è che si dice che la soluzione di eliminare e ricreare l’indice non funziona e che occcorre fare un export/import della tabella e quindi ricreare gli indici. Io spero si tratti solo di confusione nella scrittura delle note, perchè francamente non capisco come in questo caso non funzioni la soluzione di eliminare l’indice e rifarlo da zero (escludendo i casi in cui l’indice possa essere ricostruito da dati corrotti come spiegato nella nota 96118.1).

Nella mia analisi ho appurato come cercando di cancellare i record o di modificare il valore del campo indicizzato le cui chiavi mancano sull’indice si riceva sempre l’errore ORA-08102. Ho anche avuto la prova che se faccio un’update sul campo settandolo ad un valore uguale al precedente allora non ricevo errore perchè evidentemente non va sull’indice. Il problema è che la tabella coinvolta è la più grossa del database e anche la sola ricreazione dell’indice è un’operazione improponibile, figuriamoci un export/import.

Un’altra cosa strana, sulla quale voglio indagare, è il formato del dump del blocco segnalato dall’errore. Utilizzando l’istruzione “ALTER DABASE DUMP DATAFILE X BLOCK Y” ho generato un dump del blocco incriminato e l’ho analizzato. Non è che ci abbia capito molto, però ho appurato da li che le chiavi mancano veramente. Sull’argomento devo approfondire un paio di cose che mi hanno incuriosito, ma su questo scriverò un altro post.

P.S.

Riguardo alla struttura degli indici e all’analisi dei dump dei blocchi consiglio di dare un’occhiata al blog di Richard Foote che ho gia aggiunto nella sezione “blogroll” Nelle parte “Presentations and Demos” vi sono degli interessanti articoli.

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Blog su WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: