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.
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;
/
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;
/
Excelente guía como documentación
ResponderEliminarQue buena info, muchas gracias me ha servido de mucho
ResponderEliminar