创建一个简单的定时任务
1、创建表
create table a(
a date
)
2、创建存储过程
create or replace procedure p_test as
begin
insert into a values(sysdate);
end;
3、创建定时任务,定时的执行吃存储过程
Oracle 10g之前,可以使用dbms_job来管理定时任务。
10g之后,Oracle引入dbms_scheduler来替代先前的dbms_job,
打开命令窗口,每隔30秒
SQL> VARIABLE jobno number;
SQL> begin
2 dbms_job.submit(
3 :jobno,
4 'p_test;',
5 SYSDATE,
6 'SYSDATE + 30/(60*24*60)');
7 commit;
8 end;
9 /
PL/SQL procedure successfully completed
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
2 dbms_job.remove(22);
3 end;
4 /
PL/SQL procedure successfully completed
注:删除以后要commit才能成功
4、定时任务job的简述
DBMS_JOB系统包是Oracle创建定时任务的API编程接口,最常用的方法有两个:
dbms_job.submit()和dbms_job.remove()
前者负责提交一个定时任务,后者负责移除一个定时任务,他们都是有参的。
submit的公共参数如下
名称 类型 注释
Job BINARY_INTEGER 任务的唯一识别号
What VARCHAR2 作为任务执行的PL/SQL代码
Next_date VARCHAR2 任务下一次运行的时间
Interval VARCHAR2 日期表达式,用来计算下一次任务运行的时间
第一参数,job,用来标识任务的代号,传入一个变量即可,在任务添加后会将这个变量置为系统设置的代号
第二参数,what,用来标识这个定时任务要执行的东西,这是个字符串,内容是db编程代码,如 'begin generateAlarmTime;end;' 表示这个定时任务定时执行generateAlarmTime这个存储过程。
第三参数,next_date,用来标识任务队列中该任务下一次运行的时间。当将一个任务的next_date参数赋值为null时,则该任务下一次运行的 时间将被指定为4000年1月1日,也就是说该任务将永远不再运行。一般可将其置为sysdate就是立即执行。
第四参数,interval,用来表示任务执行间隔。如果传递一个null值给interval参数,则该任务仅仅执行一次。
描述 Interval参数值
每天运行一次 'SYSDATE + 1'
每小时运行一次 'SYSDATE + 1/24'
每10分钟运行一次 'SYSDATE + 10/(60*24)'
每30秒运行一次 'SYSDATE + 30/(60*24*60)'
每隔一星期运行一次 'SYSDATE + 7'
不再运行该任务并删除它 NULL
关于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,'yyyy'), 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)。
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 => ,step_name => ,attribute => ,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 =>,
credential_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