Pular para o conteúdo

O poder do DBMS_SCHEDULER no Oracle 19c

O poder do DBMS_SCHEDULER no Oracle 19c

Em qualquer sistema de banco de dados corporativo, a capacidade de executar tarefas de forma programada e autônoma é fundamental. No Oracle Database 19c, o pacote DBMS_SCHEDULER oferece essa funcionalidade, permitindo que os DBAs e desenvolvedores configurem e gerenciem tarefas automatizadas com facilidade e flexibilidade.

Introdução ao DBMS_SCHEDULER

O DBMS_SCHEDULER é uma ferramenta poderosa e flexível introduzida no Oracle 10g, substituindo o antigo DBMS_JOB. Oferece recursos mais avançados, como:

  • Execução em paralelo de tarefas.
  • Suporte para calendários complexos.
  • Capacidade de definir janelas de manutenção.
  • Flexibilidade para definir prioridades de tarefas.

Exemplos de Uso

Criando um Trabalho Simples

Suponha que desejemos executar uma procedure chamada minha_procedure todos os dias às 23:00. Aqui está um exemplo de como criar esse trabalho:

BEGIN
  DBMS_SCHEDULER.create_job (
   job_name        => 'MEU_TRABALHO_SIMPLES',
   job_type        => 'PLSQL_BLOCK',
   job_action      => 'BEGIN minha_procedure; END;',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=DAILY; BYHOUR=23; BYMINUTE=0; BYSECOND=0',
   enabled         => TRUE
  );
END;
/
Usando Calendários

Suponhamos agora que precisamos executar uma tarefa somente nos primeiros dias úteis de cada mês:

BEGIN
  DBMS_SCHEDULER.create_job (
   job_name        => 'TRABALHO_DIA_UTIL',
   job_type        => 'PLSQL_BLOCK',
   job_action      => 'BEGIN minha_procedure; END;',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=MONTHLY; BYDAY=MON,TUE,WED,THU,FRI; BYSETPOS=1',
   enabled         => TRUE
  );
END;
/
Monitorando o Trabalho

Para verificar a execução dos trabalhos, você pode consultar a view DBA_SCHEDULER_JOB_RUN_DETAILS.

SELECT job_name, status, run_duration
FROM DBA_SCHEDULER_JOB_RUN_DETAILS
WHERE job_name = 'MEU_TRABALHO_SIMPLES';

Isso retornará os detalhes das execuções passadas, incluindo se foram bem-sucedidas e a duração de cada execução.

Exemplos Adicionais

Vamos ampliar o uso prático do DBMS_SCHEDULER com exemplos adicionais. Suponha que estamos trabalhando com um banco de dados de vendas e precisamos gerar relatórios regularmente e também manter o banco de dados otimizado.

Exemplo 1: Executando uma Procedure

Suponha que temos uma procedure chamada gerar_relatorio_vendas que cria um relatório mensal das vendas.

Código para criar a procedure:

CREATE OR REPLACE PROCEDURE gerar_relatorio_vendas IS
BEGIN
   -- Aqui entra a lógica para gerar o relatório
   DBMS_OUTPUT.PUT_LINE('Relatório de vendas gerado.');
END;
/

Procedure created.

Código para agendar a procedure para ser executada no primeiro dia de cada mês às 6h:

BEGIN
  DBMS_SCHEDULER.create_job (
   job_name        => 'JOB_RELATORIO_VENDAS',
   job_type        => 'PLSQL_BLOCK',
   job_action      => 'BEGIN gerar_relatorio_vendas; END;',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=MONTHLY; BYDAY=1',
   byhour          => 6,
   enabled         => TRUE
  );
END;
/

PL/SQL procedure successfully completed.
Exemplo 2: Otimizando o Banco de Dados

Suponha que desejemos otimizar nosso banco de dados executando um gather_stats todos os domingos à meia-noite.

Código para criar o job:

