瀚高数据库安全版4.5.10及其以上版本使用pg_cron定时任务

文章目录

环境

系统平台:Linux x86-64 Red Hat Enterprise Linux 7

版本:4.5.10

文档用途

本文档主要介绍瀚高数据库安全版中如何使用pg_cron插件,数据库版本是4.5.10、4.5.11,pg_cron版本是1.6.2,该版本的pg_cron支持跨库创建定时任务。

详细信息

pg_cron是瀚高数据库中基于CRON的一个简单的作业调度程序,可以实现一些定时任务,例如定时执行vacuum、批处理、刷新物化视图等,同时支持跨库执行定时任务。下面介绍其详细的功能和使用。

一、参数介绍

参数名 功能 默认值 生效机制
cron.database_name 此参数指定定时任务存储于哪个库中,pg_cron支持跨库执行定时任务,所以可以统一使用highgo库管理多个业务库的定时任务。 highgo 重启生效
cron.use_background_workers 控制执行定时任务的方式,包括后台模式(on)和非后台模式(off)。后台模式是使用数据库内核提供的接口创建一个后台进程完成查询执行的操作,这种方式不需要传入用户密码即可执行sql语句;非后台模式是开启一个进程使用libpq提供的c函数连接到数据库执行sql语句,此种方式需要指定用户名、密码、数据库。 on 重启生效
cron.timezone 时区参数,可以自定义时区,建议调整为PRC即东八区北京时间。 GMT时区 重启生效
cron.enable_superuser_jobs 允许超级用户调度定时任务。 on 重启生效
cron.host 连接的主机名,后台模式下该参数无效。 localhost 重启生效
cron.max_running_jobs 允许并行运行的最大定时任务数,不能超过数据库参数max_worker_processes的值。 5 重启生效
cron.launch_active_jobs 启动处于活跃状态的定时任务。 on reload生效
cron.log_run 在cron.job_run_details表中记录任务运行的详细信息。 on 重启生效
cron.log_statement 用日志记录运行的sql语句。 on 重启生效
cron.log_min_messages 控制哪些消息级别被写入到服务器日志。 warning reload生效

二、安装和配置

1.创建pg_cron之前,postgresql.auto.conf文件中配置如下参数

root@localhost \~# vi $PGDATA/postgresql.auto.conf

复制代码
shared_preload_libraries = '已配置的库文件, pg_cron'   # pg_cron依赖的预加载库,必须配置
cron.database_name = 'dbname'   # 配置创建pg_cron插件的数据库,例如highgo、testdb
cron.use_background_workers = 'on'
cron.timezone = 'PRC'
cron.max_running_jobs = 5   # 默认5,按需设定

2.系统用户root下重启数据库生效

sql 复制代码
[root@localhost ~]# pg_ctl restart

3.创建pg_cron插件

创建pg_cron插件需要关闭三权,不同版本的数据库关闭三权的方式不同,详细如下:

版本一:数据库版本是安全版4.5.10.3之前的版本,关闭三权需要重启

sql 复制代码
1)syssso登录数据库关闭三权
highgo=> select show_secure_param();  --如果hg_sepofpowers是off,表示三权已关闭,只执行第3)步即可
highgo=> select set_secure_param('hg_sepofpowers','off');

2)系统用户root下重启数据库
[root@localhost ~]# pg_ctl restart

3)sysdba创建pg_cron插件
cron_db=> create extension pg_cron;

4)syssso开启三权
highgo=> select set_secure_param('hg_sepofpowers','on');

5)系统用户root下重启数据库
[root@localhost ~]# pg_ctl restart

6)syssso确认三权已开启
highgo=> select show_secure_param(); --确认hg_sepofpowers变成on即可
sql 复制代码
版本二:数据库版本是安全版4.5.10系列中4.5.10.3及其之后的版本,支持临时关闭三权,无需重启
sql 复制代码
1)syssso关闭三权
highgo=> select show_secure_param();  --如果hg_sepv4中带有off,表示三权已关闭,只执行第2)步即可
highgo=> select set_secure_param('hg_sepv4','off');

