KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用。kdb_schedule 提供了三个Schema :dbms_job and dbms_scheduler 分别类似于 oracle 的 dbms_job 和 dbms_schedule 包,数据字典信息放于kdb_schedule 模式下。

一、通过dbms_job管理Job

1、创建Job

create table d_test(tid varchar2(64), insdate date);

create or replace procedure p_test() as
begin
insert into d_test values(to_char(sysdate, 'yyyymmddhh24miss'), sysdate);
commit;
end;
/ DECLARE
v_jobid NUMBER;
BEGIN
dbms_job.submit(v_jobid, 'call p_test()', now(), 'Freq=Minutely;Interval=1');
COMMIT;
END;
/

2、查询Job

test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------------------------------------------+------------+------------+-------------------------------+----------------
1 | internal_job1:2021-06-22 08:11:39.797681+08 | f | | 2021-06-22 08:11:39.797681+08 | 0

可以看到,Job 创建后,默认的状态是 jobenabled=false,也就是实际没有启用。

Note:早期版本 kdb_job 表是schema kdb_schedule下,后面移到pg_catalog schema下。

3、启用Job

job 创建后,默认是 broken(disabled) ,需要enable

test=# call dbms_job.broken(1,false);
CALL
test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------------------------------------------+------------+------------+-------------------------------+----------------
1 | internal_job1:2021-06-22 08:11:39.797681+08 | t | | 2021-06-22 08:11:39.797681+08 | 0

enable job 后,等待一会再查,发现实际job 还是没有运行。这是为什么?这是因为kdb_schedule 后台进程没有启动。启动后台进程后,再查,可以看到job已经运行了。

test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------------------------------------------+------------+-------------------------------+------------------------+----------------
1 | internal_job1:2021-06-22 08:11:39.797681+08 | t | 2021-06-22 08:22:39.062009+08 | 2021-06-22 08:23:39+08 | 0
(1 row)

4、Job实际上也是Schedule

test=#  select * from kdb_schedule.kdb_schedule;
scid | scname | scdesc | scenabled | scstart | scend | screpeat_interval
------+--------+--------+-----------+----------------------------+-------+--------------------------
2 | | | t | 2021-06-22 10:11:25.586148 | | Freq=Minutely;Interval=1
(1 row) test=# select * from kdb_schedule.kdb_schedule_job;
sjid | sjscid | sjjobid | sjstatus | sjlasttime | sjnexttime
------+--------+---------+----------+------------+-------------------------------
2 | 2 | 1 | s | | 2021-06-22 10:11:25.586148+08

可以看到,通过dbms_job创建的job信息,同样会在kdb_schedule 和kdb_schedule_job 显示。

5、其他Job维护操作

--Job删除
test=# call dbms_job.remove(1);
CALL

二、启动kdb_schedule 进程

使用过Oracle的人都知道,Oracle数据库启动时,会运行多个ora_j000_xxx 进程,这些进程实际上就是用于运行Job 的。同样KINGBASE 也需要后台进程来运行job

[kingbase@dbhost03 ~]$ kdb_schedule "dbname=template1 user=system"

Note:kdb_schedule只需要运行一个,后面跟的数据库连接信息可以是任何一个数据库,不影响其他库job的使用。

三、通过dbms_scheduler管理Job

1、创建program

begin
dbms_scheduler.create_program(program_name => 'prog_01',
program_type => 'PLSQL_BLOCK',
program_action => 'call public.p_test()',
acdbname => 'test',
number_of_arguments => 0,
enabled => true,
comments => 'test program');
end;

这里有两个地方必须注意。'PLSQL_BLOCK' 必须大写,acdbname 必须指定。

acdbname 指明了action 所在的数据库,如果没有指定,默认指 kdb_schedule 运行时指定的数据库。成功创建program后,会有如下一行信息:

test=# select * from kdb_schedule.kdb_action;
acid | acname | acdesc | acenabled | ackind | accode | acconnstr | acdbname | acnextrun
------+---------+--------------+-----------+--------+----------------------+-----------+----------+-----------
7 | prog_01 | test program | t | s | call public.p_test() | | test |
(1 row)

2、创建Schedule

begin
dbms_scheduler.create_schedule(schedule_name => 'schedule_01',
start_date => now(),
repeat_interval => 'freq=minutely;interval=1',
end_date => null,
comments => 'test schedule');
end;

创建schedule 后,会有如下一行信息:

test=# select * from kdb_schedule.kdb_schedule;
scid | scname | scdesc | scenabled | scstart | scend | screpeat_interval
------+-------------+---------------+-----------+----------------------------+-------+--------------------------
7 | schedule_01 | test schedule | t | 2021-06-22 14:28:38.536823 | | freq=minutely;interval=1
(1 row)

3、创建Job

begin
dbms_scheduler.create_job(job_name => 'job_01',
program_name => 'prog_01',
schedule_name => 'schedule_01',
job_class => 'routine maintenance',
enabled => true,
auto_drop => true,
comments => 'test job',
credentail_name => null,
destination_name => null);
end;

创建后,下表会有相关记录信息,分别记录 job 与 schedule , 以及 job 与 action 之间的关系。

test=# select * from kdb_schedule.kdb_schedule_job;
sjid | sjscid | sjjobid | sjstatus | sjlasttime | sjnexttime
------+--------+---------+----------+------------+------------
7 | 7 | 1 | s | | test=# select * from kdb_schedule.kdb_job_action;
jaid | jajobid | jaacid | jastatus | jalasttime
------+---------+--------+----------+------------
7 | 1 | 7 | s |

