当前位置: 首页 > news >正文

瀚高数据库安全版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启动处于活跃状态的定时任务。onreload生效
cron.log_run在cron.job_run_details表中记录任务运行的详细信息。on重启生效
cron.log_statement用日志记录运行的sql语句。on重启生效
cron.log_min_messages控制哪些消息级别被写入到服务器日志。warningreload生效

二、安装和配置

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插件需要关闭三权,不同版本的数据库关闭三权的方式不同,详细如下:

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

1)syssso登录数据库关闭三权 highgo=>selectshow_secure_param();--如果hg_sepofpowers是off,表示三权已关闭,只执行第3)步即可highgo=>selectset_secure_param('hg_sepofpowers','off');2)系统用户root下重启数据库[root@localhost~]# pg_ctl restart3)sysdba创建pg_cron插件 cron_db=>createextension pg_cron;4)syssso开启三权 highgo=>selectset_secure_param('hg_sepofpowers','on');5)系统用户root下重启数据库[root@localhost~]# pg_ctl restart6)syssso确认三权已开启 highgo=>selectshow_secure_param();--确认hg_sepofpowers变成on即可
版本二:数据库版本是安全版4.5.10系列中4.5.10.3及其之后的版本,支持临时关闭三权,无需重启
1)syssso关闭三权 highgo=>selectshow_secure_param();--如果hg_sepv4中带有off,表示三权已关闭,只执行第2)步即可highgo=>selectset_secure_param('hg_sepv4','off');2)sysdba创建pg_cron插件 cron_db=>createextension pg_cron;3)syssso开启三权 highgo=>selectset_secure_param('hg_sepv4','on');highgo=>selectshow_secure_param();--确认hg_sepv4中没有带off即可

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

1)syssso关闭三权 highgo=>selectshow_secure_param();--如果hg_sepenable是off,表示三权已关闭,只执行第2)步即可highgo=>selectset_secure_param('hg_sepenable','off');2)sysdba创建pg_cron插件 cron_db=>createextension pg_cron;3)syssso开启三权 highgo=>selectset_secure_param('hg_sepenable','on');highgo=>selectshow_secure_param();--确认hg_sepenable变成on即可

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

cron_db=>grantusageonschemacronto普通用户;

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

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

三、功能介绍

1.创建定时任务

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

selectcron.schedule('<任务名称>','<定时计划>','<定时任务>');selectcron.schedule('<定时计划>','<定时任务>');

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

selectcron.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 也是周日) -- │ │ │ │ │ -- * * * * *

示例:

--每分钟执行一次插入selectcron.schedule('每分钟执行一次插入','* * * * *','insert into public.t1(v) values(''test'' || clock_timestamp()::timestamp(0)::text);');-- 每天上午9点40对表执行一次vacuumselectcron.schedule('每天上午9点40对表执行一次vacuum','40 09 * * *','vacuum analyze public.t1;');--每周六的晚上23点执行一次vacuumselectcron.schedule('每周六的晚上23点执行一次vacuum','00 23 * * 6','vacuum analyze public.t1;');--跨库创建定时任务,在cron_db_02库中每分钟执行一次插入selectcron.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表,记录了所有的定时任务。

示例:

cron_db=# select * from cron.job;jobid|schedule|command|nodename|nodeport|database|username|active|jobname-------+-------------+-------------------------------------------------------------------------------------+-----------+----------+------------+--------------+--------+------------------------------------1|*****|insertintopublic.t1(v)values('test'||clock_timestamp()::timestamp(0)::text);|localhost|5866|cron_db|cron_user|t|每分钟执行一次插入2|0022***|vacuumanalyzepublic.t1;|localhost|5866|cron_db|cron_user|t|每天晚上10点对表执行一次vacuum3|4009***|vacuumanalyzepublic.t1;|localhost|5866|cron_db|cron_user|t|每天上午940对表执行一次vacuum4|0023**6|vacuumanalyzepublic.t1;|localhost|5866|cron_db|cron_user|t|每周六的晚上23点执行一次vacuum5|*****|insertintopublic.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函数修改定时任务,具体命令如下:

