首页 > 数据库 > > 其他操作-创建和管理定时任务
当客户在使用数据库过程中,如果白天执行一些耗时比较长的任务(例如:统计数据汇总之类或从其他数据库同步数据的任务),会对正常的业务有性能影响,所以客户经常选择在晚上执行,无形中增加了客户的工作量。因此数据库兼容Orcale数据库中定时任务的功能,可以由客户创建定时任务,当任务时间点到达后可以自动触发任务的执行,从而可以减少客户运维的工作量。
数据库兼容Oracle定时任务功能主要通过DBMS.JOBS高级包提供的接口,可以实现定时任务的创建、任务到期自动执行、任务删除、修改任务属性(包括:任务id、任务的关闭开启、任务的触发时间、触发时间间隔、任务内容等)。
CREATE TABLE test(id int, time date);当结果显示为如下信息,则表示创建成功。
CREATE TABLE创建自定义存储过程:
CREATE OR REPLACE PROCEDURE PRC_JOB_1()
AS
N_NUM integer :=1;
BEGIN
FOR I IN 1..1000 LOOP
INSERT INTO test VALUES(I,SYSDATE);
END LOOP;
END;
/
当结果显示为如下信息,则表示创建成功。
CREATE PROCEDURE创建任务:
call dbms_job.submit('call public.prc_job_1(); ', sysdate, 'interval ''1 minute''', :a);
job
-----
1
(1 row)
call dbms_job.isubmit(2,'call public.prc_job_1(); ', sysdate, 'interval ''1 minute''');
isubmit
---------
(1 row)
select job,dbname,start_date,last_date,this_date,next_date,broken,status,interval,failures,what from user_jobs;
job | dbname | start_date | last_date | this_date | next_date | broken | status | interval | failures | what
-----+--------+---------------------+----------------------------+----------------------------+---------------------+--------+--------+---------------------+----------+---------------------------
1 | postgres | 2017-07-18 11:38:03 | 2017-07-18 13:53:03.607838 | 2017-07-18 13:53:03.607838 | 2017-07-18 13:54:03 | n | s | interval '1 minute' | 0 | call public.prc_job_1();
(1 row)
call dbms_job.broken(1,true);
broken
--------
(1 row)
call dbms_job.broken(1,false);
broken
--------
(1 row)
call dbms_job.next_date(1, sysdate+1.0/24);
next_date
-----------
(1 row)
call dbms_job.interval(1,'sysdate + 1.0/24');
interval
----------
(1 row)
call dbms_job.what(1,'insert into public.test values(333, sysdate+5);');
what
------
(1 row)
call dbms_job.change(1, 'call public.prc_job_1();', sysdate, 'interval ''1 minute''');
change
--------
(1 row)
call dbms_job.remove(1);
remove
--------
(1 row)
当JOB自动执行时,如果JOB执行失败(即job_status状态值为'f')时,用户可以通过查看当前JOB所属CN的数据目录的pg_log子目录下对应时间点的运行日志来查看JOB的失败信息。
日志信息如下所示,从失败信息(detail error msg)中可以查看失败的具体错误。
LOG: Execute Job Detail:
job_id: 1
what: call public.test();
start_date: 2017-07-19 23:30:47.401818
job_status: failed
detail error msg: relation "test" does not exist
end_date: 2017-07-19 23:30:47.401818
next_run_date: 2017-07-19 23:30:56.855827
由于并行运行的任务数太多会消耗更多的系统资源,因此需要设置系统并发处理的任务数,当前并发的任务数达到job_queue_processes时,且此时又有任务到期,那么这些任务本次得不到执行而延期到下一轮询周期。因此,建议用户需要根据每个任务的执行时长合理的设置任务的时间间隔(即submit接口中的interval参数),来避免由于任务执行时间太长而导致下个轮询周期无法正常执行。
注:对于不使用JOB的集群中,用户可以通过在集群安装初始化完成后,通过设置job_queue_processes为0来关闭JOB功能,提高系统资源的消耗。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3126079/ ,如需转载,请注明出处,否则将追究法律责任。