💡 不要使用pgcron用来定期执行性能低或运行时长较长的sql或存储过程,千万不要,能拆开尽量拆开,但是建议使用外部调度去操作。
因为工作业务需求关系,需要每天零点进行数据库sp操作,且业务使用pgsql,因此采用pgcron插件设置数据库定时任务。
前置条件——安装pgcron插件
2023.8.9 更新补充
- pgcron插件下载安装
注意:只有9.5以上版本的postgresql才可以使用。- github的安装地址:github.com/citusdata/p…
- 下载后放置db服务器的任意位置
- 编译安装:
cd xxx/pg_cron make make install
- 修改配置
因为pg_cron会启动一个新的进程,因此需要将其加到shared_preload_libraries参数中。
- 修改postgresql.conf
shared_preload_libraries = 'pg_cron' # 填入需要引入插件的数据库 cron.database_name = 'postgres' - 修改pg_hba.conf
host all all localhost trust host all all 0.0.0.0/0 trust
- 修改postgresql.conf
- 修改后重启服务器
systemctl restart postgresql-12 - 执行命令
# 创建扩展插件 CREATE EXTENSION pg_cron; # 授权给指定数据库 GRANT USAGE ON SCHEMA cron TO postgres;
一、pgcron任务的创建
创建pgcron任务直接使用select语句
SELECT cron.schedule('15 17 */1 */1 *',$$SELECT insert_rpa_process_table()$$);
定时任务时间格式可以参照:参考网址,但是需要注意查看数据库系统时区,如果和参考网址一致,需要根据各自时区进行加减。
打个比方,假设数据库系统时区未修改,要设置定时任务在每天凌晨启动,那么需要设定时间为00:00,实际表达式应该写为00 16 */1 */1 *。因为默认为英国格林威治时间,因此我们处于东八区,需要相应的减8小时。
SELECT insert_rpa_process_table();
定时任务的执行语句,和运行直接运行sp一致。
二、pgcron任务管理
/*pgcron操作*/
--查询pgcron job任务列表
SELECT * FROM cron.job;
--查询pgcron运行日志
SELECT * FROM cron.job_run_details;
--删除pgcron定时任务
DELETE FROM cron.job WHERE jobid='7'
三、切换pg_cron指定的数据库
2023.8.9 更新补充
当你需要修改指定的数据库时,需要切换postgresql.conf的指定数据库名称。请注意,这边的cron.database_name是唯一值。在修改配置后重启服务器。
重新执行命令:
# 创建扩展插件
CREATE EXTENSION pg_cron;
# 授权给指定数据库
GRANT USAGE ON SCHEMA cron TO postgres;
执行GRANT USAGE ON SCHEMA cron TO postgres的时候,只会生成cron.job表。只有删除已有的pgcron插件,重新执行CREATE EXTENSION pg_cron;才是真正的切换数据库成功。