创建一个简单的定时任务
1、创建表
create table a(
a date
)
2、创建存储过程
create or replace procedure p_test as
begin
3、创建定时任务,定时的执行吃存储过程
Oracle10g之前,可以使用dbms_job来管理定时任务。
10g之后,Oracle引入dbms_scheduler来替代先前的dbms_job,
打开命令窗口,每隔30秒
sql> VARIABLE jobno number;
sql> begin
jobno
---------
22
查看作业
select * from dba_jobs
执行作业
启动定时任务
1
2
3
4
5
|
begin
dbms_job.run(25);
commit
;
end
;
/
|
注:job创建了但是不执行,跟参数show parameter job有关
sql> show parameter job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 0
alter system set job_queue_processes=20;
停止定时任务
sql> begin
PL/sql procedure successfully completed
注:删除以后要commit才能成功
4、定时任务job的简述
DBMS_JOB系统包是Oracle创建定时任务的API编程接口,最常用的方法有两个:
dbms_job.submit()和dbms_job.remove()
前者负责提交一个定时任务,后者负责移除一个定时任务,他们都是有参的。
submit的公共参数如下
名称
Job
What
Next_date
Interval
第一参数,job,用来标识任务的代号,传入一个变量即可,在任务添加后会将这个变量置为系统设置的代号
第二参数,what,用来标识这个定时任务要执行的东西,这是个字符串,内容是db编程代码,如 'begin generateAlarmTime;end;' 表示这个定时任务定时执行generateAlarmTime这个存储过程。
第三参数,next_date,用来标识任务队列中该任务下一次运行的时间。当将一个任务的next_date参数赋值为null时,则该任务下一次运行的
第四参数,interval,用来表示任务执行间隔。如果传递一个null值给interval参数,则该任务仅仅执行一次。
描述
每天运行一次
每小时运行一次
每10分钟运行一次
每30秒运行一次
每隔一星期运行一次
不再运行该任务并删除它
关于job运行时间
1:每分钟执行
Interval => TRUNC(sysdate,'mi') + 1/(24*60)
2:每天定时执行
例如:每天的凌晨1点执行
Interval => TRUNC(sysdate) + 1 +1/(24)
3:每周定时执行
例如:每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24
4:每月定时执行
例如:每月1日凌晨1点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24
5:每季度定时执行
例如每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
6:每半年定时执行
例如:每年7月1日和1月1日凌晨1点
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
7:每年定时执行
例如:每年1月1日凌晨1点执行
Interval =>ADD_MONTHS(trunc(sysdate,12)+1/24
job的运行频率设置
1.每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + (8*60+10)/24*60
2.Toad中提供的:
每天:trunc(sysdate+1)
每周:trunc(sysdate+7)
每月:trunc(sysdate+30)
每个星期日:next_day(trunc(sysdate),'星期日')
每天6点:trunc(sysdate+1)+6/24
半个小时:sysdate+30/(24*60)
3.每个小时的第15分钟运行,比如:8:15,9:15,10:15…:trunc(sysdate,'hh')+(60+15)/(24*60)。
1.program
1.1 create_program
参数说明:
program_name——程序名称
program_type——程序类型(STORED_PROCEDURE,PLsql_BLOCK,EXECUTABLE)
STORED_PROCEDURE——ORACLE 中定义好的存储过程
PLsql_BLOCK——是一段标准的pl/sql 代码
EXECUTABLE——指定外部命令的命令行信息(含路径信息)
program_action——具体对应的执行内容,若为过程则为过程名
enable——若为true则创建后激活反之不激活
comments——注释
例子:
BEGIN
dbms_scheduler.create_program(program_name => 'myprogram',
program_type => 'STORED_PROCEDURE',
program_action => 'p_test1',
number_of_arguments => 1,
enabled => FALSE,
comments => '更新gi_pipe表');
END;
注:如果创建的程序需要输入参数,则必须定义完参数后在激活,即创建这个program时将enable设为false,否则提示:
Ora-27456:程序“ ”的参数并未全部定义;然后再对该program定义参数即执行define_program_argument过程(见1.3)。
--查看定义的program
SELECT * FROM user_scheduler_programs;
1.2 drop_program
参数说明:
program_name——要删除的程序名称
force——true或者false。如果为true则不管该program是否被job引用都会删除,FALSE则若被引用无法删除,默认为false。
例子:
BEGIN
dbms_scheduler.drop_program(program_name => 'myprogram',force => TRUE);
END;
1.3 define_program_argument
参数说明:
program_name——程序名称
argument_position——参数位置(也可以知道参数名称选择argument_name)
argument_type——参数类型
default_value——参数默认值
例子:
BEGIN
dbms_scheduler.define_program_argument(program_name => 'myprogram',
argument_position => 1,
argument_name => 'p_lttid',
argument_type => 'varchar2',
default_value => 'daaa');
END;
--查看定义的program参数
SELECT *FROM User_Scheduler_Program_Args;
1.4 define_anydata_argument(用于定义输入参数为复杂类型需采用sys.AnyData类型来包装的参数)
参数说明:
program_name——程序名称
argument_position——参数位置(也可以知道参数名称选择argument_name)
argument_type——参数类型为sys.AnyData
default_value——参数默认值
1.5 define_Metadata_argument
有效的Metadata attributes有: 'job_name','job_subname','job_owner','job_start','window_start',
'window_end',and 'event_message'.
Metadata Attribute Data Type Description
job_name VARCHAR2 当前执行的job名称
job_subname VARCHAR2 当前执行的job子名称
job_owner VARCHAR2 当前执行的job所有者
job_start TIMESTAMP WITH TIME ZONE job启动的时间
window_start TIMESTAMP WITH TIME ZONE window打开的时间
window_end TIMESTAMP WITH TIME ZONE window关闭的时间
event_message 事件触发job启动的信息
例子:(以下Metadata_attribute设置为job_name,即以job_start这个值作为输入参数)
BEGIN
dbms_scheduler.define_Metadata_argument(program_name => 'myprogram',
Metadata_attribute => 'job_start');
END;
1.6 drop_program_argument
例子:
BEGIN
dbms_scheduler.drop_program_argument(program_name => 'myprogram',
argument_position => 1);
END;
2.schedule
2.1 create_schedule
参数说明:
repeat_interval——运行频率
end_date和comments默认可以不填
例子:
BEGIN
dbms_scheduler.create_schedule(schedule_name => 'myscheduler',
repeat_interval => 'FREQ=MINUTELY;INTERVAL=2');
END;
2.2 create_event_schedule
创建基于事件的调度,用于当一个特殊事件被抛出时启动一个job。
Event类型 描述
job_started job启动
job_succeeded job启动成功
job_Failed job失败
job_broken 被禁止或状态改为broken
job_completed job执行完成即完成了限制的最大执行次数或者到达执行指定的结束时间
job_stopped 停止job
job_sch_lim_reached 达到了scheduler的限制设置的值
job_disabled 禁止job
job_chain_stalled A job running a chain was put into the CHAIN_STALLED state. A running chain becomes
stalled if there are no steps running or scheduled to run and the chain evaluation_interval is set to NULL.
No progress will be made in the chain unless there is manual intervention.
job_all_events Not an event,but a constant that provides an easy way for you to enable all events
job_run_completed job执行或者失败或者成功或者被停止
参数:
event_condition——tab.user_data
queue_spec——必须先创建一个queue,dbms_aqadm.create_queue
--摘至http://www.233.com/oracle/zhonghe/20080807/104612630.html
BEGIN
dbms_scheduler.create_event_schedule(schedule_name => 'acc_mgr_change',
start_date => systimestamp,
event_condition => 'tab.user_data.event_name = ''acc_mgr_change''',
queue_spec => 'proc_queue');
end;
2.3 drop_schedule
例子:
BEGIN
DBMS_SCHEDULER.drop_schedule(schedule_name => 'myscheduler');
END;
3.job
3.1 create_job
参数说明:
job_type:类同上述创建program
job_class DEFAULT 'DEFAULT_JOB_CLASS'
enabled 默认FALSE,其创建后要想执行该job必须先执行enable过程
auto_drop 默认TRUE,即当job执行完毕都到期是否直接删除job
comments 默认NULL
job_style 默认REGULAR
credential_name 默认 NULL
destination_name 默认 NULL
--不采用program和scheduler直接创建job
BEGIN
dbms_scheduler.create_job(job_name => 'myjob',
job_type => 'STORED_PROCEDURE',
job_action => 'p_test1',
start_date => '',
repeat_interval => 'FREQ=DAILY;INTERVAL=2',
enabled => TRUE,
comments => 'My new job');
END;
--根据program和scheduler创建job
BEGIN
dbms_scheduler.create_job(job_name => 'myjob',
program_name => 'myprogram',
schedule_name => 'myscheduler');
END;
3.2 run_job
BEGIN
dbms_scheduler.run_job(job_name => 'myjob2');
END;
3.3 stop_job
BEGIN dbms_scheduler.stop_job(job_name => 'myjob');END;
3.4 copy_job
BEGIN dbms_scheduler.copy_job(old_job =>'myjob',new_job =>'myjob2' );END;
3.5 drop_job
BEGIN dbms_scheduler.drop_job(job_name => 'myjob');END;
3.6 set_job_argument_value
设置job的输入参数值,设置后会覆盖原先定义该参数设置的默认值
BEGIN
dbms_scheduler.set_job_argument_value(job_name => 'myjob2',
argument_value => 'qwerer');
END;
3.7 set_job_anydata_value
方法类似3.6,只是设置的参数值类似是sys.anydata
3.8 reset_job_argument_value
重置job参数值,将其置为空
4.group(11g才有的)
4.1 create_group
参数:
group_type——组类型,该组的所有成员必须是同一类型,已有的类型有三种:
DB_DEST:即成员为目标数据库,执行远程数据库的job;
EXTERNAL_DEST(External destination):Members are external destinations,for running remote external jobs;
WINDOW:Members are Scheduler windows
创建时可以指定成员也可不指定,添加成员通过add_group_member过程添加。
BEGIN
dbms_scheduler.create_group(group_name =>,
group_type =>,
MEMBER =>,
comments =>);
END;
4.2 drop_group
删除组
4.3 add_group_member
为组添加成员
4.4 remove_group_member
移除组成员
4.5 create_database_destination
创建目标数据库,用于执行远程job
AGENT——The external destination name of the Scheduler agent to connect. Equivalent to an agent name.
The external destination must already exist. The external destination representing an agent is
created automatically on a database instance when the agent registers with that instance.
An agent‘s name is specified in its agent configuration file. If it is not specified,it defaults
to the first part (before the first period) of the name of the host it resides on.
DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION (
destination_name IN VARCHAR2,--目标数据库名称
agent IN VARCHAR2,--代理名称,事先创建好的
tns_name IN VARCHAR2,--tns名称
comments IN VARCHAR2 DEFAULT NULL);
4.6 drop_database_destination
4.7 drop_agent_destination
5.jobclass
Job Classes 相当于创建了一个job组,DBA可以将那些具有相同特性的job,放到相同的Job Classes中,
然后通过对Job Class应用ORACLE中的"资源使用计划"特性,就可以对这些job执行过程中所需要的资源分配情况进行
管理。
5.1 create_job_class
参数:
resource_consumer_group——指定该jobclass所使用的资源分配方式。具体创建方法见dbms_resource_manager.create_consumer_group。
jobclass与resource_consumer_group为多对1关系;
若为该jobclass指定的resource_consumer_group被删除,则使用默认的resource_consumer_group;
若没为jobclass指定具体的resource_consumer_group,则使用默认的resource_consumer_group;
若为该jobclass指定的resource_consumer_group不存在,则会提示错误;
若为该jobclass指定了resource_consumer_group,则service参数必须设置为空(即这两个参数只能设置其中一个)。
service——一般用于rac环境指定jobclass运行于哪个节点。
logging_level——日志记录级别(DBMS_SCHEDULER.LOGGING_OFF,DBMS_SCHEDULER.LOGGING_RUNS,DBMS_SCHEDULER.LOGGING_FULL)
log_history——日志存放时间,默认30
例子:
BEGIN
dbms_scheduler.create_job_class(job_class_name =>,
resource_consumer_group =>,
service =>,
logging_level =>,
log_history =>,
comments =>);
END;
5.2 drop_job_class
--删除多个job class用逗号隔开
BEGIN
dbms_scheduler.drop_job_class(job_class_name => '');
END;
6.window
通常job启动后,用户只能被动地等待其执行,一直到其执行地任务完成(或DBA手动kill对应进程),在此期间,
执行的job将与其它活动的进程共同竞争当前系统中的资源。在9i之前就是这样。在Job Classes中也可以控制job能够
使用的资源,不过单单使用Job Classes并不能灵活的控制job在合适的时间使用适当的资源。进入10g之后,采用
dbms_scheduler的WINDOW可以缓解该问题。WINDOW 可以指定一个时间窗口,在此期间,通过与Job Classes的搭配组合,
能够有效控制job执行时支配(使用)的资源。比如说job通常是在凌晨服务器负载较低时执行,那么就可以通过WINDOW
设置在此期间,允许jobs使用更多的系统资源,而到了工作时间后,如果job仍未执行完成,为其分配另一个有限的
资源,以尽可能降低job执行占用的资源对其它业务的影响。
6.1 create_window
参数:
resource_plan——资源计划,即通过 dbms_resource_manager.create_plan来创建。
schedule_name——调度名称,基于已经创建好的调度创建window。
duration——时间窗口打开后持续的时间,创建时必须设置该值,因为没有默认值,设置范围从1分钟到99天。
window_priority——window优先级,如果同一时间出现多个window时则根据优先级决定执行哪个。
--创建一个基于调度的window
BEGIN
dbms_scheduler.create_window(window_name =>,
resource_plan =>,
schedule_name =>,
duration =>,
window_priority =>,
comments =>);
END;
--不基于时间调度创建window
DBMS_SCHEDULER.CREATE_WINDOW (
window_name IN VARCHAR2,
resource_plan IN VARCHAR2,
start_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
repeat_interval IN VARCHAR2,
end_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
duration IN INTERVAL DAY TO SECOND,
window_priority IN VARCHAR2 DEFAULT 'LOW',
comments IN VARCHAR2 DEFAULT NULL);
6.2 drop_window
删除一个window。
6.3 open_window
打开一个window。
6.4 close_window
关闭一个window。
7.windowgroup
一个WINDOW GROUP可能包含多个WINDOW。使用WINDOW GROUP的本意是这样的,假如说某个job执行的时间比较长,
甚至全天24小时都在执行,对于这类job,单个WINDOW很难有效调整其资源占用,因此就可以通过设置一个
WINDOW GROUP,该WINDOW GROUP中包含了多个WINDOW,每个WINDOW分别负责不同时间点时的资源使用计划。然后在
创建JOB时,指定schedule_name参数为WINDOW GROUP的名称,当然也可以直接指定window名称
(window已经包含了调度信息了)。
7.1 create_window_group
BEGIN
dbms_scheduler.create_window_group(group_name =>,
window_list =>,
comments =>);
END;
7.2 add_window_group_member
增加一个window
BEGIN
dbms_scheduler.add_window_group_member(group_name =>,window_list => );
END;
7.3 remove_window_group_member
移除一个window
7.4 drop_window_group
删除一个window
8.chain参考http://hi.baidu.com/sqlnever/item/be05b1abba1611fc15329b86
CHAIN可以被视做多个program放到同一个链中,这样的话就可以指定这些program执行的先后顺序。
8.1 create_chain
DBMS_SCHEDULER.CREATE_CHAIN (
chain_name IN VARCHAR2,
rule_set_name IN VARCHAR2 DEFAULT NULL,
evaluation_interval IN INTERVAL DAY TO SECOND DEFAULT NULL,
comments IN VARCHAR2 DEFAULT NULL);
8.2 define_chain_rule
定义规则
举例,如my_step1执行完则执行my_step2,若my_step2执行完则结束
BEGIN
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'TRUE',
action => 'start my_step1',
rule_name => 'my_rule1');
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'my_step1 completed',
action => 'start my_step2',
rule_name => 'my_rule2');
dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',
condition => 'my_step2 completed',
action => 'end 0',
rule_name => 'my_rule3');
END;
8.3 define_chain_step
BEGIN
dbms_scheduler.define_chain_step(chain_name => 'my_chain1',
step_name => 'my_step1',
program_name => 'p_p2');
dbms_scheduler.define_chain_step(chain_name => 'my_chain1',
step_name => 'my_step2',
program_name => 'p_p3');
END;
8.4 define_chain_event_step
BEGIN
dbms_scheduler.define_chain_event_step(chain_name =>,
step_name =>,
event_schedule_name =>,
timeout =>);
END;
8.5 drop_chain_rule
dbms_scheduler.drop_chain_rule(chain_name =>,rule_name => );
8.6 drop_chain_step
dbms_scheduler.drop_chain_step(chain_name =>,step_name => );
8.7 alter_chain
dbms_scheduler.alter_chain(chain_name =>,step_name =>,attribute =>,value => );
8.8 drop_chain
8.9 analyze_chain
dbms_scheduler.analyze_chain(chain_name =>,rules =>,steps =>,step_pairs => );
8.10 alter_running_chain
dbms_scheduler.alter_running_chain(job_name =>,value => );
8.11 evaluate_running_chain
dbms_scheduler.evaluate_running_chain(job_name => );
8.12 run_chain
dbms_scheduler.run_chain(chain_name =>,start_steps =>,job_name => );
9.credential
创建用户名密码,用于认证job执行
9.1 create_credential
BEGIN
dbms_scheduler.create_credential(credential_name =>,
username =>,
password =>,
database_role =>,
windows_domain =>,
comments =>);
END;
9.2 drop_credential
9.3 put_file
BEGIN
dbms_scheduler.put_file(destination_file =>,
destination_host =>,
credential_name =>,
file_contents =>,
destination_permissions =>);
END;
9.4 get_file
9.5 create_file_watcher
BEGIN
dbms_scheduler.create_file_watcher(file_watcher_name =>,
directory_path =>,
file_name =>,
destination =>,
min_file_size =>,
steady_state_duration =>,
comments =>,
enabled =>);
END;
9.6 drop_file_watcher
9.7 add_job_email_notification
BEGIN
dbms_scheduler.add_job_email_notification(job_name =>,
recipients =>,
sender =>,
subject =>,
BODY =>,
events =>,
filter_condition =>);
END;
9.8 remove_job_email_notification
10.通用的
10.1 DISABLE
BEGIN
dbms_scheduler.disable(NAME => 'myjob2');
END;
10.2 enable
BEGIN
dbms_scheduler.enable(NAME => 'myprogram');
END;
BEGIN
dbms_scheduler.enable(NAME => 'myjob2');
END;
10.3 set_attribute
attribute:是指设置job的属性,属性有:
logging_level——记录的日志信息,有三个值(DBMS_SCHEDULER.LOGGING_OFF,DBMS_SCHEDULER.LOGGING_RUNS,
DBMS_SCHEDULER.LOGGING_FULL)
restartable——设置job失败是否要重启
max_failures——允许job失败的次数,范围1到1000000,默认为空。
max_runs——job执行的最大次数,范围1到1000000,默认为空(即意味着job会重复执行,或者到达job执行的end_date,或者达到指定失败的次数)。
一旦达到设置的最大值,job将会disable并且状态变更为COMPLETED
max_run_duration——设置job运行的有效时间,如果设置了某个值,则在到达该值时调度会报JOB_OVER_MAX_DUR事件,
然后由事件处理器决定是否要继续
instance_stickiness——只用于rac数据库。默认为true,设置为true,则job会运行在负载最轻的节点上;如果某节点
关闭或负载太重,则不会启动新job,而是有另一个节点来执行该job。
stop_on_window_close——window关闭的时候停止job,默认为false。因此默认情况下关闭了window,job还是会继续执行,
但是要注意,window关闭则意味着资源使用计划就会变化。
job_priority——在同一个class,job执行的优先级,默认为3.
schedule_limit——允许启动job延迟的时间,设置值从1分钟到99天。超过了延迟的时间则不再启动job。如果不设置
该值,则只要得到允许所需的资源就会启动。另外,在延迟的这段时间里,job的执行次数或失败次数
会跳过,不计算这段时间的。
program_name——job执行的对象。如果设置了该属性,则job_action,job_type,number_of_arguments要设置为空。
job_action——job执行对象内容
job_type——job执行对象类型('PLsql_BLOCK','STORED_PROCEDURE','EXECUTABLE',and 'CHAIN')。如果设置了该值,
那么program_name参数必须设置为空 。
number_of_arguments——参数个数。如果设置了该值,那么program_name参数必须设置为空。
schedule_name——调度名,如果设置了该值,则end_date,start_date and repeat_interval需设置为空。
repeat_interval——执行间隔,设置了该值,则schedule_name需为空。
start_date——执行开始时间,设置了该值,则schedule_name需为空。
end_date——不再执行job的时间,设置了该值,则schedule_name需为空。
job_class——jobclass
comments——备注
auto_drop——当job状态为completed则自动删除该job
event_spec——需含两个值(event condition和queue specification)
raise_events——设置当job为什么状态时抛出,具体的时间类型见event类型。
--设置log_history为90天,默认30天
BEGIN
dbms_scheduler.set_scheduler_attribute('log_history','90');
END;
10.4 set_attribute_null
10.5 get_attribute
11.schedulerattribute
设置调度属性的值
11.1 set_scheduler_attribute
attribute类型有:default_timezone,email_server,email_sender,email_server_credential,email_server_encryption,
event_expiry_time ,log_history,max_job_slave_processes(没使用)
BEGIN
dbms_scheduler.set_scheduler_attribute(attribute =>,value => );
END;
11.2 get_scheduler_attribute
BEGIN
dbms_scheduler.get_scheduler_attribute(attribute =>,value => );
END;
11.3 add_event_queue_subscriber
BEGIN
dbms_scheduler.add_event_queue_subscriber(subscriber_name => );
END;
11.4 remove_event_queue_subscriber
BEGIN
dbms_scheduler.remove_event_queue_subscriber(subscriber_name => );
END;
11.5 purge_log
BEGIN
dbms_scheduler.purge_log(log_history =>,which_log =>,job_name => );
END;
dbms_scheduler包一些视图
--*代表all或dba或user
--1.查看job的视图
*_scheduler_jobs --查看job
*_scheduler_job_args --查看job的所有输入参数
*_scheduler_job_classes --查看job的类信息
*_scheduler_job_dests --查看job状态
*_scheduler_job_log --查看job日志
*_scheduler_job_run_details --查看job执行的详细信息
all_scheduler_running_jobs
--2.查看chain的一些视图
*_scheduler_chains
*_scheduler_chain_rules
*_scheduler_chain_steps
*_scheduler_running_chains --查看正在执行的chains
--3.查看program的视图
*_scheduler_programs --查看程序
*_scheduler_program_args --查看程序参数
--4.查看调度组信息
*_scheduler_groups
*_scheduler_group_members
--5.查看window的视图(这类视图只有dba和all开头的)
*_scheduler_windows --查看window
*_scheduler_window_details --查看window详细信息
*_scheduler_window_groups --查看window组
*_scheduler_window_log --查看window日志
*_scheduler_wingroup_members ----查看window成员
--6.查看scheduler视图
*_scheduler_schedules --查看调度
*_scheduler_global_attribute --显示所有的调度属性
*_scheduler_credentials
*_scheduler_db_dests
*_scheduler_dests
*_scheduler_external_dests
*_scheduler_file_watchers
*_scheduler_notifications
*_scheduler_remote_databases
*_scheduler_remote_jobstate
博客出处http://blog.csdn.net/fjseryi/article/details/45913065
原文链接:https://www.f2er.com/oracle/209546.html