Uno de los errores más comunes que podemos encontrarnos a la hora de administrar una base de datos es el ORA-00020 Maximum number of processes (n) exceeded.
Esto se refiere a que se ha alcanzado el número máximo de procesos que se pueden conectar, al mismo tiempo, a la instancia de nuestra base de datos.
Si intentamos conectarnos como SYSDBA nos saldrá el siguiente mensaje de error:
bbdd1> sqlplus "/as sysdba"
ERROR:
ORA-00020: maximum number of processes (1000) exceeded
Enter user-name:
Como vemos, el mensaje es bastante claro. La solución que podemos llevar a cabo es la de matar procesos a nivel de sistema operativo para rebajar dicho número, dado que no nos permite acceder como sysdba y matarlos desde Oracle (a no ser, claro, que ya tengamos una sesión previa iniciada).
Lo primero será identificar los procesos. Para ello, podemos lanzar el comando ps, buscando como palabra clave oracle:
bbdd1> ps -fea | grep oracle
oracle 2008 1 0 16:59 ? 00:00:35 oraclehis1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
hisspd 3697 1 0 Jul27 ? 00:00:11 /clu_fs/his/oracle/product/11.2/bin/tnslsnr listener_extproc -inherit
oracle 4616 1 0 17:14 ? 00:00:25 oraclehis1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 5121 1 0 17:17 ? 00:00:54 oraclehis1 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
.
.
La salida de este comando, obviamente, es mucho más larga que lo citado arriba. Si queremos ves el total de procesos, bastará con concatenar el comando wc:
bbdd1> ps -fea | grep oracle | wc -l
1032
¡Ajá! 1032 procesos. Si recordamos el error de arriba, nos indicaba que el nº máximo de procesos es 1000. A partir de aquí, tenemos dos opciones: o bien matar un nº considerable para rebajar esos 1032 y comprobar cuales están encolados (ya que posiblemente se repitan) o matarlos todos de una tacada con el comando kill:
bbdd1> for i in `ps aux | grep "oraclehis1" | awk '{print $2}'`; do kill -9 $i; done
Bien, si tras eso volvemos a comprobar los procesos activos de oracle, veremos que solo quedan los propios del sistema y algunos que hayan levantado tras haber abortado los anteriores:
bbdd1> ps -fea | grep oracle | wc -l
47
Eso sí, debemos esperar unos minutos hasta que el sistema operativo haya matado por completo todos los procesos y la bbdd se entere de que ya no están vivos. Pero pasados esos minutos, podremos acceder sin problemas:
bbdd1> sqlplus "/as sysdba"
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
Y listo, otro ORA solventado con éxito.
Por cierto, es posible que al intentar conectarnos con algún agente externo (como la monitorización de Nagios o alguna aplicación) el error que aparezca sea un ORA-12537:
ORA-12537: TNS:connection closed (DBD ERROR: OCIServerAttach)
Aún así, recuerda que ese error es externo y te está avisando de que el listener ha cerrado (o mejor dicho, impedido) la conexión. El análisis final debes hacerlo siempre en la base de datos, que es donde aparecerá el ORA-00020.
En un futuro post explicaremos como aumentar el nº máximo de procesos de nuestra base de datos Oracle.
Cuéntame que te ha parecido este proceso en la caja de comentarios que tienes abajo. Y si ya compartes la entrada en redes sociales, me haces un gran favor para que más gente conozca este portal.
Recuerda que puedes suscribirte a la newsletter de Como ser DBA justo en el pie de página. Solo te mandaremos un correo para avisarte de que hemos publicado una nueva entrada.