Oracle任务调度之DMBS_JOB

本文链接: 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

猜你喜欢

转载自blog.csdn.net/weixin_34032792/article/details/87638089