Oracle 中的作业队列和队列调度
* 提交的作业请求的过程声明:
PROCEDURE 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 0,
force IN BOOLEAN DEFAULT FALSE );
-- Submit a new job. Chooses JOB from the sequence sys.jobseq.
-- instance and force are added for jobq queue affinity
-- If FORCE is TRUE, then any positive integer is acceptable as the job
-- instance. If FORCE is FALSE, then the specified instance must be running;
-- otherwise the routine raises an exception.
-- For example,
-- variable x number;
-- execute dbms_job.submit(:x,'pack.proc(''arg1'');',sysdate,'sysdate+1');
下面再通过包中给出的参数的含义就可以知道当我们需要添加作业的时候的各个参数各有什么含义了:
- job 指定被执行的作业的作业号
- what 指定需要被执行的 pl/sql 代码
- next_date 作业下一次运行时间,缺省值为 sysdate
- interval 这里是用来计算下一次作业执行时间的日期函数,缺省为 NULL。(基本是估算)
- no_parse 一个标记。false(缺省): Oracle 将分析与作业相关联的过程。true: 将分析与首次执行的作业相关联的过程。例如:如果希望在创建与作业相关联的表完成之前提交作业,就需要设置为 true。
* 删除先前提交的作业:
PROCEDURE remove ( job IN BINARY_INTEGER );
-- Remove an existing job from the job queue.
-- This currently does not stop a running job.
-- execute dbms_job.remove(14144);
* 更改作业:
PROCEDURE 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);
-- Change any of the the user-settable fields in a job
-- Parameter instance and force are added for job queue affinity
-- If what, next_date,or interval is null, leave that value as-is.
-- instance defaults to NULL indicates instance affinity is not changed.
-- If FORCE is FALSE, the specified instance (to which the instance number
-- change) must be running. Otherwise the routine raises an exception.
-- If FORCE is TRUE, any positive integer is acceptable as the job instance.
-- execute dbms_job.change( 14144, null, null, 'sysdate+3');
* 对指定的作业修改作业说明
PROCEDURE what ( job IN BINARY_INTEGER,
what IN VARCHAR2 );
-- Change what an existing job does, and replace its environment
* 修改指定作业的下一次执行时间
PROCEDURE next_date ( job IN BINARY_INTEGER,
next_date IN DATE );
-- Change when an existing job will next execute
* 修改指定作业的执行间隔
PROCEDURE interval ( job IN BINARY_INTEGER,
interval IN VARCHAR2 );
-- Change how often a job executes
PROCEDURE broken ( job IN BINARY_INTEGER,
broken IN BOOLEAN,
next_date IN DATE DEFAULT SYSDATE );
-- Set the broken flag. Broken jobs are never run.
* 强制执行某个指定的作业
PROCEDURE run ( job IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);
-- Run job JOB now. Run it even if it is broken.
-- Running the job will recompute next_date, see view user_jobs.
-- execute dbms_job.run(14144);
-- Warning: this will reinitialize the current session's packages
-- FORCE is added for job queue affinity
-- If FORCE is TRUE, instance affinity is irrelevant for running jobs in
-- the foreground process. If FORCE is FALSE, the job can be run in the
-- foreground only in the specified instance. dbms_job.run will raise an
-- exception if FORCE is FALSE and the connected instance is the wrong one.
其中,初始化参数 JOB_QUEUE_PROCESSES 控制数据库实例能否启动一个协调作业队列程序进程。如果这个参数值为 0,表示在数据库启动的时候不启动作业队列协调进程,当然也不会执行作业队列中的任何作业。该参数也可以指定在一个实例上能够并发运行 Jnnn 进程的最大数目。可以指定的最大进程数目为 1000。
并且该参数是动态的,可以使用如下语句动态更改设置:
alter system set JOB_QUEUE_PROCESSES = 20;
二,管理作业队列
2,下面举些例子吧,这样更 “实惠”:)
declare
-- Local variables here
jobno number;
begin
dbms_job.submit(jobno, 'dbms_ddl.analyze_object(''TABLE'',''SCOTT'', ''EMP'', ''ESTIMATE'', ''NULL'', 50);', SYSDATE, 'SYSDATE+1');
end;
3,下面是和作业(JOB)相关的一些属性:
* 作业所有者
* 作业号码 队列中的作业用作业号码进行标识。当提交作业时,它的作业号码将从 sys.jobseq 序列中自动生成。一旦分配就不可以再更改作业号码了。
* 作业定义 就是提交作业(submit)时指定的 what 需要执行的 pl/sql 代码。这里需要注意的是在作业定义中,需要使用两个单引号括住字符串哦,如同使用动态 sql 中的字符串;还有,不能从一个作业中运行另一个作业。
* 作业执行间隔 用于指定两次作业执行的间隔时间,也可以认为你的作业向间隔多长时间执行一次,特别适合那些周期性的任务。
一些常用的日期表达式:
- sysdate+7 每周运行一次
- sysdate+1/48 每半小时运行一次
- next_day(trunc(sysdate), "MONDAY")+15/24 每个星期一的下午 3 点开始运行
- next_day(add_months(trunc(sysdate, "Q"), 3), 'TRUSDAY') 每个季度的第一个星期四
注意:
(1) 例如,如果在周一设置了执行间隔为“sysdate+7”, 但是因某种原因,没有执行,直到周四才执行,则下次执行的时间是在每周四开始执行作业了。如果 interval 日期函数求出来的值是 NULL,
(2) 当然,如果你希望你作业一直在某个时间点开始执行,而不管上次执行的结束时间,则你的 interval 和 next_date 参数都应该如下方式指定:next_day(trunc(sysdate), "MONDAY")
4,下面我们再看看作业队列是如何运行的,以及其运行状态的查看
(1) Oracle 通过使用作业队列锁来确保每次作业只是在一个会话中运行。可以使用锁视图来查看会话程序当前锁的相关信息:
select * from v$lock where type = 'JQ';
也可以通过查看正在运行的作业的情况:
select * from dba_jobs_running;
(2) 作业执行错误,有关失败的信息会纪录在跟踪文件和报警日志中,并且 Oracle 会写入编号为 Ora-12012 的消息并包括失败作业的作业号。
(3) 删除作业,dbms_job.remove(作业号);
(4) 更改作业,
- dbms_job.change(作业号,NULL,NULL,'SYSDATE+3');
将作业改为每三天运行一次
- dbms_job.what(作业号,'scott.emppackage.give_raise(''abc'', 6000.00);');
改变作业的定义
- dbms_job.next_date(作业号,'SYSDATE+5');
改变作业的下一次执行时间
- dbms_job.interval(作业号,NULL);
成功执行作业之后将不再运行该作业
三,查看作业队列信息
* dba_jobs 数据库中的所有作业
* all_jobs 当前用户可以访问的所有作业
* user_jobs 属于当前用户的所有作业
* dba_jobs_running 列出数据库中当前运行的所有作业
Oracle 中的作业队列和队列调度的更多相关文章
- oracle自定义job名字,job调度
一.调试创建 begin -- create_schedule dbms_scheduler.create_schedule(schedule_name => 's_change_send_da ...
- QoS专题-第5期-QoS实现之队列调度与报文丢弃
QoS实现之队列调度与报文丢弃 前面的专题里面介绍了通过优先级映射或者MQC对报文进行分类和标记,那么分类之后要做什么呢?那就是根据分类结果对报文进行流量控制处理.拥塞管理和拥塞避免就是两种流量控制手 ...
- 在oracle中怎么通过字段名查询其所在的表
ora = //连接描述符名:ora (description = //描述 (address = //网络地址之一 (protocol = tcp) //网络协议(tcp表示TCP/IP协议) (h ...
- golang实现并发爬虫三(用队列调度器实现)
欲看此文,必先可先看: golang实现并发爬虫一(单任务版本爬虫功能) gollang实现并发爬虫二(简单调度器) 上文中的用简单的调度器实现了并发爬虫. 并且,也提到了这种并发爬虫的实现可以提高爬 ...
- Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述
--varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个 ...
- Oracle中如何实现Mysql的两表关联update操作
在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...
- ORACLE中的LTRIM、RTRIM和TRIM
LTRIM.RTRIM和TRIM在ORACLE中的用法:1.LTRIM(C1,C2)其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVER不 ...
- oracle中临时表是用来做什么的
oracle中临时表是用来做什么的 某些情况下, 需要 多个非常大的表关联的情况下, 但是需要检索的, 是少量的数据的时候.可以先把 大表的数据, 检索出那一小部分, 然后插入到 临时表中, 最后再关 ...
- Oracle 中 decode 函数用法
Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...
随机推荐
- 横向图片墙排列算法及demo
演示地址: http://codeman35.itongyin.com:19005/v1/9gg_v2.html 功能: 按照不同的图片比例,进行横向9宫格排列,原则是尽量排列的整齐,不要多余出来格子 ...
- 答:SQLServer DBA 三十问之三:有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理
3. 有哪些操作会使用到TempDB:如果TempDB异常变大,可能的原因是什么,该如何处理: tempdb的用途:1)存储专用和全局临时变量,不考虑数据库上下文: 2)与Order by 子句,游标 ...
- js类式继承模式学习心得
最近在学习<JavaScript模式>,感觉里面的5种继承模式写的很好,值得和大家分享. 类式继承模式#1--原型继承 方法 让子函数的原型来继承父函数实例出来的对象 <script ...
- 代理服务器(Proxy)原理
17.1 什么是代理服务器(Proxy) 以类似代理人的身份去取得用户所需要的数据就是了! 但是由于它的『代理』能力,使得我们可以透过代理服务器来达成防火墙功能与用户浏览数据的分析! 此外,也 ...
- django框架的models
在django的框架设计中采用了mtv模型,即Model,template,viewer Model相对于传统的三层或者mvc框架来说就相当对数据处理层,它主要负责与数据的交互,在使用django框架 ...
- try--catch--finally中return返回值执行的顺序(区别)
1.try块中没有抛出异常,try.catch和finally块中都有return语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static int ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
- 在svg中的line和path根据路径返回x,y
由于path有自带的api可获得总长度,和某个长度返回的坐标. var total = d.path.getTotalLength();//返回总长度 var point = d.path.getPo ...
- centos7 install 安装mysql
# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -ivh mysql-community- ...
- lucene写索引出现锁文件的原因之一
lucene正常情况目录下的文件 有三个文件. segments.gen segments_a08, 还有一个类似 _uw.cfs名字的东西. 当然,不一定都一样, 但肯定是这三个. 如果出现了很多文 ...