viernes, 3 de mayo de 2013

ORA-01078 ORA-29701


Sintomas:

Al iniciar la instancia de ASM se producen los siguientes errores:
grid>sqlplus / as sysasm
SQL>startup;

ORA-01078: failure in processing system parameters
ORA-29701: unable to connect to Cluster Synchronization Service

Reproducción del problema:

Ambiente:          Base de datos 11.2.0.3 con ASM sobre OEL 6 64 bits.

ps -ef |grep pmon
grid      5893     1  0 11:36 ?        00:00:01 asm_pmon_+ASM
oracle    5973     1  0 11:36 ?        00:00:02 ora_pmon_orcl

oracle>sqlplus / as sysdba
SQL>shutdown immediate;

grid>sqlplus / as sysasm
SQL>shutdown immediate;

-Se reinicia el servidor
root>reboot -f

-post-reinicio los servicios no levantaron automaticamente
grid>sqlplus / as sysasm
SQL>startup;

ORA-01078: failure in processing system parameters
ORA-29701: unable to connect to Cluster Synchronization Service

Explicación:

El CRS tiene la capacidad de conocer el estado en el que los servicios (bd y asm) se encontraban al momento del reinicio, de tal manera que cuando el servidor se reinicie y vuelva a iniciar el CRS, dejará todos los servicios como estaban. Entonces cuando se desea levantar manualmente post-reinicio el servicio de ASM (sqlplus / as sysasm, startup) es cuando se producen los siguientes errores:

ORA-01078: failure in processing system parameters
ORA-29701: unable to connect to Cluster Synchronization Service

La solucion para este caso puntual sería iniciar asm con "srvctl" y con usuario oracle: srvctl start asm;
Más no con sqlplus.

Esto no deberia pasar si modificamos la  propiedad AUTO_START=always dentro del CRS, esto hará que aunque los servicios fueron encontrados abajo al bajar el CRS, los vuelva a levantar una vez iniciado nuevamente el CRS. El valor "always" no es el default de oracle, el default es "restart".

AUTO_START puede tomar uno de los siguientes valores:

always=siempre levantará los servicios
never= nunca levantará los servicios
restore=dejará los servicios en el estado en el que se encontraban antes del reinicio.

Para ver qué valor de AUTO_START tiene cada servicio, ejecutar el siguiente comando:
crsctl status resource ora.orcl.db -p | grep AUTO_START
crsctl status resource ora.asm -p | grep AUTO_START

Soluciones:

1. Dejar que el CRS baje todos los servicios (no bajarlos manualmente):

1.1 logearse con el usuario root
1.2 export ORACLE_HOME=<home_grid>
1.3 export PATH=$ORACLE_HOME/bin:$PATH
1.4 crsctl stop crs
1.5 reiniciar el servidor

2. Cambiar el parametro AUTO_START al valor always, de esta manera aunque se baje manualmente servicio por servicio, cuando reinicie el CRS volverá a levantar todos los servicios.

(Estos pasos solo los tendrán que realizar una vez)
2.1 logearse con el usuario grid
2.2 crsctl modify resource ora.asm -attr AUTO_START=always
2.3 crsctl modify resource ora.orcl.db -attr AUTO_START=always
Siempre que se reinicie el servidor, voverá a levantar todos los servicios.



Oracle ACE Director Award - Deiby Gómez

Thanks #OracleACE Program for this awesome certificate recognizing the work I have done in the community for the last year. Looking forwa...