如何在openGauss 2.1.0中使用Job
如何在 openGauss 2.1.0 中使用 Job
如何在 openGauss 2.1.0 中使用 Job
Job 类似 unix 中的 crontab,有定时执行的功能,可以在指定的时间点或每天的某个时间点等自行执行任务。在各类系统使用运行过程中,经常会遇到需要定时完成的任务,比如定时更新数据,定时统计数据生成报表等等,这些工作都可以使用 Job 来完成。在 openGauss 2.1.0 中,提供了以下接口来实现管理 Job:
接口描述
接口名称
描述
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
提交一个任务到所有节点,作业号由用户指定
接口定义和使用示例
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 +(860+30.0)/(2460)' ,: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 的使用示例
创建测试表
gaussdb@postgres> create table t_job (value TIMESTAMP);
CREATE TABLE
gaussdb@postgres> insert into t_job values(sysdate);
INSERT 0 1
gaussdb@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 1Time: 0.089sgaussdb@postgres> select * from pg_catalog.pg_job_proc pjp where job_id=15566;
+----------+------------------------------------+|
job_id | what |
|----------+------------------------------------|
| 15566 | insert into t_job values(sysdate);
|+----------+------------------------------------+
SELECT 1Time: 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 24Time: 0.088sgaussdb@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 1Time: 0.078s>
禁用和启用任务
禁用和启用都是同样的函数 pkg_service.job_finish,传入不同的参数表示是禁用还是启用。
gaussdb@postgres> select pkg_service.job_finish(15566,true,null);
+--------------+| job_finish ||--------------|| |+--------------+
SELECT 1Time: 0.089sgaussdb@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 1Time: 0.075sgaussdb@postgres> select pkg_service.job_finish(15566,false,null);+--------------+| job_finish ||--------------|| |+--------------+SELECT 1Time: 0.091sgaussdb@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 1Time: 0.080s
可以看到如果重新启用任务的时候,没有指定下次运行时间,那么下次运行时间会始终保持在 4000 年,意味着仍然不会启动,所以如果禁用任务之后再重新启动,需要手动显式指定下次运行时间。
gaussdb@postgres> select pkg_service.job_finish(15566,false,sysdate);+--------------+| job_finish ||--------------|| |+--------------+SELECT 1Time: 0.088sgaussdb@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 1Time: 0.086s
删除任务
gaussdb@postgres> select pkg_service.job_cancel(15566);+--------------+| job_cancel ||--------------|| |+--------------+SELECT 1Time: 0.082sgaussdb@postgres> select job_id,next_run_date,job_status from pg_job where job_id=15566;+----------+-----------------+--------------+| job_id | next_run_date | job_status ||----------+-----------------+--------------|+----------+-----------------+--------------+SELECT 0Time: 0.086sgaussdb@postgres> select * from pg_catalog.pg_job_proc pjp where job_id=15566;+----------+--------+| job_id | what ||----------+--------|+----------+--------+SELECT 0Time: 0.087s
opengauss
如何在openGauss 2.1.0中使用Job的更多相关文章
- 【转】如何在ASP.NET 2.0中定制Expression Builders
expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 在ASPX页里只要使用$符号就可以访问到,你定制的属性了. 例如我们看个例子: ...
- 如何在Axure RP 8.0 中打开页面指定的动态面板
有时在制作原型的时候,需要打开另一个页面指定的动态面板,研究了一下分享给大家 方法/步骤 1.打开Axure RP 8.0,在index面面中拖出来一个按钮,写上文字"打开page1/sta ...
- 在.NET 6.0中使用不同的托管模型
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本章是<定制ASP NET 6.0框架系列文章>的第六篇.在本章中,我 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(一)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- 如何在Cocos2D 1.0 中掩饰一个精灵(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...
- 如何在 Net6.0 中对 WebAPI 进行 JWT 认证和授权
一.简介 我们做微服务开发,或者说做分布式开发,有一项技术我们是避不开的,那就是WebAPI,在 Net6.0中,有两类 WebAPI,一类是极简 WebAPI,它砍掉了很多冗余的东西,更纯粹的是做 ...
- 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]
如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...
- 【IHttpHandler】在ASP.Net2.0中使用UrlRewritingNet实现链接重写
很多时候我们需要链接转向(Url Rewriting),例如二级域名转向.文章访问链接等场合. 让我们看两个例子: 1 你现在看到的当前作者的博客园的域名: http://jx270.cnblogs. ...
- 在VC6.0中能不能使用Duilib界面库呢?
Duilib库的源代码是在vs2010下编译的,一般适用于vs2008及以上的版本开发使用,那么duilib能不能在vc6.0的工程中使用呢?如何在vc6.0中使用duilib库呢? 今天,由于工作要 ...
随机推荐
- Finder Error code -36 “访达” 错误代码-36
导致这个问题的原因是你的iCloud (iCloud和iCloud Drive是不一样的) 快满了. 如果你想解决这个问题,有以下三个方法: 1.多买苹果iCloud.(是的,苹果现在太恶心了.但这是 ...
- 【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
问题描述 在App Service for Linux的环境中,我们能通过SSH进入到Container的环境中,并且可以通过在kudu站点的URL后面添加 /newui 打开一个适用于Linux环境 ...
- 如何使用 perf 分析 splice 中 pipe 的容量变化
如何使用 perf 分析 splice 中 pipe 的容量变化 这个文章为了填上一篇文章的坑的,跟踪内核函数本来是准备使用 ebpf 的,但是涉及到了低内核版本,只能使用 kprobe 了. 恰好, ...
- C++异常的基本概念与用法
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try{}内写可能会抛出异常的代码.catch(类型){处理} 写异常类型和异常处理 抛出 ...
- pandas DataFrame内存优化技巧:让数据处理更高效
Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力.灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱. 然而,随着数据量的不断增长,如何高效.合理 ...
- Postman全网最详细使用教程
Postman全网最详细使用教程 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「postman」, 获取postman插件和安装程序: http://www.jav ...
- javascript之call用法实例
call方法: 调用一个对象的一个方法,以另一个对象替换当前对象. 直接上代码: js例子:在A类中调用B类数据 function ClassA(){ this.name = 'ClassA' ...
- Java基础知识篇02——Java基本语法
一.数据类型 定义: 就是用了保存数据的一个类型,一种数据类型,只能保存该类型数据值 作用: 只有了解数据类型,才能选择合适的类型存放数据,才能更好的利用计算机硬件资源(内存和硬盘等). 不同的数据类 ...
- Performance Improvements in .NET 8 -- JIT部分翻译
相关视频 动态PGO 基准测试设置 在本文中,我包括微基准测试以突出讨论的各个方面.其中大部分基准测试都是使用BenchmarkDotNet v0.13.8实现的,除非另有说明,否则每个基准测试都有一 ...
- String类为什么要用final修饰?
final修饰符的意义? https://www.cnblogs.com/loren-Yang/p/13380318.html String类被实现的目标是什么? 效率和安全 如何实现期望? 参考文献 ...