oracle数据库调度任务管理-创建调度任务模板dbms_scheduler.create_job

在11g中,Oracle提供了一个新建的Scheduler特性,帮助将作业实现自动化。它还可以帮助你控制资源的利用与并可以将数据库中的作业按优先顺序执行。传统的dbms_jobs的一个限制是它只能调度基于PL/SQL的作业,不能用来调度操作系统的可执行文件或脚本。

manage scheduler系统权限允许做以下工作:‘
创建、删除和更改作业类,窗口和窗口组。

需要的权限

Scheduler包括如下权限:
scheduler_admin角色包含所有的scheduler系统权限,授权如下:
SQL> grant scheduler_admin to djp01
  2  /
 
Grant succeeded.
 
SQL>
manage scheduler系统权限允许做以下工作:‘
创建、删除和更改作业类,窗口和窗口组。
停止作业
提前启动和停止窗口(关于这些部件在下文中进行介绍)。
授权如下:
SQL> grant manage scheduler to djp01
  2  /
 
Grant succeeded.
 
SQL>
create job系统权限允许做如下工作:
创建作业(job)、进度表(schedule)、程序(program)、链(chain)和事件(event)。
(关于这些部件在下文中会进行介绍),授权如下:
SQL> grant create job to djp01
  2  /
 
Grant succeeded.
 
SQL>
如果要执行的程序在不同的模式下,那么必要拥有执行相应模式下的程序的执行权限,如下execute any procedure。
 

1 使用procedure创建调度任务

begin

  dbms_scheduler.create_job(job_name            => 'xxxx',

                                job_type            => 'STORED_PROCEDURE',

                                job_action          => 'xxxx',

                                start_date          => to_date('04-08-2018 04:50:15', 'dd-mm-yyyy hh24:mi:ss'),

                                repeat_interval     => 'Freq=Daily;Interval=1;ByHour=4;ByMinute=50;',

                                end_date            => null,

                                job_class           => 'DEFAULT_JOB_CLASS',

                                enabled             => true,

                                auto_drop           => false,

                                comments            => 'xxxxxxx');

end;

  1. job_name: 任务名称

  2. job_type:有三种类型,PL/SQL Block、Stored procedure、Executable

  3. job_action:根据job_type的不同,有不同的含义

  4. 如果job_type指定的是存储过程,就需要指定存储过程的名字;

  5. 如果job_type指定的是PL/SQL块,就需要输入完整的PL/SQL代码;

  6. 如果job_type指定的外部程序,就需要输入script的名称或者操作系统的指令名

  7. start_date:开始时间

  8. repeat_interval:运行的时间间隔,上面例子是每天23点运行一次

  9. end_date:到期时间

  10. enabled:创建后自动激活

  11. auto_drop:默认true,即当job执行完毕都到期是否直接删除job

###

常用的周期写法

--删除job

begin

 dbms_scheduler.drop_job('xxxx');

 end;

--禁用

begin

 dbms_scheduler.disable('xxxx');

 end;

--启动

begin

 dbms_scheduler.enable('xxxx');

 end;

exec dbms_scheduler.enable('demo_job');  --启用jobs  
 
exec dbms_scheduler.disable('demo_job');  --禁用jobs  
 
exec dbms_scheduler.run_job('demo_job');  --执行jobs  
 
exec dbms_scheduler.stop_job('demo_job');  --停止jobs  
 
exec dbms_scheduler.drop_job('demo_job');  --删除jobs 

常用频率:

1.每周5的时候运行,以下3条实现功能一样

REPEAT_INTERVAL => 'FREQ=DAILY; BYDAY=FRI';

REPEAT_INTERVAL => 'FREQ=WEEKLY; BYDAY=FRI';

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=FRI';

2.每隔一周运行一次,仅在周5运行

REPEAT_INTERVAL => 'FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI’;

3.每月最后一天运行

REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=-1'

4.在3月10日运行

REPEAT_INTERVAL => 'FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10’;

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDATE=0310';

5.每10隔天运行

REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10’;

6.每天的下午4、5、6点时运行

REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18’;

7.每月29日运行

REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29’;

8.每年的最后一个周5运行

REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI’;

9.每隔50个小时运行

REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50’;

2 使用plsql块创建job

--创建作业程序(pragram)
begin
 sys.dbms_scheduler.create_program(
 program_name=>'demo_pragram',
 program_type=>'PLSQL_BLOCK',
 program_action=>'BEGIN p_insSysdate;END;',
 enabled=>TRUE,
 comments=>'test pragram');
end;
/
--创建job
 begin
 sys.dbms_scheduler.create_job(
 job_name=>'demo_job',
 program_name=>'demo_pragram',
 schedule_name=>'demo_scheduler',
 job_class=>'DEFAULT_JOB_CLASS',
 enabled=>true,
 auto_drop=>true,
 comments=>'test job');
