Pular para o conteúdo
  • Este tópico contém 30 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 10 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 15 posts - 1 até 15 (de 31 do total)
  • Autor
    Posts
  • #109034
    Avatar de airoospairoosp
    Participante

      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

      #109035
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Blz ? 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 found

        Veja 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

        #109036
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Um 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

          #109037
          Avatar de airoospairoosp
          Participante

            Chiappa,

            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

            #109038
            Avatar photoJosé Laurindo Chiappa
            Moderador

              Entã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

              #109039
              Avatar de airoospairoosp
              Participante

                Chiappa,

                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

                #109040
                Avatar photoJosé Laurindo Chiappa
                Moderador

                  Sem 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…

                  #109043
                  Avatar de airoospairoosp
                  Participante

                    Chiappa,

                    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

                    #109044
                    Avatar photoJosé Laurindo Chiappa
                    Moderador

                      É 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 Chains

                      A 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:00

                      SCOTT:@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

                      #109045
                      Avatar photoJosé Laurindo Chiappa
                      Moderador

                        Duas 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

                        #109046
                        Avatar de airoospairoosp
                        Participante

                          Chiappa,

                          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 owner

                          job_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:00

                          Obrigado.

                          Airton

                          #109047
                          Avatar photoJosé Laurindo Chiappa
                          Moderador

                            Eu 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

                            #109048
                            Avatar de airoospairoosp
                            Participante

                              Chiappa,

                              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

                              #109050
                              Avatar de airoospairoosp
                              Participante

                                Chiappa,

                                O Job foi recriado, veja o arquivo em anexo.

                                Attachments:
                                #109051
                                Avatar photoJosé Laurindo Chiappa
                                Moderador

                                  Comprovadí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…

                                Visualizando 15 posts - 1 até 15 (de 31 do total)
                                • Você deve fazer login para responder a este tópico.
                                plugins premium WordPress