Normalmente el sistema de codificación de
errores Oracle ofrece información clara de lo que está ocurriendo. Sin embargo en algunas ocasiones surgen códigos de error que dan información demasiado imprecisa, y también puede ocurrir que depediendo de lo que intentemos salgan errores diferentes.
En una ocasión, una avería en la UPS (Uninterruptible Power Supply) provocó un corte de suministro eléctrico en un servidor Oracle. Se arrancó el servidor, pero cada vez que se intentaba acceder por SQL*Plus, Toad, Aplicaciones, etc. aparecía el error
ORA-01033: Oracle initialization or shutdown in progress.
El servicio Oracle se encontraba corriendo sobre un cluster activo-pasivo (Service Guard de HP) y el comando
#cmviewcl mostraba que el cluster estaba levantado y el paquete Oracle corriendo.
Por supuesto lo primero fue reiniciar el cluster:
cmhaltpkg oracle_servicio -> Se para el paquete.
cmhaltcl -> Se para el cluster.
cmviewcl -> Todo aparece Down.
cmruncl -> Cluster levantado, todos los elementos UP.
Pero no resultó. Aunque el paquete parecía estar UP, Oracle no estaba en estado abierto. Daba el mismo error ORA-01033. Así que tocaba ver que estaba ocurriendo.
Desde la misma máquina, iniciando sesión con el usuario "oracle" entramos en sqlplus:
SQL>sqlplus “/as sysdba”
Y al probar ejecutar cualquier sentencia SQL, nos apareció un error similar al anterior, pero diferente...
SQL>select * from user_tables; -> Error ORA-01219. Database not open.
Con esos dos mensajes ya vemos lo que está ocurriendo. Por una parte nos indican que Oracle se está inicializando y por otra que la base de datos no está abierta.
Entoces toca saber cual es el estado de la base de datos...
SQL>select open_mode from v$database; -> MOUNTED.
Si la base de datos está montada lo siguiente sería abrirla. Intentamos levantarla...
SQL>alter database open; -> Error ORA-03113: End-of-file on communication channel.
Vaya, un tercer error diferente, y este ya no hace más que despistar. Lo que ocurre es que ha interrumpido la acción y ha dado por terminada la comunicación.
Probamos a desmontar y montar la base de datos y a ver si arranca de una vez:
SQL> shutdown immediate -> OK
SQL> startup mount -> OK
SQL> alter database open; -> Error ORA-03113: End-of-file on communication channel.
Está claro que necesitamos algo más de información. Vamos al log de Oracle (fichero alert_servicio.log) para ver si ha recogido algún detalle más:
Vemos que cada vez que hemos intentado el ALTER DATABASE OPEN, se registra el mismo error:
ORA-00600: Internal error code. Arguments: [kcratr1-lastbwr] Vaya, un error genérico de los que no dicen nada salvo por el argumento kcratr1-lastbwr.
Bien, pues llegamos al final. En mi caso ese "Internal Error" se solucionó simplemente con una recuperación de la Base de Datos. Esta recuperación consiste en aplicar los cambios almacenados en los ficheros de REDO (redolog files).
Teniendo la base de datos montada, hacemos una recuperación de la base de datos:
SQL> recover database; -> Media recovery complete.
SQL> alter database open; -> Database altered.
De esta forma la base de datos ya se quedó funcionando con normalidad.
Saludos.