lunes, 7 de diciembre de 2015

6. SOBRE LOS JOB´S EN ORACLE

CREACION DE JOBS

Uno de los errores más comunes se refleja en que el parámetro de ejecución de los JOBS en la base de datos no se encuentre un valor superior a 0, para lo anterior se revisa lo siguiente:

Nos conectamos con system o sys vía sqlplus :

NOTA: 

TENER EN CUENTA QUE PARA LAS DIFERENTES MODIFICACIONES SOBRE UN JOB SE DEBEN CONFIRMAR CON  COMMIT;

SQL> show parameters job

Debería mostrar job_queue_processes = n en donde n debe ser mayor a 0. Si llega a ser 0 entonces se ejecuta el siguiente script para modificar el parametro:

SQL> alter system set job_queue_processes = 5;

verificamos si así arrancan.

Lo anterior se explica que:

job_queue_processes=5 (5 por decir un valor)
job_queue_interval=1

Esto significa que se levantan 5 procesos nuevos que se despiertan cada minuto para ver si hay algún JOB para lanzar.

- Se recomienda poner el nombre del JOB para poder identificar su monitoreo y seguimiento más adelante.

- Para crear el job se recomienda cualquiera de las siguientes sentencias.

Cabe anotar que existe en Oracle 11g varios tipos de tareas programadas una de ella se ejecuta sobre DBMS_SCHEDULER.CREATE_JOB. el DBMS_SHEDULER se implementó a partir de Oracle10G.

BEGIN

DBMS_SCHEDULER.CREATE_JOB(
job_name => 'DELETE_LOGS',
job_type => 'EXECUTABLE',
job_action => '/users/oracle/scripts/delete_logs.sh ',
repeat_interval => 'FREQ=DAILY;BYHOUR=14;BYMINUTE=11',
job_class => '"DEFAULT_JOB_CLASS"',
auto_drop => FALSE,
comments => 'Delete old files',
enabled => TRUE);
END;
/

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"UXXIAC"."OCUPACIONES"',
            job_type => 'STORED_PROCEDURE',
            job_action => 'UXXIAC.PR_OCUPACIONES',
            number_of_arguments => 0,
            start_date => TO_TIMESTAMP_TZ('2015-01-23 09:05:12.000000000 AMERICA/BOGOTA','YYYY-MM-DD HH24:MI:SS.FF TZR'),
            repeat_interval => 'FREQ=MINUTELY;INTERVAL=2',
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => '');
      DBMS_SCHEDULER.SET_ATTRIBUTE(
             name => '"UXXIAC"."OCUPACIONES"',
             attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);
     DBMS_SCHEDULER.enable(
             name => '"UXXIAC"."OCUPACIONES"');
END;
DECLARE
X NUMBER;


BEGIN
           SYS.DBMS_JOB.SUBMIT
    (
    job => X
    ,what   => 'ESQUEMA.PROCEDIMIENTO_ALMACENADO;'
    ,next_date  => to_date('30/11/2010 13:00:30','dd/mm/yyyy hh24:mi:ss')
    ,interval   => 'TRUNC(SYSDATE+7)'
    ,no_parse   => FALSE
    );
:JobNumber := to_char(X);
END;

- Para ver los detalles del JOB se ejecuta la siguiente sentencia.


SELECT

  job_name
,last_start_date
,last_run_duration
,next_run_date
,repeat_interval
FROM dba_scheduler_jobs
WHERE job_name='<nombre_job>';

- De igual manera, cada vez que se ejecuta el job se guarda un registro de log.

SELECT
job_name
,log_date
,operation
,status
FROM dba_scheduler_job_log
WHERE job_name='<nombre_job>';

- Para limpiar todo el histórico del JOB

SQL> exec dbms_scheduler.purge_log();

- Modificar un JOB

Se puede modificar los atributos de un job mediante el procedimiento SET_ATTRIBUTE.

BEGIN
  dbms_scheduler.set_attribute(
name=>'<nombre_job>'
   ,attribute=>'repeat_interval'
   ,value=>'freq=weekly; byday=mon');
END;
/

- Parar un JOB

SQL> exec dbms_scheduler.stop_job(job_name=>'<nombre_job>');

- Habilitar o deshabilitar un JOB

exec dbms_scheduler.disable('<nombre job>');
exec dbms_scheduler.enable('<nombre job>');

- Borrar un JOB

exec dbms_scheduler.drop_job('<nombre_job>');

- Para ver el histórico del JOB se ejecuta la siguiente sentencia.

VERJOBS.SQL
column job format 99999
column schema format a15
column fail format 999
set pages 100
set line 200
select job, substr(SCHEMA_USER,1,12) schema,
       substr(TO_CHAR(NEXT_DATE,'DAY DD-MON-YY'),1,19) Next_Day,
       NEXT_SEC, BROKEN b,
       FAILURES fail, substr(what,1,15) what,
       decode(SUBSTR(INTERVAL,30,30),null,SUBSTR(INTERVAL,1,30),
                 SUBSTR(INTERVAL,30,30)) INTERVAL
from dba_jobs
ORDER BY NEXT_DATE, NEXT_SEC
/

- Para ver la consulta de los INTERVALOS de los JOB´s se debe ejecutar la siguiente sentencia con usuario de privilegios de DBA.

SQL>SELECT owner, schedule_name, schedule_type, start_date, repeat_interval FROM dba_scheduler_schedules;

· Para activar un Job que se encuentra en estado inactive (BROKEN=’N’) se corre la siguiente sentencia en la cual se cambia el usuario propietario del JOB.

Activarlos:

sqlplus ‘/ as sysdba’
SET SERVEROUTPUT ON;
DECLARE
CURSOR C_JOBS IS
select job,BROKEN from dba_jobs
where UPPER(schema_user)='<SCHEME_USER_IN_CAPITAL_LETTERS>';
BEGIN
FOR VREG IN C_JOBS LOOP
BEGIN
IF VREG.BROKEN = 'Y' THEN
dbms_ijob.broken(VREG.JOB,FALSE);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
END LOOP;
END;
/

Desactivarlos:

sqlplus ‘/ as sysdba’
SQL>     SET SERVEROUTPUT ON;
DECLARE
CURSOR C_JOBS IS
select job,BROKEN from dba_jobs
where UPPER(schema_user)='<SCHEME_USER_IN_CAPITAL_LETTERS>';
BEGIN
FOR VREG IN C_JOBS LOOP
BEGIN
IF VREG.BROKEN = 'N' THEN
dbms_ijob.broken(VREG.JOB,TRUE);
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
END LOOP;
END;
/

· En algunos casos cuando se reprograma el job es necesario realizar una ejecución para que actualice los datos de reprogramación.

BEGIN
  SYS.DBMS_JOB.RUN(número_job);
COMMIT;
END;
/

2 comentarios: