Deshabilitar el DBMS Scheduler de Oracle

Consejo Breve

Algunas veces necesitamos evitar que se ejecuten todos los jobs calendarizados para realizar algún mantenimiento o instalación. Comunmente se cambia el parámetro JOB_QUEUE_PROCESSES a cero, pero tambien podemos deshabilitar el DBMS_SCHEDULER.

Deshabilitar el DBMS Scheduler

Puedes deshabilitar el Scheduler cambiando el atributo SCHEDULER_DISABLED a TRUE:

SQL> exec dbms_scheduler.set_scheduler_attribute ( 'SCHEDULER_DISABLED', 'TRUE' );
PL/SQL procedure successfully completed.

SQL> select value from dba_scheduler_global_attribute where attribute_name = 'SCHEDULER_DISABLED';
VALUE
----------
TRUE

Con el fin de validar podemos en enviar un job para que se ejecute con la opción use_current_session en FALSE, como se describe en la Documentación del DBMS_SCHEDULER:

Cuando la opción use_current_session es FALSE, el comando RUN_JOB regresa inmediatamente y el job es tomando por el coordinador de jobs y se le pasa hacia un job esclavo para su ejecución. Las vistas y registros del Scheduler deben ser consultadas para ver la salida del job.

SQL> exec dbms_scheduler.run_job(job_name => 'PURGE_LOG', use_current_session => FALSE);
BEGIN dbms_scheduler.run_job(job_name => 'PURGE_LOG', use_current_session => FALSE); END;

*
ERROR at line 1:
ORA-27492: unable to run job "SYS"."PURGE_LOG": scheduler unavailable
ORA-06512: at "SYS.DBMS_ISCHED", line 242
ORA-06512: at "SYS.DBMS_SCHEDULER", line 566
ORA-06512: at line 1

Como podemos ver recibimos un error indicando scheduler no disponible.

Rehabilitar el DBMS Scheduler

Con el fin de habilitar de nuevo el Scheduler cambiamos el atributo SCHEDULER_DISABLED a FALSE:

SQL> exec dbms_scheduler.set_scheduler_attribute ( 'SCHEDULER_DISABLED', 'FALSE');
PL/SQL procedure successfully completed.

SQL> select value from dba_scheduler_global_attribute where attribute_name = 'SCHEDULER_DISABLED';
no rows selected

y ahora podemos enviar jobs para que se ejecuten en el Scheduler:

SQL> exec dbms_scheduler.run_job(job_name => 'PURGE_LOG', use_current_session => FALSE);

PL/SQL procedure successfully completed.


SQL> select job_name, status, error#, actual_start_date from dba_scheduler_job_run_details where owner = 'SYS' and job_name = 'PURGE_LOG' order by 4 desc;

JOB_NAME                       STATUS                             ERROR# ACTUAL_START_DATE
------------------------------ ------------------------------ ---------- ---------------------------------------------------------------------------
PURGE_LOG                      SUCCEEDED                               0 23-JUL-20 10.58.20.841421 AM PST8PDT
...