end;
/
--执行job
exec sys.dbms_scheduler.run_job('demo_job');

3 使用外面sh shell文件创建调度任务

[oracle@sv203 ~]$ more test.sh 

#!/bin/bash
source /home/oracle/.bash_profile
/bin/date


BEGIN
  dbms_scheduler.create_job(job_name     => 'JOB_TEST.sh',
                            job_type => 'EXECUTABLE',
                            job_action => '/home/oracle/test.sh',
                            enabled      => TRUE,
                            auto_drop => FALSE); --->值为TRUE用于激活JOB 
END;
/
 
问题排查 : 一开始以为是文件执行权限问题,后查看不存在这个问题,经上网查找,问题在于 $ORACLE_HOME/rdbms/admin/ 下文件externaljob.ora里面的参数设置有关


解决方法 : (需要用root用户修改)
cd $ORACLE_HOME/rdbms/admin/ ($ORACLE_HOME目录替换成对应的绝对路径)
[oracle@sv203 admin]$ ls -lrt externaljob.ora
-rw-r----- 1 root oinstall 1534 Dec 21  2005 externaljob.ora


修改文件里的两个参数
# vi externaljob.ora 
run_user = oracle 
run_group = oinstall 
修改完后重新调起JOB
BEGIN
  dbms_scheduler.run_job('JOB_FLUSH_SEARCH_ENGINES');
  END;
  /

其他的一些案例

一些关于sch的相关查询

select owner,job_name,status,to_char(c.ADDITIONAL_INFO) From dba_scheduler_job_log c where job_name='GATHER_STATS_JOB';
select owner,job_name,SCHEDULE_TYPE,SCHEDULE_NAME From dba_scheduler_jobs where job_name='GATHER_STATS_JOB';
select d.WINDOW_GROUP_NAME,d.WINDOW_NAME from dba_scheduler_wingroup_members d;
select *from dba_scheduler_windows e

DBMS_SCHEDULER.set_attribute(


---查看资源计划类
select * from dba_rsrc_consumer_groups;
select * From dba_rsrc_plans;
SELECT * FROM DBA_RSRC_PLAN_DIRECTIVES
select window_name,resource_plan from dba_scheduler_windows


以前一般使用dbms_job来创建job,oracle10g以后推荐使用dbms_scheduler来创建定时任务,dbms_scheduler功能更为强大。
一个创建job的例子:

begin
sys.dbms_scheduler.create_job(job_name => 'CMDEV.每天执行某件事',
job_type => 'STORED_PROCEDURE',
job_action => 'SP_ExecSomething',
start_date => to_date('01-06-2017 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
repeat_interval => 'Freq=Daily;Interval=1;ByHour=23;ByMinute=00',
end_date => to_date(null),
job_class => 'DEFAULT_JOB_CLASS',
enabled => true,
auto_drop => false,
comments => '');
end;
/
说明:

1、job_name: 任务名称
2、job_type:有三种类型,PL/SQL Block、Stored procedure、Executable
3、job_action:根据job_type的不同,有不同的含义
如果job_type指定的是存储过程,就需要指定存储过程的名字;
如果job_type指定的是PL/SQL块,就需要输入完整的PL/SQL代码;
如果job_type指定的外部程序,就需要输入script的名称或者操作系统的指令名
4、start_date:开始时间
5、repeat_interval:运行的时间间隔,上面例子是每天23点运行一次
6、end_date:到期时间
7、enabled:创建后自动激活
8、auto_drop:默认true,即当job执行完毕都到期是否直接删除job
9、comments:备注

导出job的定义语句:

SELECT dbms_me

select job_name,state from dba_scheduler_jobs;
select owner,job_name, status,error#,cpu_used,additional_info from dba_scheduler_job_run_details where error#>0;

--带参数的procddure 调度任务 

/* 创建可执行程序 */
begin
    DBMS_SCHEDULER.CREATE_PROGRAM(
        program_name        => 'peace_sj_his.PROG_DATASYNC',
        program_action      => 'peace_sj_his.P_DATASYNC',
        program_type        => 'STORED_PROCEDURE',
        number_of_arguments => 3,
        comments            => '数据同步程序',
        enabled             => false
    );
end;
/

/* 设置可执行程序的输入参数 */
begin
    DBMS_SCHEDULER.define_program_argument(
        program_name      => 'peace_sj_his.PROG_DATASYNC',
        argument_position => 1,
        argument_type     => 'VARCHAR2',
        default_value     => ''
    );
    DBMS_SCHEDULER.define_program_argument(
        program_name      => 'peace_sj_his.PROG_DATASYNC',
        argument_position => 2,
        argument_type     => 'VARCHAR2',
        default_value     => ''
    );
    DBMS_SCHEDULER.define_program_argument(
        program_name      => 'peace_sj_his.PROG_DATASYNC',
        argument_position => 3,
        argument_type     => 'VARCHAR2',
        default_value     => ''
    );
END;
/

/* 创建调度表 */
begin
    DBMS_SCHEDULER.create_schedule(
        schedule_name   => 'peace_sj_his.SCH_DATASYNC',
        repeat_interval => 'FREQ=MINUTELY;INTERVAL=2',
        start_date      => sysdate,
        comments        => '数据同步调度'
    );
end;
/

/* 创建作业 */
begin
    DBMS_SCHEDULER.create_job( 
        job_name      => 'peace_sj_his.JOB_PPTN',     
        program_name  => 'peace_sj_his.PROG_DATASYNC',
        schedule_name => 'peace_sj_his.SCH_DATASYNC',
        job_class     => 'DEFAULT_JOB_CLASS',            
        comments      => '雨量数据同步作业',
        auto_drop     => false,
        enabled       => false
    );
end;
/

/* 启动可执行程序 */
exec DBMS_SCHEDULER.enable('PROG_DATASYNC');

/* 启动作业 */
exec DBMS_SCHEDULER.enable('JOB_PPTN');

/* 设置不同的作业参数 */
begin
    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name          => 'peace_sj_his.JOB_PPTN',
        argument_position => 1,
        argument_value    => 'ST_PPTN_R'
    );
    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name          => 'peace_sj_his.JOB_PPTN',
        argument_position => 2,
        argument_value    => 'TM'
    );
    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        job_name          => 'peace_sj_his.JOB_PPTN',
        argument_position => 3,
        argument_value    => 'STCD'
    );