具体的job信息,可以看 kdb_job:

test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------+------------+-------------------------------+------------------------+----------------
1 | job_01 | t | 2021-06-22 14:59:41.997986+08 | 2021-06-22 15:00:38+08 | 0
(1 row)

4、Enable and Disable Job

Job 创建时,可以指定enable or disable ,后续也可以手动修改。

begin
dbms_scheduler.disable(name => 'job_01');
end;
/ test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------+------------+-------------------------------+------------------------+----------------
1 | job_01 | f | 2021-06-22 15:06:42.303189+08 | 2021-06-22 15:07:38+08 | 0
(1 row) begin
dbms_scheduler.enable(name => 'job_01');
end;
/ test=# select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
jobid | jobname | jobenabled | joblastrun | jobnextrun | jobrepeattimes
-------+---------+------------+-------------------------------+------------------------+----------------
1 | job_01 | t | 2021-06-22 15:08:07.365179+08 | 2021-06-22 15:08:38+08 | 0
(1 row)

5、其他操作

begin
dbms_scheduler.drop_job(job_name => 'job_01');
end;
/ begin
dbms_scheduler.drop_schedule(schedule_name => 'schedule_01');
end;
/ begin
dbms_scheduler.drop_program(program_name => 'prog_01');
end;
/ begin
dbms_scheduler.run_job(job_name => 'job_01');
end;
/

四、故障排查

kdb_schedule.kdb_jobsteplog 记录了job 调用的具体信息,如果有错误的,jsloutput 会显示具体的错误信息。

Job And Schedule (V8R6C3)的更多相关文章

  1. Job And Schedule (V8R6C4)

    KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...

  2. [LeetCode] Course Schedule II 课程清单之二

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  3. [LeetCode] Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  4. POJ 1325 Machine Schedule——S.B.S.

    Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13731   Accepted: 5873 ...

  5. Spring Schedule 任务调度实现

    我们都知道任务调度可以用Quartz,但对于简单的定时任务,可以直接用Spring内置的Schedule来实现.可以由两种方式,注释+XML配置 注解方式: 注解也要先在sping.xml配置文件中配 ...

  6. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)

    在spring 中的新引入的task 命名空间.可以部分取代 quartz 功能,配置和API更加简单,并且支持注解方式. 第一步: 在Spring的相关配置文件中(applicationContex ...

  8. Schedule 学习

    现在做的项目都有用到Schedule,现在用一点时间来总结. 一.首先要到Nuget中下载Quartz.net. 二.下载下来了,你需要对它进行配置,使它能给你正常的使用. 三.在Global.asa ...

  9. Spring 4.x Task 和 Schedule 概述(代java配置)

    转载请注明https://zhangzhaoyu.github.io/2016/09/30/spring-task-and-schedule-deep-research/ 摘要 在很多业务场景中,系统 ...

随机推荐

  1. Javaweb-IDEA 中Maven的操作

    1. 在idea中使用Maven 启动idea 创建一个MavenWeb项目 3.等待项目初始化完毕 4. 观察maven仓库中多了哪些东西 5. idea中的maven设置 注意:idea项目创成功 ...

  2. 用Python爬取文章,并转PDF格式电子书

    wkhtmltopdf [软件],这个是必学准备好的,不然这个案例是实现不出来的 获取文章内容代码 (https://jq.qq.com/?_wv=1027&k=QgGWqAVF) 发送请求, ...

  3. React技巧之导入组件

    正文从这开始~ 总览 在React中,从其他文件中导入组件: 从A文件中导出组件.比如说,export function Button() {} . 在B文件中导入组件.比如说,import {But ...

  4. javascript基本属性访问对象的属性和方法

    var myName = "Shelley"; //字符串基本类型 alert(myName.length);  //隐式创建String对象,数值与myName相同,并执行len ...

  5. SSH隧道代理

    应用场景: A机器可以通过SSH连接到B机器,然后A想用B的身份访问B所在的资源(主要用于浏览器访问) 命令: A机器通过ssh与B建立连接,并暴露3128端口:ssh -N -D 127.0.0.1 ...

  6. 零基础学Java(7)大数

    大数 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中两个很有用的类:BigInteger和BigDecimal.这两个类可以处理包含任意长度数字序列的数值.BigInte ...

  7. 004 SpringSecurity验证规则

    SpringSecurity验证规则 SpringSecurity框架登录后,==在userDetails对象中,一定会有一个权限列表 == 登录用户对象的值可能是: {"authoriti ...

  8. Node.js精进(10)——性能监控(下)

    本节会重点分析内存和进程奔溃,并且会给出相应的监控方法. 本系列所有的示例源码都已上传至Github,点击此处获取. 一.内存 虽然在 Node.js 中并不需要手动的对内存进行分配和销毁,但是在开发 ...

  9. [Android开发学iOS系列] 语言篇: Swift vs Kotlin

    Swift vs Kotlin 这篇文章是想着帮助Android开发快速学习Swift编程语言用的. (因为这个文章的作者立场就是这样.) 我不想写一个非常长, 非常详尽的文章, 只是想写一个快速的版 ...

  10. 如何在Excel/WPS表格中批量查询顺丰快递信息?

    如何在Excel/WPS表格中批量查询顺丰快递信息? 上期我们讲了如何在Excel/WPS表格中批量查询快递信息(还不知道的小伙伴可以看这里:https://zhuanlan.zhihu.com/p/ ...