2)sysdba创建pg_cron插件
cron_db=> create extension pg_cron;

3)syssso开启三权
highgo=> select set_secure_param('hg_sepv4','on');
highgo=> select show_secure_param(); --确认hg_sepv4中没有带off即可

版本三:数据库版本是安全版4.5.11及其之后的版本,支持临时关闭三权,无需重启

sql 复制代码
1)syssso关闭三权
highgo=> select show_secure_param();  --如果hg_sepenable是off,表示三权已关闭,只执行第2)步即可
highgo=> select set_secure_param('hg_sepenable','off');

2)sysdba创建pg_cron插件
cron_db=> create extension pg_cron;

3)syssso开启三权
highgo=> select set_secure_param('hg_sepenable','on');
highgo=> select show_secure_param(); --确认hg_sepenable变成on即可

4.sysdba把cron模式的usage权限赋给普通用户

sql 复制代码
cron_db=> grant usage on schema cron to 普通用户;

表的属主是普通用户时,对表的一些定时操作需要使用普通用户创建定时任务,因为sysdba用户对表没有读写权限

至此,pg_cron的配置和创建完成。

三、功能介绍

1.创建定时任务

1)pg_cron所在的数据库中创建定时任务,使用schedule函数

sql 复制代码
select cron.schedule('<任务名称>', '<定时计划>', '<定时任务>');
select cron.schedule('<定时计划>', '<定时任务>');

2)跨库创建定时任务,使用schedule_in_database函数

sql 复制代码
select cron.schedule_in_database('<任务名称>', '<定时计划>', '<定时任务>', '<指定数据库>', '<指定用户>', <活跃状态(默认true)>);

注①:如果任务名称已经创建过,那么会修改已有的任务而不创建新的。需要特别注意如果想创建新的定时任务,则一定要保证任务名称从未创建过,否则会覆盖已有任务。

注②:schedule_in_database函数需要使用sysdba执行

pg_cron的定时计划schedule的设置规则如下:

其中,pg_cron计划使用标准的CRON语法,*表示每个该时间运行,指定数字则表示仅在这个时间运行,如下所示。

复制代码
-- ┌───────────── 分钟 (0 - 59)
-- │ ┌────────────── 小时 (0 - 23)
-- │ │ ┌─────────────── 日期 (1 - 31)
-- │ │ │ ┌──────────────── 月份 (1 - 12)
-- │ │ │ │ ┌───────────────── 一周中的某一天 (0 - 6) (0 到 6 是 周日 到 周六,或者 使用名称; 7 也是周日)
-- │ │ │ │ │
-- *   *   *  *   *

示例:

sql 复制代码
--每分钟执行一次插入
select cron.schedule('每分钟执行一次插入','* * * * *','insert into public.t1(v) values(''test'' || clock_timestamp()::timestamp(0)::text);');

-- 每天上午9点40对表执行一次vacuum
select cron.schedule('每天上午9点40对表执行一次vacuum','40 09 * * *','vacuum analyze public.t1;');

--每周六的晚上23点执行一次vacuum
select cron.schedule('每周六的晚上23点执行一次vacuum','00 23 * * 6','vacuum analyze public.t1;');

--跨库创建定时任务,在cron_db_02库中每分钟执行一次插入
select cron.schedule_in_database('在cron_db_02库中每分钟执行一次插入','* * * * *','insert into public.t2(v) values(''test02'' || clock_timestamp()::timestamp(0)::text);','cron_db_02','cron_user_02');

2.查看定时任务

使用sysdba用户查询cron.job表,记录了所有的定时任务。

示例:

sql 复制代码
cron_db=# select * from cron.job;
 jobid |  schedule   |                                       command                                       | nodename  | nodeport |  database  |   username   | active |              jobname               
