您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > Oracle定时任务详解
[转]oracle定时任务(dbms_job)原文地址:今天总结下oracle的任务队列管理器(jobqueue),以后也方便查询.我们要做定时任务时,有两种办法一种是:操作系统的定时,win的定时任务,unix的crontab一种是:数据库级的定时,她的效率更高,再有大量的表级操作时,建议用数据库本身的jobqueue,这样方便,效率高;如果用系统级定时,会增加很多编程工作,成本增加了,还很容易出错,事情越简单出错的几率越小.再使用jobqueue之前,我们还要简单配置下,oracle定时执行jobqueue的后台进程是SNP,要启动snp,首先看系统模式是否支持sqlaltersystemenablerestrictedsession;或sqlaltersystemdisenablerestrictedsession;利用上面的命令更改系统的会话方式为disenablerestricted,为snp的启动创建条件.再有就是配置jobqueue的启动参数,snp的启动参数位于oracle的初始化文件中,job_queue_processes=10(oracle10gde默认值)job_queue_interval=N第一行定义snp进程的启动个数为10,正常得女冠一范围是0-36,根据任务的多少,可以配置不同的数值.第二行定义系统每隔几秒唤醒该进程一次.缺省是60,正常范围是1-3600秒.事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。查看jobqueue的详细信息,查询数据库字典user_jobseg:sqlselectjob,next_date,next_sec,brokenfromuser_jobs;包含以下子过程:Broken()过程。change()过程。Interval()过程。Isubmit()过程。Next_Date()过程。Remove()过程。Run()过程。Submit()过程。User_Export()过程。What()过程。1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job、broken与next_date。PROCEDUREBroken(jobINbinary_integer,BrokenINboolean,next_dateINdate:=SYSDATE)job参数是工作号,它在问题中唯一标识工作。broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。2、Change()过程用来改变指定工作的设置。这个过程有四个参数:job、what、next_date与interval。PROCEDUREChange(jobINbinary_integer,WhatINvarchar2,next_dateINdate,intervalINvarchar2)此job参数是一个整数值,它唯一标识此工作。What参数是由此工作运行的一块PL/SQL代码块。next_date参数指示何时此工作将被执行。interval参数指示一个工作重执行的频度。3、Interval()过程用来显式地设置重执行一个工作之间的时间间隔数。这个过程有两个参数:job与interval。PROCEDUREInterval(jobINbinary_integer,IntervalINvarchar2)job参数标识一个特定的工作。interval参数指示一个工作重执行的频度。4、ISubmit()过程用来用特定的工作号提交一个工作。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDUREISubmit(jobINbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=FALSE)这个过程与Submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的工作号。如果提供的工作号已被使用,将产生一个错误。5、Next_Date()过程用来显式地设定一个工作的执行时间。这个过程接收两个参数:job与next_date。PROCEDURENext_Date(jobINbinary_ineger,next_dateINdate)job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与时间。6、Remove()过程来删除一个已计划运行的工作。这个过程接收一个参数:PROCEDURERemove(jobINbinary_ineger);job参数唯一地标识一个工作。这个参数的值是由为此工作调用Submit()过程返回的job参数的值。已正在运行的工作不能由调用过程序删除。7、Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:PROCEDURERun(jobINbinary_ineger)job参数标识将被立即执行的工作。8、使用Submit()过程,工作被正常地计划好。这个过程有五个参数:job、what、next_date、interval与no_parse。PROCEDURESubmit(jobOUTbinary_ineger,WhatINvarchar2,next_dateINdate,intervalINvarchar2,no_parseINbooean:=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。PROCEDUREUser_Export(jobINbinary_ineger,my_callINOUTvarchar2)job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。10、What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。PROCEDUREWhat(jobINbinary_ineger,WhatINOUTvarchar2)job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。一个简单例子:创建测试表SQLcreatetablea(adate);表已创建。创建一个自定义过程SQLcreateorreplaceproceduretestas2begin3insertintoavalues(sysdate);4end;5/过程已创建。创建JOBSQLvariablejob1number;SQLSQLbegin2dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次3end;4/PL/SQL过程已成功完成。运行JOBSQLbegin2dbms_job.run(:job1);3end;4/PL/SQL过程已成功完成。SQLselectto_char(a,'yyyy/mm/ddhh24:mi:ss')时间froma;时间-------------------2001/01/0723:51:212001/01/0723:52:222001/01/0723:53:24删除JOBSQLbegin2dbms_job.remove(:job1);3end;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.字典视图的字段含义字段(列)类型描述JOBNUMBER任务的唯一标示号LOG_USERVARCHAR2(30)提交任务的用户PRIV_USERVARCHAR2(30)赋予任务权限的用户SCHEMA_USERVARCHAR2(30)对任务作语法分析的用户模式LAST_DATEDATE最后一次成功运行任务的时间LAST_SECVARCHAR2(8)如HH24:MM:SS格式的last_date日期的小时,分钟和秒THIS_DATEDATE正在运行任务的开始时间,如果没有运行任务则为nullTHIS_SECVARCHAR2(8)如HH24:MM:SS格式的this_date日期的小时,分钟和秒NEXT_DATEDATE下一次定时运行任务的时间NEXT_SECVARCHAR2(8)如HH24:MM:SS格式的next_date日期的小时,分钟和秒TOTAL_TIMENUMBER该任务运行所需要的总时间,单位为秒BROKENVARCHAR2(1)标志参数,Y标示任务中断,以后不会运行INTERVALVARCHAR2(200)用于计算下一运行时间的表达式FAILURESNUMBER任务运行连续没有成功的次数WHATVARCHAR2(2000)执行任务的PL/SQL块CURRENT_SESSION_LABELRAWMLSLABEL该任务的信任Oracle会话符CLEARANCE_HIRAWMLSLABEL该任务可信任的Oracle最大间隙CLEARANCE_LORAWMLSLABEL该任务可信任的Oracle最小间隙NLS_ENVVARCHAR2(2000)任务运行的NLS会话设置MISC_ENVRAW(32)任务运行的其他一些会话参数视图DBA_JOBS_RUNNING的字段含义列数据类型描述SIDNUMBER目前正在运行任务的会话IDJOBNUMBER任务的唯一标示符FAILURESNUMBER连续不成功执行的累计次数LAST_DATEDATE最后一次成功执行的日期LAST_SECVARCHAR2(8)如HH24:MM:SS格式的last_date日期的小时,分钟和秒THIS_DATEDATE目前正在运行任务的开始日期THIS_SECVARCHAR2(8)如HH24:MM:SS格式的this_date日期的小时,分钟和秒任务重复运行间隔和间隔设计算法任务重复运行的时间间隔取决于interval参数中设置的日期表达式。下面就来详细谈谈该如何设置interval参数才能准确满足我们的任务需求。一般来讲,对于一个任务的定时执行,有三种定时要求。在一个特定的时间间隔后,重复运行该任务。在特定的日期和时间运行任务。任务成功完成后,下一次执行应该在一个特定的时间间
本文标题:Oracle定时任务详解
链接地址:https://www.777doc.com/doc-2847852 .html