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

张开发
2026/4/18 0:00:37 15 分钟阅读

分享文章

瀚高数据库安全版4.5.10及其以上版本使用pg_cron定时任务
文章目录环境文档用途详细信息环境系统平台Linux x86-64 Red Hat Enterprise Linux 7版本4.5.10文档用途本文档主要介绍瀚高数据库安全版中如何使用pg_cron插件数据库版本是4.5.10、4.5.11pg_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文件中配置如下参数[rootlocalhost ~]# vi $PGDATA/postgresql.auto.confshared_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下重启数据库生效[rootlocalhost~]# pg_ctl restart3.创建pg_cron插件创建pg_cron插件需要关闭三权不同版本的数据库关闭三权的方式不同详细如下版本一数据库版本是安全版4.5.10.3之前的版本关闭三权需要重启1syssso登录数据库关闭三权 highgoselectshow_secure_param();--如果hg_sepofpowers是off表示三权已关闭只执行第3步即可highgoselectset_secure_param(hg_sepofpowers,off);2系统用户root下重启数据库[rootlocalhost~]# pg_ctl restart3sysdba创建pg_cron插件 cron_dbcreateextension pg_cron;4syssso开启三权 highgoselectset_secure_param(hg_sepofpowers,on);5系统用户root下重启数据库[rootlocalhost~]# pg_ctl restart6syssso确认三权已开启 highgoselectshow_secure_param();--确认hg_sepofpowers变成on即可版本二数据库版本是安全版4.5.10系列中4.5.10.3及其之后的版本支持临时关闭三权无需重启1syssso关闭三权 highgoselectshow_secure_param();--如果hg_sepv4中带有off表示三权已关闭只执行第2步即可highgoselectset_secure_param(hg_sepv4,off);2sysdba创建pg_cron插件 cron_dbcreateextension pg_cron;3syssso开启三权 highgoselectset_secure_param(hg_sepv4,on);highgoselectshow_secure_param();--确认hg_sepv4中没有带off即可版本三数据库版本是安全版4.5.11及其之后的版本支持临时关闭三权无需重启1syssso关闭三权 highgoselectshow_secure_param();--如果hg_sepenable是off表示三权已关闭只执行第2步即可highgoselectset_secure_param(hg_sepenable,off);2sysdba创建pg_cron插件 cron_dbcreateextension pg_cron;3syssso开启三权 highgoselectset_secure_param(hg_sepenable,on);highgoselectshow_secure_param();--确认hg_sepenable变成on即可4.sysdba把cron模式的usage权限赋给普通用户cron_dbgrantusageonschemacronto普通用户;表的属主是普通用户时对表的一些定时操作需要使用普通用户创建定时任务因为sysdba用户对表没有读写权限至此pg_cron的配置和创建完成。三、功能介绍1.创建定时任务1pg_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|每天上午9点40对表执行一次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 jobid3;jobid|schedule|command|nodename|nodeport|database|username|active|jobname----------------------------------------------------------------------------------------------------------------------------------3|1010***|vacuumanalyzepublic.t1;|localhost|5866|cron_db|cron_user|t|每天上午9点40对表执行一次vacuum(1行记录)4.查看定时任务执行情况cron.job_run_details表记录了定时任务的执行情况包括开始时间、结束时间、执行结果等。示例cron_db# select * from cron.job_run_details where jobid1;-[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.0043808end_time|2025-08-0709:55:00.009281085.删除定时任务使用cron.unschedule函数支持按照jobid和job名称删除。按照job名称删除时需要使用执行定时任务的用户删除否则报错而jobid可以使用sysdba用户删除因有时也存在job名称为空的情况所以推荐按照jobid删除。示例cron_db# select cron.unschedule(1);unschedule------------t(1行记录)cron_dbselectcron.unschedule(每天上午9点40对表执行一次vacuum);unschedule------------t(1行记录)

更多文章