selectcron.alter_job(<任务id>,'<定时计划>','<定时任务>','<指定数据库>','<指定用户>',<活跃状态(boolean)>)

注:需要使用sysdba执行

示例:

--调整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|1010***|vacuumanalyzepublic.t1;|localhost|5866|cron_db|cron_user|t|每天上午940对表执行一次vacuum(1行记录)

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

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

示例:

cron_db=# select * from cron.job_run_details where jobid=1;-[RECORD1]--+----------------------------------------------------------------------------------jobid|1runid|27job_pid|2153database|cron_db username|cron_user command|insertintopublic.t1(v)values('test'||clock_timestamp()::timestamp(0)::text);status|succeeded return_message|INSERT01start_time|2025-08-0709:55:00.00438+08end_time|2025-08-0709:55:00.009281+08

5.删除定时任务

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

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

示例:

cron_db=# select cron.unschedule(1);unschedule------------t(1行记录)cron_db=>selectcron.unschedule('每天上午9点40对表执行一次vacuum');unschedule------------t(1行记录)
http://www.jsqmd.com/news/658004/

相关文章:

  • Panel故障排除终极指南:10个快速解决数据可视化问题的完整方案
  • QMCDecode技术解析:QQ音乐加密音频格式解密实现原理
  • 别再手动写JCo3.0连接代码了!用Spring Boot整合SAP RFC接口的完整配置流程
  • F28379D DAC实战:从内部基准电压选择到外部引脚测量,这些细节坑你踩过吗?
  • 02华夏之光永存:黄大年茶思屋榜文解法「第7期2题」大规模光网络多约束寻路算法·双路径解法
  • 解密GodMode9权限系统:从绿色到红色的安全操作指南
  • 别再只调控制点了!深入理解NURBS中‘权因子’对曲线形状的精细控制
  • OS前沿-vivo BlueOS技术分析
  • 5分钟快速上手:ImageToSTL图片转3D打印终极指南
  • 用STM32F103和DS1302做个多功能电子钟:从Proteus 8.11仿真到代码烧录全流程
  • 别再瞎设网格了!Lumerical FDTD仿真区域设置保姆级指南(含精度选择与边界条件详解)
  • 一文读懂蓝牙BQB认证:列名 vs. 非列名,你的产品到底该走哪条路?(附SIG官网操作截图)
  • 五分钟轻松掌握 Python 自动化测试 Selenium
  • 手把手教你用MATLAB解析TI毫米波雷达原始bin文件(附完整代码与数据)
  • 题解:洛谷 P1062 [NOIP 2006 普及组] 数列
  • 【2026最新】排版全乱?实测10款论文降AI率神器,这款能完美保留格式!
  • Kompute安全编程:保护GPU计算免受恶意攻击的7个防护措施
  • Softmax 从入门到精通:多分类激活函数的优雅解法
  • 虚拟主播制作新范式:用Wan2.2-S2V-14B实现多语言唇同步的5个关键步骤
  • 别急着调maxLifetime!HikariCP连接池报Failed to validate connection,先检查这三个MySQL服务端配置
  • 题解:洛谷 AT_abc331_c [ABC331C] Sum of Numbers Greater Than Me
  • 【平衡小车进阶】(一)蓝牙串口协议解析与多模式遥控实现(附源码)
  • Kaneo社区参与指南:如何成为开源项目的活跃贡献者
  • 2026论文润色避坑指南:免费降AI率工具靠谱吗?深度横评10款软件+排雷名单
  • 告别工业文档幻觉!KG-RAG技术如何让AI问答准确率飙升94%?
  • 掌握SWR配置全攻略:从全局设置到个性化定制的终极指南
  • 同事拿了8万补偿金,做完交接走人了。新同事误删资料,老板说,你必须回来,否则全行业封杀你。这件事让我想了很久
  • 应对2026检测新规:论文如何优化?实测10款降低AI率工具,SCI/工科适用
  • 如何用CausalNex进行结构学习:NO TEARS算法深度解析
  • 03华夏之光永存:黄大年茶思屋榜文解法「第7期3题」全息光学元件(HOE)消除“彩虹纹效应”·双路径解法