- This topic has 30 replies, 2 voices, and was last updated 7 years ago by José Laurindo Chiappa.
-
AuthorPosts
-
26 de outubro de 2017 at 12:06 am #109034airoospParticipant
Boa tarde,
Fiz alguns testes e usando o dbms_scheduler.add_job_email_notification, consegui fazer o envio de e-mail com informações dos “events” do job.
Alguém sabe se além do envio do e-mail, é possível gravar em arquivo texto as informações do e-mail?
Banco 11g R2 com Windows.
Obrigado.
Airton
26 de outubro de 2017 at 4:15 pm #109035José Laurindo ChiappaModeratorBlz ? Eu não usei ainda essa funcionalidade, então falo sem experiência (consulte Direitinho então a Documentação e o site de Suporte Oracle, o My Oracle Support/metalink pra confirmar) mas afaik a funcionalidade é restrita : o scheduler do RDBMS simplesmente consulta as views DBA/ALL/USER_SCHEDULER_JOBS, xxx_SCHEDULER_JOB_LOG, xx_SCHEDULER_JOB_RUN_DETAILS e xxx_SCHEDULER_GLOBAL_ATTRIBUTE para pegar os detalhes, monta um texto FIXO com esses detalhes e envia o email para o destinatário indicado no servidor de email indicado, e o email é mais ou menos tipo assim :
Message-Id:
To: jstanley@dbspecialists.com
Subject: Oracle Scheduler Job Notification – JSTANLEY.JOB_SHOW_ME JOB_FAILED
Status: O
X-UID: 571
X-Content-Length: 235
X-Keywords:
Content-Length: 235
Lines: 13
Job: JSTANLEY.JOB_SHOW_ME
Event: JOB_FAILED
Date: 19-MAR-14 01.50.57.838644 PM -07:00
Log id: 13776
Job class: DEFAULT_JOB_CLASS
Run count: 25
Failure count: 22
Retry count: 0
Error code: 1403
Error message:
ORA-01403: no data foundVeja que ** TODAS ** essas informações ele está pegando diretamente das views do Scheduler, ok ? SE vc as consultar, vc acha elas Todinhas lá…
Pra mim então a resposta é que Não Dá : o comportamento desse envio de email é FIXO, ie, ele sempre vai nas views, pega as infos e envia o email, Não Há como vc o instruir para além disso gravar arquivo texto ou o que for….
Porém, pergunto : já que a informação *** TODINHA *** está SIM sempre guardadinha dentro das views, PARA QUE vc quer gerar um arquivo-tetxo com elas ?? Não é só simplesmente consultar as views depois de ter recebido o email pra ficar sabendo dos detalhes todos dessa execução sobre a qual vc foi notificado ??
[]s
Chiappa
26 de outubro de 2017 at 4:43 pm #109036José Laurindo ChiappaModeratorUm detalhe adicional : no final do artigo em https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:9532060200346887862 , um leitor queria que a funcionalidade de envio de email fizesse coisas a mail além de enviar o email (um SELECT no caso dele, ao invés de gravação de arquivo-texto que vc quer, mas não importa) , aí ele tentou enviar uma Function criada por ele como um dos argumentos (e nessa Function ele fazia o que queria) : não deu certo porque o Scheduler só valida os argumentos pra notificação do email a primeira vez que vc seta os argumentos do job…
Porém, ele ** SUGERE ** uma alternativa que talvez vc possa adotar, que é o uso de um CHAIN no seu scheduler : CHAIN é uma cadeia de passos, cada passo sendo um JOB, que deve ser executada sequencialmente, a idéia é criar um chain onde o primeiro job/passo executa a qrotina que vc quer e o segundo job/passo do chain (que só vai ser executado quando o anterior for completado) aí sim seria gravar a informação que vc quer (E QUE ESTÁ PRESENTE nas views do scheduler!!) num arquivo-texto via UTL_FILE… Veja lá se alguma coisa assim pode ser aplicada na sua necessidade….[]s
Chiappa
26 de outubro de 2017 at 5:06 pm #109037airoospParticipantChiappa,
A ideia em salvar a informação em arquivo texto, é depois ser exibida na tela do controle de monitoramento que o meu supervisor esta desenvolvendo usando o Zabbix.
Vou ver o link que você passou do AskTom.
Obrigado.
Airton
26 de outubro de 2017 at 6:30 pm #109038José Laurindo ChiappaModeratorEntão : exatamente ** O QUE ** impede tua ‘tela de controle’ conectar no banco e ler (a cada poucos minutos, digamos) a informação enviada pelo email que está SIM registrada nas views DBA/USER/ALL_SCHEDULER_JOBS, JOB_DETAILS e cia bela ??? Ou ainda, ter uma rotina schedulada no banco que EXPORTA a informação das views prum arquivo-texto, se por qquer motivo estranho a ferramenta de monitoração não puder conectar no banco ??
Mas sim, se nada disso te ahudar, a alternativa pode ser um CHAIN, que no primeiro passo roda o job em questão e no segundo passo exporta (via UTL_FILE, provavelmente) os detalhes da execução lendo a DBA/ALL/USER_SCHEDULER e quetais…[]s
Chiappa
27 de outubro de 2017 at 12:20 am #109039airoospParticipantChiappa,
Fiz alguns testes usando o CHAIN, mas não funcionou corretamente, ao fazer a consulta na view
dba_SCHEDULER_RUNNING_CHAINS, o campo ERROR_CODE contém o código 27475, o campo STATE contém FAILED e o campo COMPLETED contém TRUE.Os processos que executei são:
BEGIN
DBMS_SCHEDULER.CREATE_CHAIN(
CHAIN_NAME => ‘CCR_CHAIN’,
RULE_SET_NAME => NULL,
EVALUATION_INTERVAL => NULL,
COMMENTS => NULL);
END;BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_STEP(‘CCR_CHAIN’, ‘stepA’, ‘JOB_GRAVA_DATA_HORA’);
DBMS_SCHEDULER.DEFINE_CHAIN_STEP(‘CCR_CHAIN’, ‘stepB’, ‘JOB_GERAR_TABELA’);
END;BEGIN
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(‘CCR_CHAIN’, ‘TRUE’, ‘START stepA’, ‘ccr_rule_1’, ‘ETAPA 1’);
DBMS_SCHEDULER.DEFINE_CHAIN_RULE(‘CCR_CHAIN’, ‘JOB_SUCCEEDED’, ‘Start stepB’, ‘ccr_rule_2’, ‘ETAPA 2’);
END;BEGIN
DBMS_SCHEDULER.ENABLE(‘CCR_CHAIN’);
END;BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => ‘TESTE_JOBS’,
job_type => ‘CHAIN’,
job_action => ‘CCR_CHAIN’,
repeat_interval => ‘freq=daily;byhour=02;byminute=0;bysecond=0’,
enabled => TRUE);
END;Pesquisei na internet sobre este tipo de erro mas não encontrei muita coisa. Será que você tem ideia do que pode ser?
Estou usando o 11g R2
Obrigado.
Airton
27 de outubro de 2017 at 3:40 pm #109040José Laurindo ChiappaModeratorSem muita análise profunda dado minha atenção dividida mas as refs que encontrei normalmente falam de permissões e coisas assim, tipo a nota DBMS_SCHEDULER fails with ORA-27476 ORA-27475 (Doc ID 787802.1) , ou bugs mesmo específicos pra alguma versão e/ou issues de timezone/horário de verão, como registrado na nota Known Issues And Bugs Using the Scheduler (Doc ID 1311355.1) ….
Pra gente tentar debugar isso, plz cria um chain que no primeiro passo roda uma proc de teste que faz só um insert simples e um dbms_output e no segundo passo faz outro , bem simples : mas só usa um PROGRAM pra definir o step, tipo o mostrado em http://database-geek.com/2011/03/20/oracle-dbms_scheduler-part-3-job-chains/ (na parte 2 do artigo é que foram criadas as procedures)…[]s
Chiappa
OBS :
é Muito Importante observar que numa procedure (ou trigger, function, package, que for) as ROLEs são Desabilitadas por padrão : assim, se a permissão de acesso às views do scheduler, às V$ ou seja o que for que não pertence ao usuário que roda o stored PL/SQL foram te dadas por ROLEs não vão estar ativas, aí tua procedure que tentar acessar/usar esse seja o que for VÃO FALHAR….. Será que pode ter sido isso ??? Talvez…
1 de novembro de 2017 at 2:00 am #109043airoospParticipantChiappa,
Vendo as informações que você passou e pesquisando mais na internet, consegui fazer o dbms_scheduler.create_chain funcionar, só que manualmente.
Você sabe como fazer para funcionar através de agendamento? Por exemplo, a cada 15 minutos executar o job que esta vinculado ao chain?
Obrigado.
Airton
1 de novembro de 2017 at 3:37 pm #109044José Laurindo ChiappaModeratorÉ seguir a Documentação Oracle mesmo : online em https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse009.htm#ADMIN10021 vc acha o manual Database Administrator’s Guide, que tem os passos todos no trecho :
”
Using ChainsA chain is a named series of tasks that are linked together for a combined objective. Chains are the means by which you can implement dependency based scheduling, in which jobs are started depending on the outcomes of one or more previous jobs.
To create and use a chain, you complete these tasks in order:
Task See…
1. Create a chain object Creating Chains
2. Define the steps in the chain Defining Chain Steps
3. Add rules Adding Rules to a Chain
4. Enable the chain Enabling Chains
5. Create a job (the “chain job”) that points to the chain Creating Jobs for Chains
”==> O que vc quer é o passo 5, okdoc ?? O meu exemplo :
=> Primeiro, obviamente tenho que dar as Permissões pro usuário que vai criar o chain : no caso eu dei permissão de SELECT em algumas views DBA_xx porque afaik vc ia ter que acessar elas :
SYS:AS SYSDBA@XE:SQL>grant SELECT on DBA_SCHEDULER_JOBS to SCOTT;
ConcessÒo bem-sucedida.
SYS:AS SYSDBA@XE:SQL>
SYS:AS SYSDBA@XE:SQL>grant SELECT on DBA_SCHEDULER_CHAINS to scott;
ConcessÒo bem-sucedida.
SYS:AS SYSDBA@XE:SQL>
SYS:AS SYSDBA@XE:SQL>grant CREATE JOB to scott;ConcessÒo bem-sucedida.
SYS:AS SYSDBA@XE:SQL>
SYS:AS SYSDBA@XE:SQL>grant CREATE EVALUATION CONTEXT to scott;
ConcessÒo bem-sucedida.
SYS:AS SYSDBA@XE:SQL>grant CREATE RULE SET to scott;
ConcessÒo bem-sucedida.
SYS:AS SYSDBA@XE:SQL>grant CREATE RULE to scott;
Concessão bem-sucedida.
SYS:AS SYSDBA@XE:SQL>
==> Agora crio as tabelas e procedures que meu CHAIN vai disparar :
SCOTT:@XE:SQL>create table TAB_LOG(C1 varchar2(200));
Tabela criada.
SCOTT:@XE:SQL>
SCOTT:@XE:SQL>create procedure PROCEDURE1 is
2 BEGIN
3 insert into TAB_LOG values(‘PROCEDURE1 executou em:’ || to_char(sysdate, ‘dd/mm/yyyy’) || ‘!!’);
4 commit;
5 END;
6 /Procedimento criado.
SCOTT:@XE:SQL>
SCOTT:@XE:SQL>
SCOTT:@XE:SQL>create procedure PROCEDURE2 is
2 BEGIN
3 insert into TAB_LOG values(‘PROCEDURE2 executou em:’ || to_char(sysdate, ‘dd/mm/yyyy’) || ‘!!’);
4 commit;
5* END;
SCOTT:@XE:SQL>/Procedimento criado.
SCOTT:@XE:SQL>
==> e crio as dependências e o CHAIN em si :
SCOTT:@XE:SQL>BEGIN
2 sys.dbms_scheduler.create_program(
3 program_name => ‘SCOTT.PROGRAM1’,
4 program_action => ‘SCOTT.PROCEDURE1’,
5 program_type => ‘STORED_PROCEDURE’,
6 number_of_arguments => 0,
7 comments => NULL,
8 enabled => FALSE);
9
10 sys.DBMS_SCHEDULER.ENABLE(name=>’SCOTT.PROGRAM1′);
11
12 sys.dbms_scheduler.create_program(
13 program_name => ‘SCOTT.PROGRAM2’,
14 program_action => ‘SCOTT.PROCEDURE2’,
15 program_type => ‘STORED_PROCEDURE’,
16 number_of_arguments => 0,
17 comments => NULL,
18 enabled => FALSE);
19
20 sys.DBMS_SCHEDULER.ENABLE(name=>’SCOTT.PROGRAM2′);
21* END;
SCOTT:@XE:SQL>/Procedimento PL/SQL concluÝdo com sucesso.
SCOTT:@XE:SQL>
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.CREATE_CHAIN (
3 chain_name => ‘chain1’,
4 rule_set_name => NULL,
5 evaluation_interval => NULL,
6 comments => ‘My first chain’);
7 END;
8 /Procedimento PL/SQL concluído com sucesso.
SCOTT:@XE:SQL>
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
3 chain_name => ‘chain1’,
4 step_name => ‘step1’,
5 program_name => ‘program1’);
6 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
7 chain_name => ‘chain1’,
8 step_name => ‘step2’,
9 program_name => ‘program2’);
10 END;
11 /Procedimento PL/SQL concluÝdo com sucesso.
SCOTT:@XE:SQL>
=> Definindo as Regras : aqui no caso vou usar uma regra SIMPLES, ie, que o step anterior se completou : veja no Manual que vc pode ter regras MUITO mais complexas, por exemplo que contenham um SELECT pra ver se a eventual ‘carga de dados’ feita antes se completou sem erros, pode ter uma validação de data/hora/dia da semana…. Vou NO SIMPLÃO :
SCOTT:@XE:SQL>
BEGIN
2 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
3 chain_name => ‘chain1’,
4 condition => ‘TRUE’,
5 action => ‘START step1’,
6 rule_name => ‘rule1’,
7 comments => ‘start the chain’);
8 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
9 chain_name => ‘chain1’,
10 condition => ‘step1 completed’,
11 action => ‘START step2’,
12 rule_name => ‘rule2’);
13 END;
14 /Procedimento PL/SQL concluÝdo com sucesso.
SCOTT:@XE:SQL>
==> habilito o CHAIN (item 4 do manual) :
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.ENABLE (‘chain1’);
3* END;
SCOTT:@XE:SQL>/Procedimento PL/SQL concluído com sucesso.
SCOTT:@XE:SQL>
==> PRONTO, agora o item 5 e final do manual (criar o JOB que dispara o CHAIN), que vc perguntou :
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => ‘chain_job_1’,
4 job_type => ‘CHAIN’,
5 job_action => ‘chain1’,
6 repeat_interval => ‘freq=daily;byhour=08,09,10,11,12;byminute=12, 22, 32, 42, 52;bysecond=0’,
7 enabled => TRUE);
8 END;
9 /Procedimento PL/SQL concluído com sucesso.
SCOTT:@XE:SQL>
==> Não TEM como ficar mais simples que isso… Espero uns minutos pra dar o tempo de disparar e esi o resultado :
SCOTT:@XE:SQL>select * from TAB_LOG;
não há linhas selecionadas
SCOTT:@XE:SQL>/
C1
PROCEDURE2 executou em:01/11/2017!!
PROCEDURE1 executou em:01/11/2017!!SCOTT:@XE:SQL>
==> Como eu disse, ** AUTOMAGICAMENTE ** os detalhes da Execução ficam SIM registrados nas views internas : NADA IMPEDE a tal ‘tool de monitoração’ de CONECTAR NO BANCO e BUSCAR ELES TODOS, veja :
SCOTT:@XE:SQL>select job_name, program_name, enabled, run_count, failure_count, last_start_date, last_run_duration
2* from user_scheduler_jobs
SCOTT:@XE:SQL>/JOB_NAME PROGRAM_NA ENABL RUN_COUNT FAILURE_COUNT
LAST_START_DATE
LAST_RUN_DURATION
CHAIN_JOB_1 TRUE 0 0
01/11/17 09:22:00,216000 -02:00SCOTT:@XE:SQL>
====>>> NÃO FAZ SENTIDO vc criar uma ‘tabela de log de Execuções’, TUDO JÁ ESTÁ automaticamente registrado nas views internas!!! Erros, data e qtdade de execuções, tempo de duração, TUDINHO!!! É reinventar a roda…
[]s
Chiappa
1 de novembro de 2017 at 3:45 pm #109045José Laurindo ChiappaModeratorDuas obs adicionais :
a) como o Manual nos indica, o RDBMS vai criar um job ** interno **, temporário, de executar uma vez só, para CADA step do chain : se vc quiser saber os detalhes/logs de execução posteriores de cada step vc vai consultar as views de LOG (como DBA/ALL/USER_SCHEDULER_JOB_RUN_DETAILS e DBA/ALL/USER_SCHEDULER_JOB_LOG)
b) se vc quer pegar os detalhes (de EXECUÇÃO, óbvio) NO INSTANTE em que um job qquer está rodando vc consulta DBA/ALL/USER_SCHEDULER_RUNNING_JOBS, e talvez (dependendo do caso) também a GV$SCHEDULER_RUNNING_JOBS, a DBA_SCHEDULER_RUNNING_CHAINS, etc…
[]s
Chiappa
1 de novembro de 2017 at 7:37 pm #109046airoospParticipantChiappa,
Fazendo os testes, criei um job conforme abaixo:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => ‘TESTAR_JOB4’,
job_type => ‘CHAIN’,
job_action => ‘TESTE_GRAVA’,
repeat_interval => ‘freq=MINUTELY;INTERVAL=5’,
start_date => systimestamp,
enabled => TRUE);
END;Ao fazer a consulta em abaixo, o JOB aparece, só que na coluna que mostra a próxima data de execução, aparece o valor data/hora da última execução. Não deveria ser já com 5 minutos a mais?
select *
from dba_scheduler_jobs
where owner = ‘TEST’
order by ownerjob_name = TESTE_JOB4
start_date = 01/11/17 13:20:29,898000000 -02:00
repeat_interval = freq=MINUTELY;INTERVAL=5
last_start_date = 01/11/17 13:20:30,132000000 -02:00
next_run_date = 01/11/17 13:20:29,900000000 -02:00Obrigado.
Airton
1 de novembro de 2017 at 8:16 pm #109047José Laurindo ChiappaModeratorEu não consegui reproduzir a sua issue – no caso aqui estou tentando em um XE 11gR2 :
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.DROP_JOB(job_name => ‘”SCOTT”.”CHAIN_JOB_1″‘,
3 defer => false,
4 force => true);
5 END;
6 /Procedimento PL/SQL concluído com sucesso.
SCOTT:@XE:SQL>BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => ‘chain_job_1_MINUTELY’,
4 job_type => ‘CHAIN’,
5 job_action => ‘chain1’,
6 repeat_interval => ‘freq=MINUTELY;INTERVAL=5’,
7 start_date => systimestamp,
8 enabled => TRUE);
9 END;
10 /Procedimento PL/SQL concluído com sucesso.
SCOTT:@XE:SQL>
==> Ao consultar a DBA_SCHEDULER_JOBS via o SQL abaixo (onde tiro da consulta os JOBs internos do meu banco, que não me interessam no momento) :
SCOTT:@XE:SQL>select owner, job_name, start_date, repeat_interval, last_start_date, NEXT_RUN_DATE from dba_scheduler_jobs where owner not in (‘SYS’, ‘SYSTEM’, ‘APEX_040000’);
tenho :
OWNER JOB_NAME START_DATE REPEAT_INTERVAL LAST_START_DATE NEXT_RUN_DATE
SCOTT CHAIN_JOB_1_MINUTELY 01/11/17 14:00:36,561000000 -02:00 freq=MINUTELY;INTERVAL=5 01/11/17 14:00:36,686000000 -02:00 01/11/17 14:05:36,600000000 -02:00
==> tá lá o NEXT_RUN_DATE para 5 minutos depois, ok ? Aí, 5 minutos depois repetindo a mesma consulta tenho :
OWNER JOB_NAME START_DATE REPEAT_INTERVAL LAST_START_DATE NEXT_RUN_DATE
SCOTT CHAIN_JOB_1_MINUTELY 01/11/17 14:00:36,561000000 -02:00 freq=MINUTELY;INTERVAL=5 01/11/17 14:05:36,628000000 -02:00 01/11/17 14:10:36,000000000 -02:00
okdoc ?? Provavelmente bugzinho do seu release/SO/versão, mas se os JOBs tão disparando e executando corretamente, bugzinho cosmético menor…. Mesmo assim abre um Chamado no Suporte Oracle…
[]s
Chiappa
1 de novembro de 2017 at 10:30 pm #109048airoospParticipantChiappa,
O ambiente de testes que estou usando é Windows Server 2012 com Oracle 11g R2 (11.2.0.4).
Vou remover o que foi criado e criar novamente o job.
Obrigado.
Airton
1 de novembro de 2017 at 10:41 pm #109050airoospParticipant1 de novembro de 2017 at 10:58 pm #109051José Laurindo ChiappaModeratorComprovadíssimo o bug então, pode abrir um Chamado no Suporte da Oracle…
Enquanto isso, SE como eu perguntei antes, o JOB está sim sendo disparado a cada 5 minutos certinho, eu consideraria isso um bug cosmético, vc pode consultar as outras views e colunas de scheduler… Obviamente, se vc consultar daqui a meia hora e através dessa e das Outras views/colunas de scheduler vc comprovar que o job NÃO rodou corretamente aí é outra coisa, vc com isso já pode abrir um Chamado de severidade ALTA no Suporte…[]s
Chiappa
OBS : só como teste, experimenta usar um INTERVAL=DAILY indicando as Horas e Minutos em que vc quer que o job dispare, como eu fiz originalmente, só pra confirmar se o BUG é específico pra interval MINUTELY ou se é genérico…
-
AuthorPosts
- You must be logged in to reply to this topic.