Me toco un interesante caso sobre corrupción de indices en Oracle 8i… les cuento lo realizado. Bajando una base de datos XXX me encuentro con el siguiente mensaje en el archivo de alertas:
Xxx Xxx 99 99:99:99 9999
Errors in file /…/…/…/…/ora_999999_INSTANCIA.trc:
ORA-00600: internal error code, arguments: [12700], [579158], [269128549], [37], [], [], [], []
Para resolver este problema, me apoye en la siguiente nota de metalink:
Subject: Resolving an ORA-600 [12700] error in Oracle 8 and above.
Doc ID: 155933.1
In Oracle 8.x and 9.x, it is ORA-600 [12700][a][b][c] , where
Arg [a] dataobj# from sys.obj$
Arg [b] relative dba of the data block
Arg [c] slot number of the row in the data block
Primero: Necesitaba saber que objeto esta generando la corrupción para ello, se realiza una consulta a la tabla de sistema sys.obj$:
SQL> select NAME from sys.obj$ where DATAOBJ#=579158;
NAME
——————————
TABLAXXX
Segundo: El articulo recomienda la utilización del objeto pl/sql oerr12700 el cual es un utilitario de oracle que nos “traduce” la información del error y valida si la corrupción esta en la tabla:
SQL> set serveroutput on
SQL> execute oerr12700( 579158,269128549,37 );
ORA-600 [12700] [579158],[269128549],[37]
————————————————–
there is an index pointing to a row in ESQUEMAXXX.TABLAXXX
row is slot 37 in file 64 block 693093
one index entry is pointing to ROWID=’AACNZWABAAACpNlAAl’
————————————————–
You may want to check the integrity of ESQUEMAXXX.TABLAXXX
executing :
dbv file=/…/…/…/datafilexxx.dbf
blocksize=8192 start=693093 end=693093
————————————————–
IF dbv does not show any corruption, you can try to
find the corrupted indexes using the queries proposed
by the procedure oerr12700diag(579158,269128549,37)
——————————————————-
PL/SQL procedure successfully completed.
Tercero: Si se dan cuenta la acción del objeto pl/sql no realiza acción alguna sino, que prepara todo para que nosotros trabajemos. Por lo tanto, ejecutamos el DBVERIFY que nos indica el resultado del pl/sql:
Servidor prompt; dbv file=/…/…/…/datafilexxx.dbf blocksize=8192 start=693093 end=693093
DBVERIFY: Release 8.1.6.3.0 - Production on Sáb Mar 14 03:08:33 2009
(c) Copyright 1999 Oracle Corporation. All rights reserved.
DBVERIFY - Verification starting : FILE = /…/…/…/datafilexxx.dbf
DBVERIFY - Verification complete
Total Pages Examined : 1
Total Pages Processed (Data) : 1
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Cuarto: Como no se encuentra corrupción en la tabla, se sigue con la recomendación y se evalua el objeto pl/Sql oerr12700diag que busca corrupción en los indices asociados a la tabla en cuestión:
SQL> set serveroutput on
SQL> execute oerr12700diag(579158,269128549,37);
————————————————–
IF dbv did not show any corruption, you can try to
find the corrupted indexes using following queries:
——————————————————-
If a query returns “no rows selected” index is sane
If a query returns AACNZWABAAACpNlAAl index is corrupted
…………………………………………..
.
To test ESQUEMAXXX.TABLAXXX indexes
.
.
To test INDEX INDICEXXX001 you run :
.
select rowid “INDICEXXX001 corrupted!”
from
(SELECT /*+ INDEX_FFS(TABLAXXX,INDICEXXX001) */
INSMITEMVTARECID_ORI,rowid from SWBAPPS.SM_ASIG_PAG_ITEM where
INSMITEMVTARECID_ORI=INSMITEMVTARECID_ORI)
where rowid=’AACNZWABAAACpNlAAl’;
.
To test INDEX INDICEXXX002 you run :
.
select rowid “INDICEXXX002 corrupted!”
from
(SELECT /*+ INDEX_FFS(TABLAXXX,INDICEXXX002) */
INSMITEMVTARECID_DES,rowid from SWBAPPS.SM_ASIG_PAG_ITEM where
INSMITEMVTARECID_DES=INSMITEMVTARECID_DES)
where rowid=’AACNZWABAAACpNlAAl’;
.
To test INDEX INDICEXXX003 you run :
.
select rowid “INDICEXXX003 corrupted!”
from
(SELECT /*+ INDEX_FFS(TABLAXXX,INDICEXXX003) */
INSMASIGPAGITEMID,rowid from ESQUEMAXXX.TABLAXXX where
INSMASIGPAGITEMID=INSMASIGPAGITEMID)
where rowid=’AACNZWABAAACpNlAAl’;
PL/SQL procedure successfully completed.
Quinto: Igual que el ejercicio sobre la busqueda de corrupción en la tabla, el resultado del pl/sql no da las herramientas necesarias para validar los indices asociados a la tabla, buscando corrupcion en ellos. Y la logica es super simple, por cada indice que este asociado a la tabla, se crea un select tu lo ejecutas y si da registros quiere decir que dicho indice esta corrupto sino esta ok.
Sexto: Bueno lamentablemente me encontre con un indice corrupto … ¿la solución? … simplemente reconstruirlo.
Claramente, existen otras formas mas avanzadas de revisar y solucionar corrupción pero esta en especial brinda bastante ayuda al usuario, por ello la publicación.
SALUDOS !!!
LUCHANDO CONTRA LA CORRUPCION !!!