• KingbaseES数据库 kdb_schedule 自动定时任务


    KingbaseES数据库 kdb_schedule 自动定时任务

    前言

    人大金仓数据库的自动定时任务是类似于Oracle的,是使用一个扩展插件kdb_schedule来完成的。 kdb_schedule又该如何使用呢?

    一 安装插件 kdb_schedule

    1. 添加kdb_schedule

    kdb_schedule插件是人大金仓数据库KingbaseES V8R6 自带的插件,不需要自己下载,但是我们需要把他添加到参数中:
    在 数据库的安装目录下找到kingbase.conf 文件修改shared_preload_libraries参数,把kdb_schedule添加到里面。

    shared_preload_libraries = 'kdb_schedule' 
    
    • 1

    在这里插入图片描述

    2. 修改kdb_schedule所需参数:

    kdb_schedule的参数也是需要在kingbase.conf 文件修改,直接添加就行

    1. job_queue_processes 允许用户启动的最大并发数,当其值设置为0时,表示不启动自动作业功能,默认为0,不开启自动作业。
    2. sys_job.log_level 用于设置JOB后台进程的日志级别,更改后需要重新加载配置文件,可选项:LOG_ERROR,LOG_WARNING,LOG_DEBUG,默认为LOG_ERROR。
    3. sys_job.poll_time 用于设置轮询系统表间隔时间,单位秒,默认值为10秒。

    命令行执行:

    alter system set job_queue_processes=5;
    
    • 1

    3. 重启数据库

    systemctl stop kingbase 停止数据库
    systemctl start kingbase 启动数据库
    
    • 1
    • 2

    因为加载kdb_schedule是需要重启数据库的

    4. 加载kdb_schedule插件

    create extension kdb_schedule;
    
    • 1

    如果这部报错,可以查看此版本的KingbaseES是否带了这个插件。

    select * from pg_available_extensions;
    
    • 1

    在这里插入图片描述

    二 dbms_scheduler

    2.1 创建program

    创建program命令

    begin ;
      call  dbms_scheduler.create_program(program_name        => 'prog_01-cs',
                                    program_type        => 'PLSQL_BLOCK',        
                                    program_action      => 'call hrmw.p_test()',
                                    acconnstr           => 'user=postgres dbname=cs port=6666 password=postgres123',
                                    acdbname            => 'test',
                                    number_of_arguments => 0,
                                    enabled             => true,
                                    comments            => 'test program');
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    成功创建program后,查看结果:

    select * from kdb_schedule.kdb_action;
    
    • 1

    参数说明

    参数描述
    program_name程序的名字。
    program_type程序的类型。有下列类 型:PLSQL_BLOCK、STORED_存储过程、SQL_SCRIPT、 EXECUTABLE、EXTERNAL_SCRIPT、BACKUP_SCRIPT
    program_action程序的动作。
    acconnstr数据库连接串。
    acdbname数据库名称。
    number_of_arguments程序动作的参数,暂不支持, 0为默认值。
    enabled程序的状态,true启动状态,false禁用状态。
    comments程序的注释信息。

    删除program

    DBMS_SCHEDULER.DROP_PROGRAM(
            program_name TEXT,
            force BOOLEAN DEFAULT FALSE);
    
    • 1
    • 2
    • 3
    call dbms_scheduler.drop_program('prog_01-cs', true);
    
    • 1
    参数描述
    program_name程序的名字。
    force暂不支持,默认值为false。

    说实话,如果你没关联,直接在kdb_schedule.kdb_action上删除相应记录就行了。

    2.2 创建Schedule

    begin ;
      call dbms_scheduler.create_schedule(schedule_name   => 'schedule_01',
                                     start_date      => now(),
                                     repeat_interval => 'freq=daily;byhour=10;interval=1',
                                     end_date        => null,
                                     comments        => 'test schedule');
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    成功创建Schedule后,查看结果:

    select * from kdb_schedule.kdb_schedule;
    
    • 1

    参数说明

    参数描述
    schedule_name调度程序的名字。
    start_date调度程序的开始时间
    repeat_interval调度程序的间隔时间
    end_date调度程序的结束时间
    comment调度程序的注释信息

    删除 Schedule

    DBMS_SCHEDULER.DROP_SCHEDULE(
            schedule_name TEXT,
            force BOOLEAN DEFAULT FALSE);
    
    • 1
    • 2
    • 3
    call DBMS_SCHEDULER.DROP_SCHEDULE('schedule1', true);
    
    • 1
    参数描述
    schedule_name调度程序的名字。
    force暂不支持,默认值为false。

    2.3 创建Job

    begin  
     call dbms_scheduler.create_job(job_name         => 'job_01',
                                program_name     => 'prog_01-cs',
                                schedule_name    => 'schedule_01',
                                job_class        => 'routine maintenance',
                                enabled          => true,
                                auto_drop        => true,
                                comments         => 'test job',
                                credentail_name  => null,
                                destination_name => null);
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    成功创建Job后,查看结果:

    select * from kdb_schedule.kdb_schedule_job;
    select * from kdb_schedule.kdb_job_action;
    
    • 1
    • 2

    参数说明

    参数描述
    job_namejob的名字。
    program_name程序的名字。
    schedule_name调度程序的名字。
    job_classjob的类型,默认Routine Maintenance。
    enabledjob的状态。true启用,false禁用
    auto_dropjob完成后自动删除,暂不支持,默认true
    commentjob的注释信息
    credentail_name暂不支持,默认为NULL
    destination_name暂不支持,默认为NULL

    四 查看 kdb_job表:

    select jobid,jobname,jobenabled,joblastrun,jobnextrun,jobrepeattimes from kdb_job;
    
    • 1

    日历(设置时间)

    参数说明

    参数描述
    FREQ重复时间的类型。 这里有yearly、monthly、weekly、daily、hourly、minutely
    INTERVAL重复的频率,默认值是1。
    BYMONTH指定月份。
    BYMONTHDAY指定一月中的某一天。
    BYHOUR指定一天中的某一个小时。
    BYBYMINTUE指定一个小时中的秒一分。
    BYSECOND指定一分钟内的某一秒。

    具体示例

    每天早上10点
    FREQ =daily,BYHOUR=10,BYBYMINTUE=0,BYSECOND=0;
    每隔7天的早上10点
    FREQ =daily,INTERVAL=7,BYHOUR=10,BYBYMINTUE=0,BYSECOND=0;
    每年10月1号早上10点
    FREQ =yearly,BYMONTH=10,BYMONTHDAY=1,BYHOUR=10,BYBYMINTUE=0,BYSECOND=0;

    备注

    插件 kdb_schedule 目前是只支持Oracle版KingbaseES,不支持pg版本的。

    查看数据库兼容:

    show database_mode;
    
    • 1

    这里出现pg是指postgresql数据库 ,出现oracle是oracle版本的KingbaseES V8R6,一等要注意
    pg版本的目前是有这功能的,但是他报错,不支持!不支持!不支持!
    报错如下:
    1:创建Job时报错;

    call dbms_scheduler.create_job(job_name => ‘job_01’,
    program_name => ‘prog_01-cs’,
    schedule_name => ‘schedule_01’,
    job_class => ‘routine maintenance’,
    enabled => true,
    auto_drop => true,
    comments => ‘test job’,
    credentail_name => null,
    destination_name => null)

    错误: 函数 get_next_date(timestamp without time zone, unknown, timestamp without time zone, cstring) 不存在
    LINE 2: …bjobid, job_name, cjjclid, enabled, now(), now(), get_next_d…
    ^
    HINT: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
    QUERY: insert into kdb_job(jobid, jobname, jobjclid, jobenabled, jobcreated, jobchanged, jobnextrun, jobrepeattimes, jobdesc, jobdbname)
    select subjobid, job_name, cjjclid, enabled, now(), now(), get_next_date(scstart, null, scend, screpeat_interval::cstring), 0, comments, current_database()
    from kdb_schedule.kdb_schedule where scname=schedule_name
    CONTEXT: 在SQL语句的第37行的PL/pgSQL函数dbms_scheduler.create_job(text,text,text,text,boolean,boolean,text,text,text)

    在这里插入图片描述

    2:运用dbms_job.submit()函数时报错

    call dbms_job.submit(jobid, 'CREATE TABLE T1(A int)', now(), 'Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10', false, 0, false);
    
    • 1

    call dbms_job.submit(jobid, ‘CREATE TABLE T1(A int)’, now(), ‘Freq=daily;BYHOUR=10;BYMINUTE=10;BYSECOND=10’, false, 0, false)
    错误: 字段 “jobid” 不存在
    LINE 1: call dbms_job.submit(jobid, ‘CREATE TABLE T1(A int)’, now(),…
    ^

    在这里插入图片描述

    后记

    如果本文章有何错误,请您评论中指出,或联系我,我会改正,如果您觉得这篇文章有用,请帮忙一键三连,让更多的人看见,谢谢
    作者 yang_z_1 csdn博客地址: https://blog.csdn.net/yang_z_1?type=blog

  • 相关阅读:
    Hive、SparkSQL是如何决定写文件的数量的?
    React Native实现Toast轻提示和loading
    springboot集成Quartz定时任务组件
    OpenFeign服务接口调用
    RK3568 kernel阶段播放开机动画方案实现
    【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
    分布式 PostgreSQL 集群(Citus)官方示例 - 多租户应用程序实战
    Day25_8 Java学习之UDP通信程序
    强大的表单/流程设计器:Oracle Primavera Unifier uDesigner(更新中)
    采用Linux 6.5 内核的Manjaro Linux 23.0正式上线
  • 原文地址:https://blog.csdn.net/yang_z_1/article/details/128131709