end;
/
----Job管理-----------------------------------------------------------------------

/* 禁用Job */
exec dbms_scheduler.disable('JOBTEST');
/* 执行Job */
exec dbms_scheduler.run_job('JOBTEST'); 
/* 停止Job */
exec dbms_scheduler.stop_job('JOBTEST');
/* 删除Job */
exec dbms_scheduler.drop_job('JOBTEST');


4、创建定时执行的JOB(每天早上5点定时执行)

BEGIN
  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'JOB_GATHER_TABLE',
                            JOB_TYPE        => 'STORED_PROCEDURE',
                            JOB_ACTION      => 'P_GATHER_TABLE',
                            REPEAT_INTERVAL => 'FREQ=Daily;INTERVAL=1;BYHOUR=5',
                            ENABLED         => TRUE);
END;

5 调度任务维护

disable
call DBMS_SCHEDULER.disable('USER.JOB_NAME');
call DBMS_SCHEDULER.enable('USER.JOB_NAME');
call DBMS_SCHEDULER.run('USER.JOB_NAME');

tadata.get_ddl( 'PROCOBJ', '每天执行某件事') FROM dual

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBMS_SCHEDULEROracle数据库中的一个内置程序包,用于管理调度作业、程序和链。它是Oracle Scheduler的主要接口,可以通过它来创建、修改和删除作业、程序和链,以及控制它们的执行时间和执行方式。 下面是一些DBMS_SCHEDULER的常见用法: 1. 创建作业 使用DBMS_SCHEDULER.CREATE_JOB过程可以创建作业。在创建作业时,需要指定作业名称、作业类型、作业所属的程序等信息。 2. 修改作业 使用DBMS_SCHEDULER.SET_ATTRIBUTE过程可以修改作业的属性,如作业的状态、开始时间、结束时间等。 3. 删除作业 使用DBMS_SCHEDULER.DROP_JOB过程可以删除作业。 4. 运行作业 使用DBMS_SCHEDULER.RUN_JOB过程可以手动运行作业。 5. 暂停作业 使用DBMS_SCHEDULER.DISABLE过程可以暂停作业的执行。 6. 恢复作业 使用DBMS_SCHEDULER.ENABLE过程可以恢复暂停的作业。 7. 创建程序 使用DBMS_SCHEDULER.CREATE_PROGRAM过程可以创建程序。在创建程序时,需要指定程序名称、程序类型、程序所属的语言等信息。 8. 修改程序 使用DBMS_SCHEDULER.SET_PROGRAM_ARGUMENT_VALUE过程可以修改程序的参数值。 9. 删除程序 使用DBMS_SCHEDULER.DROP_PROGRAM过程可以删除程序。 10. 创建链 使用DBMS_SCHEDULER.CREATE_CHAIN过程可以创建链。在创建链时,需要指定链名称、链包含的步骤等信息。 11. 修改链 使用DBMS_SCHEDULER.SET_CHAIN_STEP_ATTRIBUTE过程可以修改链的步骤属性,如步骤名称、步骤类型、步骤所属的程序等。 12. 删除链 使用DBMS_SCHEDULER.DROP_CHAIN过程可以删除链。 以上是一些DBMS_SCHEDULER的常见用法,具体使用方法可参考Oracle官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值