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
- Oracle Database PL/SQL Packages and Types Reference 19c. (n.d.). Retrieved from Oracle Official Documentation.
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 ?
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.