如何在openGauss 2.1.0中使用Job?
点击上方"蓝字"
关注我们,享更多干货!
Job类似Unix中的crontab,有定时执行的功能,可以在指定的时间点或每天的某个时间点等自行执行任务。在各类系统使用运行过程中,经常会遇到需要定时完成的任务,比如定时更新数据,定时统计数据生成报表等等,这些工作都可以使用Job来完成。在openGauss 2.1.0中,提供了以下接口来实现管理Job。
接口描述
1
接口名称 | 描述 |
---|---|
PKG_SERVICE.JOB_CANCEL |
通过任务ID来删除定时任务。 |
PKG_SERVICE.JOB_FINISH |
禁用或者启用定时任务。 |
PKG_SERVICE.JOB_SUBMIT |
提交一个定时任务。作业号由系统自动生成或由用户指定。 |
PKG_SERVICE.JOB_UPDATE |
修改定时任务的属性,包括任务内容、下次执行时间、执行间隔。 |
PKG_SERVICE.SUBMIT_ON_NODES |
提交一个任务到所有节点,作业号由系统自动生成。 |
PKG_SERVICE.ISUBMIT_ON_NODES |
提交一个任务到所有节点,作业号由用户指定。 |
接口定义和使用示例
2
PKG_SERVICE.JOB_CANCEL
存储过程CANCEL删除指定的定时任务。
PKG_SERVICE.JOB_CANCEL函数原型为:
PKG_SERVICE.JOB_CANCEL( job IN INTEGER);
参数 | 类型 | 入参/出参 | 是否可以为空 | 描述 |
---|---|---|---|---|
id | integer | IN | 否 | 指定的作业号 |
示例:
CALL PKG_SERVICE.JOB_CANCEL(101);
PKG_SERVICE.JOB_FINISH
存储过程FINISH禁用或者启用定时任务。
PKG_SERVICE.JOB_FINISH函数原型为:
PKG_SERVICE.JOB_FINISH( id IN INTEGER, broken IN BOOLEAN, next_time IN TIMESTAMP DEFAULT sysdate);
参数 | 类型 | 入参/出参 | 是否可以为空 | 描述 |
---|---|---|---|---|
id |
integer |
IN |
否 |
指定的作业号。 |
broken |
Boolean |
IN |
否 |
状态标志位,true代表禁用,false代表启用。根据true或false值更新当前Job;如果为空值,则不改变原有Job的状态。 |
next_time |
timestamp |
IN |
是 |
下次运行时间,默认为当前系统时间。如果参数broken状态为true,则更新该参数为’4000-1-1’;如果参数broken状态为false,且如果参数next_time不为空值,则更新指定Job的next_time值,如果next_time为空值,则不更新next_time值。该参数可以省略,为默认值。 |
PKG_SERVICE.JOB_SUBMIT
存储过程JOB_SUBMIT提交一个系统提供的定时任务。
PKG_SERVICE.JOB_SUBMIT函数原型为:
PKG_SERVICE.JOB_SUBMIT( id IN BIGINT DEFAULT, content IN TEXT, next_date IN TIMESTAMP DEFAULT sysdate, interval_time IN TEXT DEFAULT ‘null’, job OUT INTEGER);
当创建一个定时任务(JOB)时,系统默认将当前数据库和用户名与当前创建的定时任务绑定起来。该接口函数可以通过call或select调用,如果通过select调用,可以不填写出参。如果在存储过程中,则需要通过perform调用该接口函数。如果提交的sql语句任务使用到非public的schema,应该指定表或者函数的schema,或者在sql语句前添加set current_schema = xxx;语句。
参数 | 类型 | 入参/出参 | 是否可以为空 | 描述 |
---|---|---|---|---|
id |
bigint |
IN |
否 |
作业号。如果传入id为NULL,则内部会生成作业ID。 |
context |
text |
IN |
否 |
要执行的SQL语句。支持一个或多个‘DML’,‘匿名块’,‘调用存储过程的语句’或3种混合的场景。 |
next_time |
timestamp |
IN |
否 |
下次作业运行时间。默认值为当前系统时间(sysdate)。如果是过去时间,在提交作业时表示立即执行。 |
interval_time |
text |
IN |
是 |
用来计算下次作业运行时间的时间表达式,可以是interval表达式,也可以是sysdate加上一个numeric值(例如:sysdate+1.0/24)。如果为空值或字符串"null"表示只执行一次,执行后JOB状态STATUS变成’d’ 不再执行。 |
Job |
integer |
OUT |
否 |
作业号。范围为1~32767。当使用select调用pkg_service.job_submit时,该参数可以省略。 |
示例:
SELECT PKG_SERVICE.JOB_SUBMIT(NULL, 'call pro_xxx();',
to_date('20180101','yyyymmdd'),'sysdate+1'); SELECT PKG_SERVICE.JOB_SUBMIT(NULL,
'call pro_xxx();', to_date('20180101','yyyymmdd'),'sysdate+1.0/24'); CALL
PKG_SERVICE.JOB_SUBMIT(NULL, 'INSERT INTO T_JOB VALUES(1); call pro_1(); call
pro_2();', add_months(to_date('201701','yyyymm'),1), 'date_trunc(''day'',SYSDATE)
+ 1 +(8*60+30.0)/(24*60)' ,:jobid); SELECT PKG_SERVICE.JOB_SUBMIT (101,
'insert_msg_statistic1;', sysdate, 'sysdate+3.0/24');
PKG_SERVICE.JOB_UPDATE
存储过程UPDATE修改定时任务的属性,包括任务内容、下次执行时间、执行间隔。
PKG_SERVICE.JOB_UPDATE函数原型为:
PKG_SERVICE.JOB_UPDATE( id IN BIGINT, next_time IN TIMESTAMP, interval_time IN TEXT, content IN TEXT);
参数 | 类型 | 入参/出参 | 是否可以为空 | 描述 |
---|---|---|---|---|
id |
integer |
IN |
否 |
指定的作业号。 |
next_time |
timestamp |
IN |
是 |
下次运行时间。如果该参数为空值,则不更新指定Job的next_time值,否则更新指定Job的next_time值。 |
interval_time |
text |
IN |
是 |
用来计算下次作业运行时间的时间表达式。如果该参数为空值,则不更新指定Job的interval_time值;如果该参数不为空值,会校验interval_time是否为有效的时间类型或interval类型,则更新指定Job的interval_time值。如果为字符串"null"表示只执行一次,执行后Job状态STATUS变成’d’ 不再执行。 |
content |
text |
IN |
是 |
执行的存储过程名或者sql语句块。如果该参数为空值,则不更新指定Job的content值,否则更新指定Job的content值。 |
示例:
CALL PKG_SERVICE.JOB_UPDATE(101,'call userproc();', sysdate, 'sysdate +
1.0/1440'); CALL PKG_SERVICE.JOB_UPDATE(101, 'insert into tbl_a
values(sysdate);', sysdate, 'sysdate + 1.0/1440');
PKG_SERVICE.SUBMIT_ON_NODES
存储过程SUBMIT_ON_NODES创建一个所有CN/DN上的定时任务,仅sysadmin有此权限。
PKG_SERVICE.SUBMIT_ON_NODES函数原型为:
PKG_SERVICE.SUBMIT_ON_NODES( node_name IN TEXT, database IN TEXT what IN TEXT, next_date IN TIMESTAMP DEFAULT sysdate, job_interval IN TEXT DEFAULT 'null', job OUT INTEGER)
参数 | 类型 | 入参/出参 | 是否可以为空 | 描述 |
---|---|---|---|---|
node_name |
text |
IN |
否 |
指定作业的执行节点,当前仅支持值为’ALL_NODE’(在所有节点执行)与’CCN’(在central coordinator执行)。 |
database |
text |
IN |
否 |
集群作业所使用的database,节点类型为’ALL_NODE’时仅支持值为’postgres’。 |
what |
text |
IN |
否 |
要执行的SQL语句。支持一个或多个‘DML’,‘匿名块’,‘调用存储过程的语句’或3种混合的场景。 |
nextdate |
timestamp |
IN |
否 |
下次作业运行时间。默认值为当前系统时间(sysdate)。如果是过去时间,在提交作业时表示立即执行。 |
job_interval |
text |
IN |
否 |
用来计算下次作业运行时间的时间表达式,可以是interval表达式,也可以是sysdate加上一个numeric值(例如:sysdate+1.0/24)。如果为空值或字符串"null"表示只执行一次,执行后Job状态STATUS变成’d’不再执行。 |
Job |
integer |
OUT |
否 |
作业号。范围为1~32767。当使用select调用dbms.submit_on_nodes时,该参数可以省略。 |
示例:
select pkg_service.submit_on_nodes('ALL_NODE', 'postgres', 'select capture_view_to_json(''dbe_perf.statement'', 0);', sysdate, 'interval ''60 second''');
select pkg_service.submit_on_nodes('CCN', 'postgres', 'select capture_view_to_json(''dbe_perf.statement'', 0);', sysdate, 'interval ''60 second''');
PKG_SERVICE.ISUBMIT_ON_NODES
ISUBMIT_ON_NODES与SUBMIT_ON_NODES语法功能相同,但其第一个参数是入参,即指定的作业号,SUBMIT最后一个参数是出参,表示系统自动生成的作业号。仅sysadmin有此权限。
JOB的使用示例
3
创建测试表
gaussdb@postgres> create table t_job (value TIMESTAMP);
CREATE TABLEgaussdb@postgres> insert into t_job values(sysdate);
INSERT 0 1gaussdb@postgres> select * from t_job;
+---------------------+
| value |
|---------------------|
| 2021-10-09 04:36:20 |
+---------------------+
SELECT 1
创建任务,每一分钟插入一条记录
gaussdb@postgres> select pkg_service.job_submit(null, 'insert into t_job values(sysdate);',sysdate,'sysdate + 1/1440');
+--------------+
| job_submit |
|--------------|
| 15566 |
+--------------+
SELECT 1
检查Job运行结果
gaussdb@postgres> select * from t_job;
+---------------------+
| value |
|---------------------|
| 2021-10-09 04:36:20 |
| 2021-10-09 04:40:54 |
| 2021-10-09 04:41:54 |
| 2021-10-09 04:42:54 |
+---------------------+
SELECT 4
从系统视图中检查Job运行情况
gaussdb@postgres> select job_id,dbname,start_date,next_run_date,interval,failure_count from pg_job;
+----------+----------+----------------------------+---------------------+------------------+-----------------+
| job_id | dbname | start_date | next_run_date | interval | failure_count |
|----------+----------+----------------------------+---------------------+------------------+-----------------|
| 15566 | postgres | 2021-10-09 04:40:54.072363 | 2021-10-09 04:56:54 | sysdate + 1/1440 | 0 |
+----------+----------+----------------------------+---------------------+------------------+-----------------+
SELECT 1
Time: 0.089s
gaussdb@postgres> select * from pg_catalog.pg_job_proc pjp where job_id=15566;
+----------+------------------------------------+
| job_id | what |
|----------+------------------------------------|
| 15566 | insert into t_job values(sysdate); |
+----------+------------------------------------+
SELECT 1
Time: 0.089s
修改为2分钟执行一次
gaussdb@postgres> select pkg_service.job_update(15566,null,'sysdate + 2/1440',null);
+--------------+
| job_update |
|--------------|
| |
+--------------+
SELECT 1
检查修改情况和运行结果
[gaussdb@postgres> select job_id,interval from pg_job where job_id=15566;
+----------+------------------+
| job_id | interval |
|----------+------------------|
| 15566 | sysdate + 2/1440 |
+----------+------------------+
SELECT 1](<gaussdb@postgres%3E select * from t_job;
+---------------------+
| value |
|---------------------|
| 2021-10-09 04:36:20 |
| 2021-10-09 04:40:54 |
| 2021-10-09 04:41:54 |
| 2021-10-09 04:42:54 |
| 2021-10-09 04:43:54 |
| 2021-10-09 04:44:54 |
| 2021-10-09 04:45:54 |
| 2021-10-09 04:46:54 |
| 2021-10-09 04:47:54 |
| 2021-10-09 04:48:54 |
| 2021-10-09 04:49:54 |
| 2021-10-09 04:50:54 |
| 2021-10-09 04:51:54 |
| 2021-10-09 04:52:54 |
| 2021-10-09 04:53:54 |
| 2021-10-09 04:54:54 |
| 2021-10-09 04:55:54 |
| 2021-10-09 04:56:54 |
| 2021-10-09 04:57:54 |
| 2021-10-09 04:58:54 |
| 2021-10-09 04:59:54 |
| 2021-10-09 05:00:55 |
| 2021-10-09 05:01:56 | <---
| 2021-10-09 05:03:57 | <--- 开始间隔2分钟
+---------------------+
SELECT 24
Time: 0.088s
gaussdb@postgres> select job_id,interval,next_run_date from pg_job where job_id=15566;
+----------+------------------+---------------------+
| job_id | interval | next_run_date |
|----------+------------------+---------------------|
| 15566 | sysdate + 2/1440 | 2021-10-09 05:05:57 |
+----------+------------------+---------------------+
SELECT 1
Time: 0.078s>
禁用和启用任务
禁用和启用都是同样的函数pkg_service.job_finish,传入不同的参数表示是禁用还是启用。
gaussdb@postgres> select pkg_service.job_finish(15566,true,null);
+--------------+
| job_finish |
|--------------|
| |
+--------------+
SELECT 1
Time: 0.089s
gaussdb@postgres> select job_id,next_run_date,job_status from pg_job where job_id=15566;
+----------+---------------------+--------------+
| job_id | next_run_date | job_status |
|----------+---------------------+--------------|
| 15566 | 4000-01-01 00:00:00 | d |
+----------+---------------------+--------------+
SELECT 1
Time: 0.075s
gaussdb@postgres> select pkg_service.job_finish(15566,false,null);
+--------------+
| job_finish |
|--------------|
| |
+--------------+
SELECT 1
Time: 0.091s
gaussdb@postgres> select job_id,next_run_date,job_status from pg_job where job_id=15566;
+----------+---------------------+--------------+
| job_id | next_run_date | job_status |
|----------+---------------------+--------------|
| 15566 | 4000-01-01 00:00:00 | s |
+----------+---------------------+--------------+
SELECT 1
Time: 0.080s
可以看到如果重新启用任务的时候,没有指定下次运行时间,那么下次运行时间会始终保持在4000年,意味着仍然不会启动,所以如果禁用任务之后再重新启动,需要手动显式指定下次运行时间。
gaussdb@postgres> select pkg_service.job_finish(15566,false,sysdate);
+--------------+
| job_finish |
|--------------|
| |
+--------------+
SELECT 1
Time: 0.088s
gaussdb@postgres> select job_id,next_run_date,job_status from pg_job where job_id=15566;
+----------+---------------------+--------------+
| job_id | next_run_date | job_status |
|----------+---------------------+--------------|
| 15566 | 2021-10-09 05:16:22 | s |
+----------+---------------------+--------------+
SELECT 1
Time: 0.086s
删除任务
gaussdb@postgres> select pkg_service.job_cancel(15566);
+--------------+
| job_cancel |
|--------------|
| |
+--------------+
SELECT 1
Time: 0.082s
gaussdb@postgres> select job_id,next_run_date,job_status from pg_job where job_id=15566;
+----------+-----------------+--------------+
| job_id | next_run_date | job_status |
|----------+-----------------+--------------|
+----------+-----------------+--------------+
SELECT 0
Time: 0.086s
gaussdb@postgres> select * from pg_catalog.pg_job_proc pjp where job_id=15566;
+----------+--------+
| job_id | what |
|----------+--------|
+----------+--------+
SELECT 0
Time: 0.087s
墨天轮原文链接:https://www.modb.pro/db/137362?sjhy(复制到浏览器或者点击“阅读原文”立即查看)
关于作者
刘旭,2005开始接触数据库,2014年加入云和恩墨,从事过Oracle数据库优化、SQL审核和产品开发。现阶段主要参与MogDB数据库的测试和文档编写等相关工作。
END
由中国DBA联盟和墨天轮主办的 2021数据技术嘉年华 将于11月19日-20日在北京丽都皇冠假日酒店盛大召开。
大会门票限时0元领取
扫描下方的二维码即可!
如何在openGauss 2.1.0中使用Job?相关推荐
- 关于如何在ASP.NET 2.0中定制Expression Builders
expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 在ASPX页里只要使用$符号就可以访问到,你定制的属性了. 例如我们看个例子: ...
- linux 7 tmpfs,技术|如何在RHEL/CentOS 7.0中使用tmpfs
今天我们来谈谈 Centos 7 中的一个文件系统tmpfs,这是一个将所有文件和文件夹写到虚拟内存中而不是实际写到磁盘中的虚拟文件系统.这意味中tmpfs中所有的内容都是临时的,在tmpfs卸载.系 ...
- 本地化在ASP.NET 2.0中的实现
这是来自在CodeGuru上的一篇文章,主要讲述了如何在ASP.NET 2.0中实现本地化的问题,而且文中对于一些常用术语以及资源文件在ASP.NET 2.0中的用法给出了很多说明,是初学者学习的一篇 ...
- ASP.NET 2.0中如何连接到Mysql(转)
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 最近对mysql比较感兴 ...
- .NET Core 3.0中的Cookie身份验证
目录 介绍 先决条件 创建Web应用程序的步骤 集成Cookie身份验证 Startup.cs文件的代码更改 将User.cs文件添加到Model文件夹 使用新的操作方法更新HomeControlle ...
- [转]在.NET CF2.0中调用DirectShow来处理视音频数据
[转]在.NET CF2.0中调用DirectShow来处理视音频数据 转自:http://www.winbile.net/bbs/forums/threads/1000586.aspx 于渊 200 ...
- 如何在 vue-cli v3.0 中使用 SCSS/SASS
在项目中使用 SCSS/SASS 进行样式编写无疑会节省很多开发样式的时间.关于如何在 vue-cli v3.0 中使用 SCSS/SASS,这里提供三种方案.前提是在使用 vue-cli 生成项目时 ...
- 如何在Axure 9.0 中使用echarts
如何在Axure 9.0 中使用echarts 在需要插入echarts的页面中交互事件 -> 页面载入时 -> 打开链接 ,加入如下代码,插入echats代码. javascript: ...
- [Flash开发笔记] 如何在as2.0中使用自定义类事件
as2编程中,我们通常要处理一些异步加载的数据,有点类似ajax中的callback,即我们不知道何时数据才会返回,并且只有当数据返回时,执行我们定义的操作. 在flash6及以前,我们会常常 ...
最新文章
- 本地搭建Hadoop伪分布式环境之四:开启搭建Hadoop2.4.0之旅
- 3.1 目标定位-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
- 超微服务器硬盘红灯_硬盘亮红灯服务器崩溃的解决方法
- java停车收费系统 源码开源_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统
- 部署及配置Lync Server 2013 监控功能
- spring观察者模式_Spring事件的观察者模式
- Datepicker
- ps发光插件_PS插件自定义区域发光真实辉光插件 Oniric Glow Generator for Photoshop【资源分享1444】...
- 什么是Viewport Meta(width详解)及在手机上的应用
- object类型replace掉$、转换成float、运算
- QQ空间面试题放送,速度教科书式扑街补救offer!
- 亡命逃窜---三维搜索
- 光流(四)--Kanade-Lucas-Tomasi(KLT)目标跟踪
- grub4dos初级教程-入门篇(Z)
- 【软考】2019 上半年软件设计师 下午真题及答案
- 960H 、SDI和百万高清,谁会率先出局?
- 汉语词频统计工具java_中文分词词频统计工具_python 结巴_Java开源中文分词类库分类列表...
- 对话王劲:无人驾驶每天能救500多条人命 | AI英雄
- 运维工程师必备的认证【红帽liunx-RHCE 8】
- 云原生 - 负载均衡(SLB)多可用区
热门文章
- Java 并发(JUC 包-02)
- 使用projectx / os和Raspberry Pi托管您自己的电子邮件
- 开源战略游戏源码_开源的历史告诉我们关于战略优势的知识
- linux急救模式_抢救Linux! Windows XP支持今天终止
- 用一个案例介绍jQuery插件的使用和写法
- addEventListener方法与on事件的区别
- CSS 文本方向 direction属性
- flutter和webapp_Flutter 适配移动端和web不同尺寸
- 信号与槽是如何实现的_如何解决wifi信号不好,实现全面覆盖
- 浏览器安全检查己通过_Edge浏览器(Chromium)——从XSS到接管网页