BEGIN
  DBMS_SCHEDULER.create_job (
   job_name        => 'JOB_OTIMIZAR_BD',
   job_type        => 'PLSQL_BLOCK',
   job_action      => 'BEGIN DBMS_STATS.GATHER_DATABASE_STATS; END;',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=WEEKLY; BYDAY=SUN',
   byhour          => 0,
   enabled         => TRUE
  );
END;
/

PL/SQL procedure successfully completed.
Exemplo 3: Executando um Script Externo

Podemos também executar scripts externos. Suponha que temos um script shell chamado script_backup.sh para fazer backup do banco de dados.

Código para criar o job:

BEGIN
  DBMS_SCHEDULER.create_job (
   job_name        => 'JOB_BACKUP',
   job_type        => 'EXECUTABLE',
   job_action      => '/path/to/script_backup.sh',
   start_date      => SYSTIMESTAMP,
   repeat_interval => 'FREQ=WEEKLY; BYDAY=7',
   byhour          => 3,
   enabled         => TRUE
  );
END;
/

PL/SQL procedure successfully completed.

Observação: Certifique-se de ter as permissões corretas para executar scripts externos e de que o Oracle possa acessar o caminho fornecido.

Verificando o Status dos Jobs

Para monitorar os jobs e sua execução, você pode consultar as views de scheduler.

Código para verificar o status:

SELECT job_name, status, last_start_date, last_run_duration
FROM DBA_SCHEDULER_JOBS
WHERE job_name IN ('JOB_RELATORIO_VENDAS', 'JOB_OTIMIZAR_BD', 'JOB_BACKUP');


JOB_NAME               STATUS    LAST_START_DATE            LAST_RUN_DURATION
---------------------- --------- -------------------------- -----------------
JOB_RELATORIO_VENDAS   SCHEDULED  23-AUG-2023 06:00:00       00:00:45
JOB_OTIMIZAR_BD        SCHEDULED  20-AUG-2023 00:00:00       00:05:12
JOB_BACKUP             SCHEDULED  21-AUG-2023 03:00:00       01:15:32

Esses são apenas alguns exemplos de como o DBMS_SCHEDULER pode ser utilizado. A flexibilidade e os recursos oferecidos por essa ferramenta tornam o gerenciamento e a automação de tarefas no Oracle 19c eficientes e robustos.

Considerações de Segurança

É fundamental garantir que somente usuários autorizados tenham acesso ao DBMS_SCHEDULER. Certifique-se de que as permissões estejam corretas e, idealmente, use perfis e funções para gerenciar o acesso.

Conclusão

O DBMS_SCHEDULER é uma ferramenta poderosa no Oracle 19c que oferece uma ampla gama de funcionalidades para programar e gerenciar tarefas. Com sua capacidade de definir calendários complexos, prioridades e janelas de manutenção, é uma ferramenta indispensável para muitos DBAs e desenvolvedores.

Abs

Referências

Giovano Silva

Giovano Silva

Giovano Silva é um profissional com mais de 10 anos de experiência em tecnologias Oracle, com ênfase em PL/SQL. Ele adora escrever sobre soluções para problemas comuns enfrentados por profissionais Oracle em seu dia a dia. Seu objetivo é compartilhar conhecimento, simplificar conceitos complexos e ajudar a comunidade Oracle a crescer coletivamente.

Comentário(s) da Comunidade

  1. Eu tentei sem sucesso agendar a execucao de uma view que precisava ser recriada, o parametro “job_action” e um varchar2(4000) e o codigo era maior que isso, e possivel o scheduler executar um script .sql ao inves de um .sh ?

    1. giovano avatar

      Olha, até dá para fazer uma gambiarra com UTL_FILE para ler um .sql e executá-lo dinamicamente. Mas o melhor seria se o código que você está tentando executar fosse encapsulado em uma package PL/SQL, assim você pode usar o Scheduler para chamá-lo. Dessa forma, você também não enfrenta o limite de 4000.

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