Problemas Oracle Jobs. No se ejecuta.
1. Objetivo
El objetivo de este articulo explicar el problema que puede surgir en las bases de datos oracle9 cuando el proceso background que gestiona las colas de oracle se queda colgado. En este documento se explica como detectar esta situación y solucionarla. Si deseas saber más acerca de Oracle Jobs pincha aquí.
2. Jobs Oracle
Los jobs de oracle es una forma de automatizar una tarea dentro de la base de datos oracle. Para que estos funcionen la base de datos tiene que estar activa y el parámetro job_queue_processes del init.ora o spfile tiene que ser mayor que cero.
Para verificar que el valor de este parámetro es mayor que cero podemos realizarlo de la siguiente forma. (Usuario sys)
SQL> select value from v$parameter where name like '\%job\%'
El número obtenido nos indicará las “colas” que gestionarán los jobs de nuestra base de datos y creará el proceso ora_cjq0_sid en el sistema operativo.
Para ver si la base de datos tiene algún job programado podemos realizar la siguiente consulta con el usuario sys
SQL> select * from dba_jobs
Ejemplo de consultas con usuario sys:
SQL> select job,log_user,priv_user,schema_user,last_date,last_sec,next_date,broken,interval from dba_jobs
Vemos si el parámetro job_queue_processes es mayor que 0:
SQL> select value from v$parameter where name like '\%job\%'
En caso de que no sea mayor que cero habría que modificarlo para que los jobs pudieran funcionar.
Vemos que existe un proceso en el sistema operativo ora_cjq0_sid:
$ ps –fea | grep cjq
3. Problemas Jobs
El principal problema de los jobs surge cuando estos no están ejecutando. Las causas pueden ser varias:
No existen Jobs en la base de datos: Para ello comprobamos según se ha explicado en el apartado anterior accediendo a la tabla dba_jobs los jobs que existen en la base de datos. En caso de que existan jobs es importante fijarse cuando fue la última vez que se ejecutaron y cuando se deberían de haber ejecutado.
El parámetro del job_queue_processes es igual a cero: Si existen jobs en la base de datos y estos deberían de ejecutarse nos tenemos que fijar en este parámetro para ver si es mayor que cero. Si este parámetro está a cero por muchos jobs que haya programados en la base de datos no se ejecutarán.
El proceso de jobs del sistema operativo está colgado: Cuando se detecta que un job debería haberse ejecutado y el parámetro job_queue_processes es mayor que cero, tenemos que comprobar que el proceso background que controla este proceso es correcto. Para ello realizamos como se ha visto en el apartado anterior: ps –fea | grep cjq para ver si ese proceso tiene un “tiempo” o “parámetro anormal” de ejecución.
Ejemplo:
[root@orasite root]# ps -fea | grep cjq
oracle9 1558 1 0 Jun08 ? 00:00:05 ora_cjq0_orasite1
oracle9 1626 1 38 Jun08 ? 9-22:26:08 ora_cjq0_orasite2
oracle9 18806 1 0 Jun18 ? 00:00:03 ora_cjq0_orasite3
root 27950 27883 0 10:14 pts/1 00:00:00 grep cjq
En este caso es la base de datos orasite2 la que tiene un problema en la gestión de los jobs
4. Solucionar problema jobs
Para solucionar el último caso explicado en el apartado anterior (el proceso background de la base de datos está “colgado”) realizamos los siguientes pasos
Vemos cuantos procesos hay:
SQL> show parameter job_queue_processes;
Ponemos el valor de job_queue_processes a 0 y matamos el proceso con kill -9 a nivel del sistema operativo el proceso.
SQL> alter system set job_queue_processes=0;
kill -9
Una vez que el proceso se ha ido reiniciamos al valor original job_queue_processes:
SQL> alter system set job_queue_processes=