美文网首页
Oracle任务调度之DMBS_JOB

Oracle任务调度之DMBS_JOB

作者: keith666 | 来源:发表于2018-01-11 18:44 被阅读382次

本文链接: https://www.jianshu.com/p/28f86d6a4bdc

DBMS_JOB是对任务队列进行调度和管理的包

  • DBMS_JOB已经废除,由DBMS_SCHEDULER取代,推荐使用DBMS_SCHEDULER
  • 你应该要撤销用户对DBMS_JOB的包执行权限来禁止DBMS_JOB的使用

1. 安全模型

使用DBMS_JOB不需要特别的系统权限,只有jobs的拥有者才能对jobs进行修改或删除. 只有procedures的拥有者或直接被授权对该procedures可执行的用户才能执行该procedures,而通过roles来间接获取执行执行权限的用户无法执行该procedures

DBMS_JOB支持jobs的多实例执行,默认是每个实例都能执行jobs,但是只有一个实例能够执行某个具体的job,你也可以通过将某个job绑定到特定的instance来强制执行instance binding.

2. DBMS_JOB的使用

2.1 查看任务

任务相关的表子在user_jobs中,因此可以通过sql查询语句区去查看相关信息,如下:

select job,what,next_date,next_sec,failure,broken from user_jobs;

显示结果类似如下:

JOB NEXT_DATE NEXT_SEC FAILURES B
1 11-JAN-18 19:05:35 0 N

说明当前任务队列中有一个任务,下一次执行的时间为11号的19:05:35.

2.2 提交job

DBMS_JOB.SUBMIT ( 
   job       OUT BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE DEFAULT sysdate,
   interval  IN  VARCHAR2 DEFAULT 'null',
   no_parse  IN  BOOLEAN DEFAULT FALSE,
   instance  IN  BINARY_INTEGER DEFAULT any_instance,
   force     IN  BOOLEAN DEFAULT FALSE);
  • 在语句后面加COMMIT会将job提交到job queue;
  • what和interval的类型是字符串,需要用引号.
  • what中的语句最后要加分号(;).

instance和force是用来控制instance和job的绑定关系,instance的默认值为0,表示任何的instance都能执行该job,force默认为false,表示设置的instance必须要处于running,否则会报错.

一般使用只管job,what,next_date和interval就够了.

示例:

VARIABLE jobno number;
BEGIN
   DBMS_JOB.SUBMIT(:jobno, 
      'dbms_ddl.analyze_object(''TABLE'',
      ''DQUON'', ''ACCOUNTS'', 
      ''ESTIMATE'', NULL, 50);' 
      SYSDATE, 'SYSDATE + 1');
   COMMIT;
END;
/

interval详解

interval必须是未来的时间,下面列举一些合法的时间:

Interval Description
'sysdate + 7' Run once a week.
'next_day(sysdate,''TUESDAY'')' Run once every Tuesday.
'null' Run only once.

如果interval为null,则job在执行完成后会被自动从队列中删除.

2.3 删除job

DBMS_JOB.REMOVE (job IN  BINARY_INTEGER );

从job队列中删除指定任务,已经在运行中的任务不会被停止

需要COMMIT

2.4 修改job

以下修改都需要COMMIT才能生效.

修改多个属性:

DBMS_JOB.CHANGE ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE,
   interval  IN  VARCHAR2,
   instance  IN  BINARY_INTEGER DEFAULT NULL,
   force     IN  BOOLEAN DEFAULT FALSE);

修改inverval(运行周期):

DBMS_JOB.INTERVAL ( 
   job       IN  BINARY_INTEGER,
   interval  IN  VARCHAR2);

修改next_date(下次运行时间):

DBMS_JOB.NEXT_DATE ( 
   job       IN  BINARY_INTEGER,
   next_date IN  DATE);

修改what(运行内容):

DBMS_JOB.WHAT ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2);

2.5 启动job

DBMS_JOB.RUN ( 
   job       IN  BINARY_INTEGER,
   force     IN  BOOLEAN DEFAULT FALSE);

该命令立刻执行任务并重新计算next_date.

也会将未加入job queue中的job加入其中.

2.6 停止job

DBMS_JOB.BROKEN ( 
   job       IN  BINARY_INTEGER,
   broken    IN  BOOLEAN,
   next_date IN  DATE DEFAULT SYSDATE);
  • 如果对正在执行中的job执行BROKEN会失效,因为job执行结束后会重置job状态成正常. 所以选择未在运行中的job来执行BROKEN
  • 需要COMMIT

Reference

  1. DBMS_JOB
  2. USER_JOBS

相关文章

  • Oracle任务调度之DMBS_JOB

    本文链接: https://www.jianshu.com/p/28f86d6a4bdc DBMS_JOB是对任务...

  • Java定时任务调度工具详解

    本篇内容:什么是定时任务调度?Java定时任务调度工具详解之 Timer篇Java定时任务调度工具详解之 Quar...

  • laravel之任务调度

    之前执行任务定时,都会用linux的crontab,现在框架用一条就可以帮你去执行了 增加定时 定义调度 场景:订...

  • 定时任务调度之Timer

    定时任务调度之Timer 前言 定时任务调度,有两个比较重要的概念,一个是定时,一个是调度,所谓的定时调度,指的是...

  • linux定时任务

    一 、简介 Linux下的任务调度分为两类,系统任务调度和用户任务调度 系统任务调度:系统需要定期执行的任务,比如...

  • ORACLE调度之基于时间的调度(一)

    一、调度的概述 这里我看到一篇对调度的概述觉得描述的比我好,但仅限于概述部分,其他部分我觉得我讲的比他好,于是发生...

  • ORACLE调度之基于事件的调度(二)

    二、知识补充 1、队列:一种数据结构,就像一根管道一样,进程一个个的塞进去,然后一个个的出来,讲究的是先进先出。 ...

  • Linux 系统之crontab命令

    Linux下的任务调度分为两类,系统任务调度 和 用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓...

  • 任务调度

    http://www.cnblogs.com/langtianya/archive/2013/05/15/3079...

  • 任务调度

    介绍 在本方案中,使用celery作为任务分发平台。对于存入celery的大量任务,能达到以下的要求: 任务逻辑相...

网友评论

      本文标题:Oracle任务调度之DMBS_JOB

      本文链接:https://www.haomeiwen.com/subject/kcutoxtx.html