-------+-------------+-------------------------------------------------------------------------------------+-----------+----------+------------+--------------+--------+------------------------------------
     1 | * * * * *   | insert into public.t1(v) values('test' || clock_timestamp()::timestamp(0)::text);   | localhost |     5866 | cron_db    | cron_user    | t      | 每分钟执行一次插入
     2 | 00 22 * * * | vacuum analyze public.t1;                                                           | localhost |     5866 | cron_db    | cron_user    | t      | 每天晚上10点对表执行一次vacuum
     3 | 40 09 * * * | vacuum analyze public.t1;                                                           | localhost |     5866 | cron_db    | cron_user    | t      | 每天上午9点40对表执行一次vacuum
     4 | 00 23 * * 6 | vacuum analyze public.t1;                                                           | localhost |     5866 | cron_db    | cron_user    | t      | 每周六的晚上23点执行一次vacuum
     5 | * * * * *   | insert into public.t2(v) values('test02' || clock_timestamp()::timestamp(0)::text); | localhost |     5866 | cron_db_02 | cron_user_02 | t      | 在cron_db_02库中每分钟执行一次插入
(5 行记录)

3.修改定时任务

使用cron.alter_job函数修改定时任务,具体命令如下:

sql 复制代码
select cron.alter_job(<任务id>, '<定时计划>','<定时任务>','<指定数据库>', '<指定用户>', <活跃状态(boolean型)>)

注:需要使用sysdba执行

示例:

sql 复制代码
--调整job 3 的定时计划为每天10点10分
cron_db=# select cron.alter_job(3,'10 10 * * *');
 alter_job 
-----------
 
(1 行记录)
--查看定时计划已调整
cron_db=# select * from cron.job where jobid=3;
 jobid |  schedule   |          command          | nodename  | nodeport | database | username  | active |             jobname             
-------+-------------+---------------------------+-----------+----------+----------+-----------+--------+---------------------------------
     3 | 10 10 * * * | vacuum analyze public.t1; | localhost |     5866 | cron_db  | cron_user | t      | 每天上午9点40对表执行一次vacuum
(1 行记录)

4.查看定时任务执行情况

cron.job_run_details表记录了定时任务的执行情况,包括开始时间、结束时间、执行结果等。

示例:

sql 复制代码
cron_db=# select * from cron.job_run_details where jobid=1;
-[ RECORD 1 ]--+----------------------------------------------------------------------------------
jobid          | 1
runid          | 27
job_pid        | 2153
database       | cron_db
username       | cron_user
command        | insert into public.t1(v) values('test' || clock_timestamp()::timestamp(0)::text);
status         | succeeded
return_message | INSERT 0 1
start_time     | 2025-08-07 09:55:00.00438+08
end_time       | 2025-08-07 09:55:00.009281+08

5.删除定时任务

使用cron.unschedule函数,支持按照jobid和job名称删除。

按照job名称删除时,需要使用执行定时任务的用户删除,否则报错,而jobid可以使用sysdba用户删除,因有时也存在job名称为空的情况,所以推荐按照jobid删除。

示例:

sql 复制代码
cron_db=# select cron.unschedule(1);
 unschedule 
------------
 t
(1 行记录)

cron_db=> select cron.unschedule('每天上午9点40对表执行一次vacuum');
 unschedule 
------------
 t
(1 行记录)
相关推荐
●VON6 小时前
鸿蒙Flutter实战:分类管理页BottomSheet CRUD
数据库·flutter·华为·harmonyos·鸿蒙
Cosolar6 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
wanhengidc6 小时前
服务器租用有何优点
运维·服务器·安全·web安全
坤昱7 小时前
cfs调度类深入解刨——最新内核细节分析2
linux·服务器·cfs·cfs调度·eevdf调度·eevdf·kernel 7.1
艾莉丝努力练剑7 小时前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
海市公约7 小时前
Linux核心基础命令与权限管理实战指南
linux·运维·服务器·vim·权限管理·系统监控·命令行
企服AI产品测评局8 小时前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
cfm_29148 小时前
Redis数据安全性解析
数据库·redis·缓存
DIY源码阁8 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
mixboot8 小时前
Linux 进程工作目录查看利器:pwdx 命令详解
linux·运维·服务器