最近,项目维护时要用到定时任务,及时总结一下,以后方便查询:
一般情况下,我们用到定时任务主要有两种方式:
1、操作系统的定时:
win的定时任务;
unix的crontab;
2、数据库级的定时,效率比较高;
如果有大量的数据表操作时,建议用数据库本身的job queue,相比系统级定时任务会更方便,效率也比较高;而系统级定时任务,会增加一定量的编程工作,而且不安全,比较容易出错。
在使用job queue之前,我们还要简单配置下:oracle定时执行job queue 的后台进程是SNP,要启动snp,首先看系统模式是否支持
sql> alter system enable restricted session;
或
sql> alter system disenable restricted session;
利用上面的命令更改系统的会话方式为disenable restricted,为snp的启动创建条件。再有就是配置job queue的启动参数,snp的启动参数位于oracle的初始化文件中:
job_queue_processes=10 (oracle10g 默认值)
job_queue_interval=N
第一行定义snp进程的启动个数为10,正常得女冠一范围是0-36,根据任务的多少,可以配置
不同的数值;
第二行定义系统每隔几秒唤醒该进程一次.缺省是60,正常范围是1-3600秒.事实上,该进程执行完;
当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。
注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。
查看job queue的详细信息,查询数据库字典 user_jobs
eg:
sql> select job,next_date,next_sec,broken from user_jobs;
包含以下子过程:
-
Broken()过程;
-
change()过程;
- Interval()过程;
- Isubmit()过程;
- Next_Date()过程;
- Remove()过程;
-
Run()过程;
-
Submit()过程;
-
User_Export()过程;
-
What()过程。
1、
Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。
这个过程有三个参数:job 、broken与next_date。
PROCEDURE Broken (job IN binary_integer,
Broken IN boolean,
next_date IN date :=SYSDATE)
job参数是工作号,它在问题中唯一标识工作。
broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。
next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。
2、
Change()过程用来改变指定工作的设置。
这个过程有四个参数:job、what 、next_date与interval。
PROCEDURE Change (job IN binary_integer,
What IN varchar2,
next_date IN date,
interval IN varchar2)
此job参数是一个整数值,它唯一标识此工作。
What参数是由此工作运行的一块PL/SQL代码块。
next_date参数指示何时此工作将被执行。
interval参数指示一个工作重执行的频度。
3、
Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。
这个过程有两个参数:job与interval。
PROCEDURE Interval (job IN binary_integer,
Interval IN varchar2)
job参数标识一个特定的工作。
interval参数指示一个工作重执行的频度。
4、
ISubmit()过程用来用特定的工作号提交一个工作。
这个过程有五个参数:job、what、next_date、interval与no_parse。
PROCEDURE ISubmit (job IN binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个
由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。
5、
Next_Date()过程用来显式地设定一个工作的执行时间。
这个过程接收两个参数:job与next_date。
PROCEDURE Next_Date(job IN binary_ineger,
next_date IN date)
job标识一个已存在的工作。
next_date参数指示了此工作应被执行的日期与时间。
6、
Remove()过程来删除一个已计划运行的工作。这个过程接收一个参数:
PROCEDURE Remove(job IN binary_ineger);
job参数唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。
已正在运行的工作不能由调用过程序删除。
7、
Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:
PROCEDURE Run(job IN binary_ineger)
job参数标识将被立即执行的工作。
8、
使用Submit()过程,工作被正常地计划好。
这个过程有五个参数:job、what、next_date、interval与no_parse。
PROCEDURE Submit ( job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE
指示此PL/SQL代码在它第一次执行时应进行语法分析,
而FALSE指示本PL/SQL代码应立即进行语法分析。
9、
User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。
此程序有两个参数:job与my_call。
PROCEDURE User_Export(job IN binary_ineger,
my_call IN OUT varchar2)
job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。
10、
What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。
PROCEDURE What (job IN binary_ineger,
What IN OUT varchar2)
job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。
一个简单例子:
创建测试表
SQL> create table a(a date);
表已创建。
创建一个自定义过程
SQL> create or replace procedure test as
2 begin
3 insert into a values(sysdate);
4 end;
5 /
过程已创建。
创建JOB
SQL> variable job1 number;
SQL>
SQL> begin
2 dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次
3 end;
4 /
PL/SQL 过程已成功完成。
运行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /
PL/SQL 过程已成功完成。
SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from a;
时间 -------------------
2010/02/02 23:51:21
2010/02/02 23:52:22
2010/02/02 23:53:24
删除JOB
SQL> begin
2 dbms_job.remove(:job1);
3 end;
4 /
PL/SQL 过程已成功完成。
下面说下常用的视图与参数:
任务队列中关于任务的数据字典视图
视图名 描述
DBA_JOBS 本数据库中定义到任务队列中的任务
DBA_JOBS_RUNNING 目前正在运行的任务
USER_JOBS 当前用户拥有的任务
JOB_QUEUE_PROCESSES >= 1 (如果系统在同一时间会运行很多的job, 或者还有大量需要自动refresh的snapshot, 适当加大)
JOB_QUEUE_INTERVAL : 秒数(缺省为60秒), 根据你的job的调度频度而定, 对于一般的一天运行一次的job, 设为缺省值或者几分钟都可以. (不要设置过小, 以免影响性能)
JOB_QUEUE_KEEP_CONNECTION (系统默认就可以,我没发现他的作用)
DBA_JOBS 和 USER_JOBS.字典视图的字段含义
字段(列) 类型 描述
JOB NUMBER 任务的唯一标示号
LOG_USER VARCHAR2(30) 提交任务的用户
PRIV_USER VARCHAR2(30) 赋予任务权限的用户
SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式
LAST_DATE DATE 最后一次成功运行任务的时间
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE DATE 正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE DATE 下一次定时运行任务的时间
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒
BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行
INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式
FAILURES NUMBER 任务运行连续没有成功的次数
WHAT VARCHAR2(2000) 执行任务的PL/SQL块
CURRENT_SESSION_LABEL RAW MLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙
CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置
MISC_ENV RAW(32) 任务运行的其他一些会话参数
视图DBA_JOBS_RUNNING的字段含义
列 数据类型 描述
SID NUMBER 目前正在运行任务的会话ID
JOB NUMBER 任务的唯一标示符
FAILURES NUMBER 连续不成功执行的累计次数
LAST_DATE DATE 最后一次成功执行的日期
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE DATE 目前正在运行任务的开始日期
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒
任务重复运行间隔和间隔设计
算法任务重复运行的时间间隔取决于interval参数中设置的日期表达式。下面就来详细谈谈该如何设置interval参数才能准确满足我们的任务需求。一般来讲,对于一个任务的定时执行,有三种定时要求。
在一个特定的时间间隔后,重复运行该任务。
在特定的日期和时间运行任务。
任务成功完成后,下一次执行应该在一个特定的时间间隔之后。
第一种调度任务需求的日期算法比较简单,即'SYSDATE+n',这里n是一个以天为单位的时间间隔。表6给出了一些这种时间间隔设置的例子。
一些简单的interval参数设置例子
描述 Interval参数值
每天运行一次 'SYSDATE + 1'
每小时运行一次 'SYSDATE + 1/24'
每10分钟运行一次 'SYSDATE + 10/(60*24)'
每30秒运行一次 'SYSDATE + 30/(60*24*60)'
每隔一星期运行一次 'SYSDATE + 7'
不再运行该任务并删除它 NULL
以上所示的任务间隔表达式不能保证任务的下一次运行时间在一个特定的日期或者时间,仅仅能够指定一个任务两次运行之间的时间间隔。例如,如果一个任务第一次运行是在凌晨12点,interval指定为'SYSDATE + 1',则该任务将被计划在第二天的凌晨12点执行。但是,如果某用户在下午4点手工(DBMS_JOB.RUN)执行了该任务,那么该任务将被重新定时到第二天的下午4点。还有一个可能的原因是如果数据库关闭或者说任务队列非常的忙以至于任务不能在计划的那个时间点准时执行。在这种情况下,任务将试图尽快运行,也就是说只要数据库一打开或者是任务队列不忙就开始执行,但是这时,运行时间已经从原来的提交时间漂移到了后来真正的运行时间。这种下一次运行时间的不断“漂移”是采用简单时间间隔表达式的典型特征。
第二种调度任务需求相对于第一种就需要更复杂的时间间隔(interval)表达式,表7是一些要求在特定的时间运行任务的interval设置例子。
定时到特定日期或时间的任务例子
描述 INTERVAL参数值
每天午夜12点 'TRUNC(SYSDATE + 1)'
每天早上8点30分 'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12点 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12点 'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6点10分 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'
第三种调度任务需求无论通过怎样设置interval日期表达式也不能满足要求。这时因为一个任务的下一次运行时间在任务开始时才计算,而在此时是不知道任务在何时结束的。遇到这种情况怎么办呢?当然办法肯定是有的,我们可以通过为任务队列写过程的办法来实现。这里我只是简单介绍以下,可以在前一个任务队列执行的过程中,取得任务完成的系统时间,然后加上指定的时间间隔,拿这个时间来控制下一个要执行的任务。这里有一个前提条件,就是目前运行的任务本身必须要严格遵守自己的时间计划。
分享到:
相关推荐
Oracle 定时任务不能自动执行的检查修复步聚 Oracle 定时任务是 Oracle 数据库中的一种功能,可以根据设置的计划执行某些任务。但是,在某些情况下,Oracle 定时任务可能不能自动执行。这可能是由于某个版本的 BUG...
### Oracle定时任务实现方法 #### 一、使用`DBMS_JOB` 在Oracle数据库中,`DBMS_JOB`包提供了一种简单的方式来安排周期性或一次性的工作。以下将详细介绍如何使用`DBMS_JOB`来创建、运行和管理定时任务。 ##### ...
通过合理地利用Oracle定时任务,可以极大地提高系统的运行效率和维护能力。 #### 二、Oracle定时任务的基础概念 在深入探讨Oracle定时任务之前,我们需要先了解几个基础的概念: - **Job**:Oracle定时任务的基本...
Oracle定时任务,也被称为Oracle调度(Oracle Scheduler),是Oracle数据库系统中的一个重要组件,用于安排数据库内的作业自动执行。这些作业可以包括数据备份、清理过期记录、运行统计分析等日常维护任务。Oracle ...
5. **文件名称列表**:`oracle定时任务`和`存储过程`这两个文件名可能是指包含有关如何在实际环境中设置和使用这些功能的文档或脚本。在学习和实践中,可以参考这些文件以获取更具体的步骤和示例。 综上所述,...
-- job 创建 begin dbms_scheduler.create_job ( job_name => 'AGENT_LIQUIDATION_JOB', ... job_type => 'STORED_PROCEDURE', ... job_action => 'AGENT_LIQUIDATION.LIQUIDATION', --存储过程名 ...
Oracle定时任务,也被称为Oracle数据库的调度作业,是Oracle数据库管理系统提供的一种功能,允许用户预定义一系列操作,如运行SQL脚本、数据备份或数据清理等,并设定在特定时间自动执行。这种机制对于自动化数据库...
Oracle的定时任务,通常被称为“Jobs”,是数据库管理系统中的一个重要组成部分,主要用于自动化执行数据库操作,如数据备份、数据清理、报告生成等。Job界面管理工具则为这些任务提供了图形化的配置和管理界面,...
Oracle定时任务详解主要涉及到Oracle数据库中的DBMS_JOB包,这是一个用于在数据库级别执行定时任务的工具,特别适合处理大量表级别的操作,以提高效率并减少系统级别的编程工作和潜在错误。Oracle的作业队列管理器...
Oracle定时任务机制主要依赖于`DBMS_JOB`系统包,它是Oracle数据库提供的任务调度API,允许用户提交、修改、删除和控制定时任务。`DBMS_JOB`包在Oracle数据库安装后,通过`ORACLE_HOME/rdbms/admin`目录下的`DBMSJOB...
根据提供的文件信息,本文将详细解释Oracle定时任务的创建与管理方法,并且这些步骤和示例均已在Oracle 817版本下进行了测试。 ### 一、创建表 首先,我们需要创建一个表来存储定时任务处理的数据。在这个例子中,...
Oracle定时任务,通常被称为DBMS_JOB,是一种在Oracle数据库中实现定时执行任务的机制。它允许用户安排PL/SQL代码块在预设的时间点或按照特定的间隔执行,无需依赖操作系统级别的定时任务如Windows的任务计划程序或...
### DBMS_JOB包创建Oracle定时任务详解 在Oracle数据库中,`DBMS_JOB`包提供了一种机制,用于创建和管理后台作业(Job),这些作业可以在特定的时间或按一定的时间间隔执行。这对于需要定期执行的任务非常有用,...
#### 一、Oracle定时任务概述 Oracle定时任务是数据库管理系统中的一个强大特性,允许用户在预设的时间点自动执行特定的数据库操作,如数据备份、数据清洗、报告生成等。这一功能主要通过Oracle的`DBMS_JOB`包实现...
Oracle的Job Queue是数据库级别的定时任务管理工具,它允许用户在数据库内部定义并调度任务,无需依赖操作系统级别的定时任务如Windows的任务计划程序或Unix的cron。这种机制在处理大量数据库操作时尤其有效,因为它...
Oracle 定时 EXP 文件到 FTP 服务器(Solaris) 一、Oracle 数据备份概述 在企业中的数据库管理中,数据备份是非常重要的一步骤。 Oracle 数据库作为一个强大的关系数据库管理系统,它提供了多种方式来备份数据。...
Oracle Job 定时任务 Oracle Job 定时任务是 Oracle 数据库中的一种定时执行任务的机制,它允许用户在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的 Job 可以通过以下视图查询系统中的 Job: *...