Analisar e recriar JOBS no Oracle
set linesize 200 define off echo on
--
-- Analisar Jobs
--
COLUMN LOG_USER FORMAT A10
COLUMN PRIV_USER FORMAT A10
COLUMN SCHEMA_USER FORMAT A10
COLUMN FAILURES FORMAT 99
COLUMN WHAT FORMAT A70
SELECT JOB, BROKEN, LAST_DATE, LOG_USER, PRIV_USER, SCHEMA_USER ,FAILURES ,WHAT
FROM DBA_JOBS
ORDER BY WHAT
/
Obs. ORA-12011 => Verifique se LOG_USER=SCHEMA_USER.
O ideal é o LOG_USER=PRIV_USER=SCHEMA_USER.
Para não ter trabalho drop o job e crie com o usuario schema_user.
Pegue os dados do job
--
-- PARA EXECUTAR O QUE ESTAVA EM BROKEN
--
SELECT 'EXECUTE '||WHAT
FROM DBA_JOBS&
WHERE BROKEN='Y'
ORDER BY 1
/
--
-- RETIRAR DE BROKEN
---
SELECT 'EXECUTE SYS.DBMS_IJOB.BROKEN('||JOB||',FALSE);'
FROM DBA_JOBS
WHERE BROKEN='Y'
--
-- Analisar datas / Intervalos
--
COLUMN LOG_USER FORMAT A10
COLUMN PRIV_USER FORMAT A10
COLUMN SCHEMA_USER FORMAT A10
COLUMN FAILURES FORMAT 99
COLUMN WHAT FORMAT A70
SELECT JOB, LAST_DATE, NEXT_DATE, INTERVAL, BROKEN, SCHEMA_USER, FAILURES, WHAT
FROM DBA_JOBS
ORDER BY 2/
Para forçar a execução de algum job.
=======================================
exec dbms_job.run(numero do job);
Para remover um job.
====================
execute dbms_job.remove(numero do job);
Para colocar um job em Broken.
=================================
execute DBMS_JOB.BROKEN(numero do job,true);
Para retirar um job em broken.
===============================
execute DBMS_JOB.BROKEN(numero do job,false);
Para alterar um job
DBMS_JOB.CHANGE (
job IN BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE,
interval IN VARCHAR2,
instance IN BINARY_INTEGER DEFAULT NULL,
force IN BOOLEAN DEFAULT FALSE);
— Aconselho a utilizar o script abaixo.
Para recriar um job a partir de outro job.
set line 155
set feedback off
set pagesize 0
select 'DECLARE ' || CHR(10) || ' JOBNO INTEGER; ' || CHR(10)
|| ' BEGIN ' ||CHR(10) || ' DBMS_JOB.SUBMIT(JOBNO, ''' || replace(WHAT,'''','''''')
|| ''',' || CHR(10) ||'to_date('''|| to_char(next_date,'DD/MM/YYYY HH24:MI:SS')
||''',''DD/MM/YYYY HH24:MI:SS'')'||',' || CHR(10) || '''' || INTERVAL || ''');'
|| CHR(10) || 'END;' || CHR(10) || '/'
from dba_jobs
where log_user = upper('&log_user');
set line 132
set feedback on
set pagesize 14
/
— Para remover o job e cria-lo novamente com os mesmos parâmetros com sysdate ( a partir de agora)
select 'execute DBMS_JOB.BROKEN('||to_char(job)||','||'true);' ||chr(10)||
'execute dbms_job.remove('||to_char(job)||');' ||chr(10)||
'DECLARE ' || CHR(10) || ' JOBNO INTEGER; ' || CHR(10) || ' BEGIN '
||CHR(10) || ' DBMS_JOB.SUBMIT(JOBNO, ''' || replace(WHAT,'''','''''')
|| ''',' || CHR(10) || 'to_date('''|| to_char(SYSDATE,'DD/MM/YYYY HH24:MI:SS')
||''',''DD/MM/YYYY HH24:MI:SS'')'||',' || CHR(10) || ''''
|| INTERVAL || ''');' || CHR(10) ||'END;' || CHR(10) || '/'
from USER_jobs
/
— Refaz o que estava em broken com a ultima execução
select 'execute DBMS_JOB.BROKEN('||to_char(job)||','||'true);' ||chr(10)||
'execute dbms_job.remove('||to_char(job)||');' ||chr(10)||
'DECLARE ' || CHR(10) || ' JOBNO INTEGER; ' || CHR(10) || ' BEGIN ' ||
CHR(10) || ' DBMS_JOB.SUBMIT(JOBNO, ''' || replace(WHAT,'''','''''')
|| ''',' || CHR(10) || 'to_date('''|| to_char(NVL(LAST_DATE,SYSDATE),'DD/MM/YYYY HH24:MI:SS')
||''',''DD/MM/YYYY HH24:MI:SS'')'||',' || CHR(10) || '''' || INTERVAL
|| ''');' || CHR(10) ||
'END;' || CHR(10) || '/'
from user_jobs
where broken='Y'
/
— Veja o que foi refeito após broken
COLUMN LOG_USER FORMAT A10
COLUMN PRIV_USER FORMAT A10
COLUMN SCHEMA_USER FORMAT A10
COLUMN FAILURESFORMAT 99
COLUMN WHAT FORMAT A70
SELECT JOBBROKEN ,LAST_DATE,LOG_USER,PRIV_USER,SCHEMA_USER ,FAILURES ,WHAT USER_JOBS
where FAILURES is null
/
— Executa o que estava em broken
select 'exec dbms_job.run('||job||');'
FROM USER_JOBS
where FAILURES is null
/
Para alterar o what de um job.
exec DBMS_JOB.WHAT(numero do job,'novo what');
Para alterar a instance de um job.
exec DBMS_JOB.INSTANCE(numero do job,'instance');
Lembrando que todos os comandos foram escritos como se você fosse o dono do job.
Caso você não seja o dono do job você terá de efetuar a seguinte sintaxe.
exec sys.dbms_ijob.comando...
exemplo:
exec sys.dbms_ijob.run(numero do job);
SYS.DBMS_IJOB.BROKEN(27,FALSE);
Procedimento PL/SQL concluído com sucesso.
exec sys.dbms_ijob.run(27);
EXECUTE SYS.DBMS_IJOB.BROKEN(44,FALSE);
Procedimento PL/SQL concluído com sucesso.
exec sys.dbms_ijob.run(44);