Pular para o conteúdo

Analisar e recriar JOBS no Oracle: Dicas e instruções detalhadas

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);

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 5 / 5. Contagem de votos: 14

Sem votos ! Seja o primeiro a classificar !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress