瀚高数据库安全版4.5.8系列使用pg_cron定时任务

文章目录

环境

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

版本:4.5.8

文档用途

本文档主要介绍瀚高数据库安全版中如何使用pg_cron插件,适用版本是4.5.8系列,pg_cron版本是1.3。

详细信息

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即东八区北京时间。 PRC 重启生效
cron.host 连接的主机名,后台模式下该参数无效。 localhost 重启生效
cron.max_running_jobs 允许并行运行的最大定时任务数,不能超过数据库参数max_worker_processes的值,值得范围是0~7。 5 重启生效
cron.log_run 在cron.job_run_details表中记录任务运行的详细信息。 on 重启生效
cron.log_statement 用日志记录运行的sql语句。 on 重启生效

二、安装和配置

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下重启数据库生效 \[root@localhost \~\]# pg_ctl restart 3.创建pg_cron插件 创建pg_cron插件需要关闭三权,详细如下: ```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即可 ``` 4.sysdba把cron模式的usage权限赋给普通用户 cron_db=\> grant usage on schema cron to 普通用户; 表的属主是普通用户时,对表的一些定时操作需要使用普通用户创建定时任务,因为sysdba用户对表没有读写权限 至此,pg_cron的配置和创建完成。 **三、功能介绍** 1.创建定时任务 pg_cron支持两种创建定时任务的方式: 1)使用时间间隔的方式创建 ```sql select cron.job_create('<任务名称>','<定时任务>','<时间间隔>','<开始时间>'); select cron.job_create('<定时任务>','<时间间隔>','<开始时间>'); select cron.job_create('<定时任务>','<时间间隔>'); ``` 注①:如果任务名称已经创建过,那么会修改已有的任务而不创建新的。需要特别注意如果是想创建新的定时任务,则一定要保证任务名称从未创建过,否则会覆盖已有任务。 注②:创建定时任务时,如果不设定开始时间,默认立刻执行一次,建议设定一个开始时间,以避开业务时间或者其他定时任务。 2)使用cron语法设定定时计划的方式创建 ```sql select cron.schedule('<任务名称>','<定时计划>','<定时任务>'); select cron.schedule('<定时计划>','<定时任务>'); ``` 注:如果任务名称已经创建过,那么会修改已有的任务而不创建新的。需要特别注意如果是想创建新的定时任务,则一定要保证任务名称从未创建过,否则会覆盖已有任务。 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;'); --一周自动执行一次vacuum select cron.job_create('一周执行一次vacuum操作','vacuum;','1 week',now()); --每隔5秒向表t1中插入一条记录 select cron.job_create('每隔5秒向表t1中插入一条记录','insert into public.t1(v) values(''test'' || clock_timestamp()::timestamp(0)::text);','5s',now()); --每隔5分钟执行一次vacuum,并设定开始时间为当天的晚上22点 select cron.job_create('vacuum analyze;','5 min','2025-08-07 22:00:00'); ``` 2.查看定时任务 查询cron.job表,记录了所有的定时任务。 示例: ```sql cron_db=> select * from cron.job; jobid | nodeport | is_hgjob | schedule | command | first_run_time | nodename | database | username | interval | nex t_run_time | active | jobname -------+----------+----------+-------------+-----------------------------------------------------------------------------------+-------------------------------+-----------+----------+-----------+----------+------------ -------------------+--------+--------------------------------- 1 | 5866 | f | * * * * * | insert into public.t1(v) values('test' || clock_timestamp()::timestamp(0)::text); | | localhost | cron_db | cron_user | | | t | 每分钟执行一次插入 2 | 5866 | f | 40 09 * * * | vacuum analyze public.t1; | | localhost | cron_db | cron_user | | | t | 每天上午9点40对表执行一次vacuum 3 | 5866 | f | 00 23 * * 6 | vacuum analyze public.t1; | | localhost | cron_db | cron_user | | | t | 每周六的晚上23点执行一次vacuum 4 | 5866 | t | | vacuum; | 2025-08-07 14:34:46.564451+08 | localhost | cron_db | cron_user | 7 days | 2025-08-14 14:34:47.300323+08 | t | 一周执行一次vacuum操作 5 | 5866 | t | | insert into public.t1(v) values('test' || clock_timestamp()::timestamp(0)::text); | 2025-08-07 14:34:53.683297+08 | localhost | cron_db | cron_user | 00:00:05 | 2025-08-07 14:36:34.737257+08 | t | 每隔5秒向表t1中插入一条记录 (5 行记录) ``` 3.修改定时任务 pg_cron 1.3版本没有提供修改定时任务的函数,可以使用创建定时任务的函数通过传入相同的任务名称实现修改功能。 但是必须使用执行该定时任务的用户去修改,即cron.job表中的username。 示例: ```sql --根据任务名称查询出任务信息 cron_db=> select * from cron.job where jobname = '每天上午9点40对表执行一次vacuum'; -[ RECORD 1 ]--+-------------------------------- jobid | 2 nodeport | 5866 is_hgjob | f schedule | 40 09 * * * command | vacuum analyze public.t1; first_run_time | nodename | localhost database | cron_db username | cron_user interval | next_run_time | active | t jobname | 每天上午9点40对表执行一次vacuum --修改定时计划为每天晚上22点30 cron_db=> select cron.schedule('每天上午9点40对表执行一次vacuum','30 22 * * *','vacuum analyze public.t1;'); -[ RECORD 1 ] schedule | 2 --查看cron.job表,定时计划更新了 cron_db=> select * from cron.job where jobname = '每天上午9点40对表执行一次vacuum'; -[ RECORD 1 ]--+-------------------------------- jobid | 2 nodeport | 5866 is_hgjob | f schedule | 30 22 * * * command | vacuum analyze public.t1; first_run_time | nodename | localhost database | cron_db username | cron_user interval | next_run_time | active | t jobname | 每天上午9点40对表执行一次vacuum ``` 4.查看定时任务执行情况 cron.job_run_details表记录了定时任务的执行情况,包括开始时间、结束时间、执行结果等。 示例: ```sql cron_db=> select * from cron.job_run_details; -[ RECORD 1 ]--+---------------------------------------------------------------------------------- jobid | 1 runid | 22 job_pid | 3425 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 14:30:00.823775+08 end_time | 2025-08-07 14:30:00.83079+08 ``` 5.删除定时任务 使用cron.unschedule函数,支持按照jobid或者job名称删除。 按照job名称删除时,需要使用执行定时任务的用户删除,否则报错,而jobid可以使用sysdba用户删除,因有时也存在job名称为空的情况,所以推荐按照jobid删除。 示例: ```sql cron_db=> select cron.unschedule(10); unschedule ------------ t (1 行记录) cron_db=> select cron.unschedule('每隔5秒向表t1中插入一条记录'); unschedule ------------ t (1 行记录) ``` 6.跨库创建定时任务 pg_cron 的1.3版本没有提供跨库创建定时任务的函数,但是可以通过更新cron.job表中的database和username实现此功能。需要使用sysdba用户执行。 示例: ```sql --更新定时任务的数据库和用户 cron_db=# update cron.job set database='cron_db_02',username='cron_user_02' where jobid=3; UPDATE 1 --查看修改后的定时任务 cron_db=# select * from cron.job where jobid=3; -[ RECORD 1 ]--+------------------------------- jobid | 3 nodeport | 5866 is_hgjob | f schedule | * * * * * command | vacuum analyze public.t1; first_run_time | nodename | localhost database | cron_db_02 username | cron_user_02 interval | next_run_time | active | t jobname | 每周六的晚上23点执行一次vacuum --查看定时任务执行结果,跨库执行成功 cron_db=# select * from cron.job_run_details where jobid=3 order by end_time desc; -[ RECORD 1 ]--+---------------------------------- jobid | 3 runid | 780 job_pid | 19554 database | cron_db_02 username | cron_user_02 command | vacuum analyze public.t1; status | succeeded return_message | VACUUM start_time | 2025-08-08 09:38:00.242307+08 end_time | 2025-08-08 09:38:00.260244+08 ```

相关推荐
2401_871696522 小时前
HTML5中Canvas局部刷新区域重绘的算法优化
jvm·数据库·python
CodeMartain2 小时前
MongoDB--Spring
数据库·mongodb·spring
数字孪生进化论2 小时前
数据集成实战|从零到一,把物联网数据接入数字孪生IOC需要几步?
数据库·物联网
野生技术架构师2 小时前
从两套系统到一条 SQL:SelectDB search() 搞定日志的搜索与分析
数据库·sql
2301_777599372 小时前
CSS如何制作卡片翻转效果_利用backface-visibility与动画
jvm·数据库·python
AllData公司负责人2 小时前
AllData数据中台集成开源项目OpenMetaData,建设元数据与数据血缘平台!
数据库·实时数仓·元数据·streampark·数据血缘·openmetadata
想唱rap2 小时前
C++11之包装器
服务器·开发语言·c++·算法·ubuntu
解救女汉子2 小时前
Python 中正确声明、重新赋值并安全使用 None 初始化变量的完整指南
jvm·数据库·python
wsdswzj2 小时前
数据库基础安全
数据库·安全