oracle定时任务

发布 2022-06-28 16:11:28 阅读 6724

dbms_job系统包是oracle“任务队列”子系统的api编程接口。dbms_job包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。

dbms_job包是由oracle_home目录下的rdbms/admin子目录下的和 这两个脚本文件创建的。这两个文件被脚本文件调用,而这个文件一般是在数据库创建后立即执行的。脚本为dbms_job包创建了一个公共同义词,并给该包授予了公共的可执行权限,所以所有的oracle用户均可以使用这个包。

下面几个数据字典视图是关于任务队列信息的,主要有dba_jobs, user_jobs和dba_jobs_running。这些字典视图是由名为的脚本文件创建的。该脚本文件和创建dbms_job包的脚本文件一样在oracle_home目录的rdbms/admin子目录中,同样也是由脚本文件调用。

最后,要使任务队列能正常运行,还必须启动它自己专有的后台过程。启动后台过程是通过在初始化文件init*.ora(实例不同,初始化文件名也略有不同)中设置初始化参数来进行的。

下面就是该参数:

job_queue_processes = n

其中,n可以是0到36之间的任何一个数。除了该参数以外,还有几个关于任务队列的初始化参数,本文后面将会对其进行详细讨论。

dbms_job包中包含有许多过程,见表1所示。

表1 dbms_job包。

名称类型描述

dbms_ 过程提交一个新任务,用户指定一个任务号

dbms_ 过程提交一个新任务,系统指定一个任务号

dbms_ 过程从队列中删除一个已经存在的任务

dbms_ 过程更改用户设定的任务参数

dbms_ 过程更改pl/sql任务定义

dbms_ 过程更改任务下一次运行时间

dbms_ 过程更改任务运行的时间间隔

dbms_ 过程将任务挂起,不让其重复运行

dbms_ 过程在当前会话中立即执行任务

dbms_ 过程创建文字字符串,用于重新创建一个任务

三、dbms_job包参数。

dbms_job包中所有的过程都有一组相同的公共参数,用于定义任务,任务的运行时间以及任务定时运行的时间间隔。这些公共任务定义参数见表2所示。

表2 dbms_job过程的公共参数。

名称类型注释

job binary_integer 任务的唯一识别号

what varchar2 作为任务执行的pl/sql**

next_date varchar2 任务下一次运行的时间

interval varchar2 日期表达式,用来计算下一次任务运行的时间

下面我们来详细讨论这些参数的意义及用法。

1、job参数job是一个整数,用来唯一地标示一个任务。该参数既可由用户指定也可由系统自动赋予,这完全取决于提交任务时选用了那一个任务提交过程。dbms_过程通过获得序列的下一个值来自动赋予一个任务号。

该任务号是作为一个out参数返回的,所以调用者随后可以识别出提交的任务。而dbms_过程则由调用者给任务指定一个识别号,这时候,任务号的唯一性就完全取决于调用者了。

除了删除或者重新提交任务,一般来说任务号是不能改变的。即使当数据库被导出或者被导入这样极端的情况,任务号也将被保留下来。所以在执行含有任务的数据的导入/导出操作时很可能会发生任务号冲突的现象。

2、what

what参数是一个可以转化为合法pl/sql调用的字符串,该调用将被任务队列自动执行。在what参数中,如果使用文字字符串,则该字符串必须用单引号括起来。 what参数也可以使用包含我们所需要字符串值的varchar2变量。

实际的pl/sql调用必须用分号隔开。在pl/sql调用中如果要嵌入文字字符串,则必须使用两个单引号。

what参数的长度在oracle7.3中限制在2000个字节以内,在oracle 8.0以后,扩大到了4000个字节,这对于一般的应用已完全足够。

该参数的值一般情况下都是对一个pl/sql存储过程的调用。在实际应用中,尽管可以使用大匿名pl/sql块,但建议大家最好不要这样使用。还有一个实际经验就是最好将存储过程调用封装在一个匿名块中,这样可以避免一些比较莫名错误的产生。

我来举一个例子,一般情况下,what参数可以这样引用:

what =>my_procedure(parameter1);’

但是比较安全的引用,应该这样写:

what =>begin my_procedure(parameter1); end;’

任何时候,我们只要通过更改what参数就可以达到更改任务定义的目的。但是有一点需要注意,通过改变what参数来改变任务定义时,用户当前的会话设置也被记录下来并成为任务运行环境的一部分。如果当前会话设置和最初提交任务时的会话设置不同,就有可能改变任务的运行行为。

意识到这个潜在的***是非常重要的,无论何时只要应用到任何dbms_job过程中的what参数时就一定要确保会话设置的正确。

3、next_date

next_date参数是用来调度任务队列中该任务下一次运行的时间。这个参数对于dbms_和dbms_这两个过程确省为系统当前时间,也就是说任务将立即运行。

当将一个任务的next_date参数赋值为null时,则该任务下一次运行的时间将被指定为2024年1月1日,也就是说该任务将永远不再运行。在大多数情况下,这可能是我们不愿意看到的情形。但是,换一个角度来考虑,如果想在任务队列中保留该任务而又不想让其运行,将next_date设置为null却是一个非常简单的办法。

