创建和管理定时任务
GaussDB(DWS)支持用户创建定时任务,当设置的任务时间点到达后可以自动触发任务的执行,从而可以减少用户运维的工作量。
数据库兼容Oracle定时任务功能主要通过DBMS.JOB高级包提供的接口,可以实现定时任务的创建、任务到期自动执行、任务删除、修改任务属性(包括:任务id、任务的关闭开启、任务的触发时间、触发时间间隔、任务内容等)。
- 实时数仓(单机部署)暂不支持定时任务功能。
- 定时任务的执行语句暂不记录到系统的实时TopSQL日志中,仅8.2.1及以上集群版本支持记录。
- GaussDB(DWS) 时间设置默认为UTC时间,定时任务的执行时间需根据用户所在时区差进行转换。
定时任务管理
- 创建测试表:
1
CREATE TABLE test(id int, time date);
当结果显示为如下信息,则表示创建成功。
1
CREATE TABLE
- 创建自定义存储过程:
1 2 3 4 5 6 7 8 9
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; /
当结果显示为如下信息,则表示创建成功。
1
CREATE PROCEDURE
- 创建任务:
- 新创建的任务(未指定job_id)表示每隔1分钟执行一次存储过程PRC_JOB_1。
1 2 3 4 5
call dbms_job.submit('call public.prc_job_1(); ', sysdate, 'interval ''1 minute''', :a); job ----- 1 (1 row)
- 指定job_id创建任务。
1 2 3 4 5
call dbms_job.isubmit(2,'call public.prc_job_1(); ', sysdate, 'interval ''1 minute'''); isubmit --------- (1 row)
- 新创建的任务(未指定job_id)表示每隔1分钟执行一次存储过程PRC_JOB_1。
- 通过USER_JOBS视图查看当前用户已创建的任务信息。
需要有系统管理员权限才可以访问此系统视图,字段说明详见表1。
1 2 3 4 5 6 7 8 9 10
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 | db_demo | 2022-03-25 07:58:01.829436 | 2022-03-25 07:58:03.174817 | 2022-03-25 07:58:01.829436 | 2022-03-25 07:59:01 | n | s | interval '1 minute' | 0 | call public.prc _job_1(); 2 | db_demo | 2022-03-25 07:58:15.893383 | 2022-03-25 07:58:16.608959 | 2022-03-25 07:58:15.893383 | 2022-03-25 07:59:15 | n | s | interval '1 minute' | 0 | call public.prc _job_1(); (2 rows)
- 停止任务。
1 2 3 4 5
call dbms_job.broken(1,true); broken -------- (1 row)
- 启动任务。
1 2 3 4 5
call dbms_job.broken(1,false); broken -------- (1 row)
- 修改任务属性。
- 修改JOB的Next_date参数信息。例如,修改Job1的Next_date为1小时以后开始执行。
1 2 3 4 5
call dbms_job.next_date(1, sysdate+1.0/24); next_date ----------- (1 row)
- 修改JOB的Interval参数信息。例如,修改Job1的Interval为每隔1小时执行一次。
1 2 3 4 5
call dbms_job.interval(1,'sysdate + 1.0/24'); interval ---------- (1 row)
- 修改JOB的What参数信息。例如,修改Job1的What为执行SQL语句“insert into public.test values(333, sysdate+5);”。
1 2 3 4 5
call dbms_job.what(1,'insert into public.test values(333, sysdate+5);'); what ------ (1 row)
- 同时修改JOB的Next_date、Interval、What等多个参数信息。
1 2 3 4 5
call dbms_job.change(1, 'call public.prc_job_1();', sysdate, 'interval ''1 minute'''); change -------- (1 row)
- 修改JOB的Next_date参数信息。例如,修改Job1的Next_date为1小时以后开始执行。
- 删除JOB。
1 2 3 4 5
call dbms_job.remove(1); remove -------- (1 row)
- JOB的权限控制。
- 当创建一个JOB时,该JOB会和创建该JOB的数据库和用户绑定(即:pg_job系统视图新增的JOB记录中的dbname和log_user)。
- 如果当前用户是DBA用户、系统管理员、该JOB的创建用户(即:pg_job中的log_user),那么该用户有权限通过高级包接口remove、change、next_data、what、interval删除或修改JOB的参数信息。否则,会提示当前用户没有权限操作该JOB。
- 如果当前数据库是该JOB创建所属的数据库(即:为pg_job系统视图中的dbname),那么连接到当前数据库上可以通过高级包接口remove、change、next_data、what、interval删除或修改JOB的参数信息。
- 当删除JOB所属的数据库(即:为pg_job系统视图中的dbname)时,系统会关联删除该数据库从属的JOB记录。
- 当删除JOB所属的用户(即:为pg_job系统视图中的log_user)时,系统会关联删除该用户从属的JOB记录。