next_date也可以设置为过去的一个时间。这里要注意,系统任务的执行顺序是根据它们下一次的执行时间来确定的,于是将next_date参数设置回去就可以达到将该任务排在任务队列前面的目的。这在任务队列进程不能跟上将要执行的任务并且一个特定的任务需要尽快执行时是非常有用的。

4、interval

internal参数是一个表示oracle合法日期表达式的字符串。这个日期字符串的值在每次任务被执行时算出,算出的日期表达式有两种可能,要么是未来的一个时间要么就是null。这里要强调一点:

很多开发者都没有意识到next_date是在一个任务开始时算出的,而不是在任务成功完成时算出的。

当任务成功完成时,系统通过更新任务队列目录表将前面算出的next_date值置为下一次任务要运行的时间。当由interval表达式算出next_date是null时,任务自动从任务队列中移出,不会再继续执行。因此,如果传递一个null值给interval参数,则该任务仅仅执行一次。

通过给interval参数赋各种不同的值,可以设计出复杂运行时间计划的任务。本文后面的“任务间隔和日期算法”将对interval表达式进行详细讨论,并给出一个实际有用interval表达式的例子。

四、任务队列架构和运行环境。

任务队列在oracle系统中其实是一个子系统,它具有自己特定的后台过程和目录表。该子系统设计的目的是为了能不在用户干预下自动运行pl/sql过程。

1、任务队列后台过程。

任务队列(snp)后台过程随着oracle实例的启动而同时启动。在文章前面已经谈到初始化文件中的参数job_queue_processes,用来设置有几个队列过程。这里设置了几个过程,系统中就会有几个snp过程被启动。

job_queue_processes这个参数,可以是0到36中的任何一个数,也就是说对于每个oracle实例最多可以有36个snp过程,也可以不支持队列过程(=0)。在大多数操作系统中,snp三个字母常作为过程名的一部分出现。如,在unix系统中,如果该oracle实例名为ora8,有三个任务队列过程,则这三个任务队列过程名称为:

ora_ora8_snp0

ora_ora8_snp1

ora_ora8_snp2

当一个任务队列过程失控或者消耗太多的资源时,就可以将其杀掉,当然这种情况不是经常遇到的。当一个snp过程被杀掉或者失败时,oracle就自动启动一个新的snp过程来代替它。

2、有关任务队列的初始化参数。

初始化文件中的几个参数控制着任务队列后台的运行,下面我们将对其进行详细讨论。

1)、job_queue_interval

任务队列过程定期唤醒并检查任务队列目录表是否有任务需要执行。参数job_queue_interval决定snp过程两次检查目录表之间“休眠”多长时间(单位为秒)。间隔设的太小会造成由于snp过程不断检查目录表而导致不必要的系统吞吐量。

相反如果间隔设得太大,snp过程在特定的时间没有被唤醒,那个时间的任务就不会能被运行。最佳的时间间隔设置要综合考虑系统环境中不同的任务,60秒的确省设置可以满足大多数的应用。

2)、job_queue_keep_connections

除了前面介绍的job_queue_process和job_queue_interval两个参数以外,影响snp后台过程行为的第三个参数是job_queue_keep_connections。当该参数为true时,snp过程在两个任务的运行期间(也就是休眠期间),仍然和oracle保持开放的连接。相反,如果为false时,snp过程将和数据库断开连接,当唤醒时刻到来时又重新连接并检查任务队列。

选择这两种方法中的那一种,主要是考虑任务队列的有效性和数据库关闭方法。长期保持连接的效率比较高,但任务队列会受到正常关闭数据库的影响。这是因为任务队列过程对于服务器管理器看来和一个普通用户的过程没有什么不同,而正常的关闭数据库需要让所有的用户都断开连接。

而断开连接和重新连接又给数据库增加了负荷,但是可定期地使数据库没有可连接snp过程,也就可以使数据库正常关闭。对于有很多任务或者是任务重复执行的时间间隔较短(一个小时或者更少)的环境,一般将job_queue_keep_connectioons设置为true,并修改关闭数据库的脚本为立即关闭。对于严格要求采用正常方式关闭的数据库或者是任务较少,重复间隔较长的环境,一般将该参数设置为false。

最好,要提醒一句,snp过程仅在没有任何任务运行时才断开,这种情况下,那些需要比较长时间运行的任务snp将在它们的生命周期内一致保持开放的连接,这就延迟了正常关闭数据库的时间。

oracle定时任务

一 在plsql中创建表 create table carno varchar2 30 carinfoid number 二 在plsql中创建存储过程 create or replace procedure pro test ascarinfo id number beginselect s in...

oracle定时任务

今天总结下oracle的任务队列管理器 job queue 以后也方便查询。我们要做定时任务时,有两种办法。一种是 操作系统的定时,win的定时任务,unix的crontab 一种是 数据库级的定时,她的效率更高,再有大量的表级操作时,建议用数据库本身的job queue,这样方便,效率高 如果用系...

oracle定时任务

dbms job系统包是oracle 任务队列 子系统的api编程接口。dbms job包对于任务队列提供了下面这些功能 提交并且执行一个任务 改变任务的执行参数以及删除或者临时挂起任务等。dbms job包是由oracle home目录下的rdbms admin子目录下的和 这两个脚本文件创建的。...