【PostgreSQL】pgsql定时任务服务器端插件——pgcron的使用

567 阅读2分钟
💡 不要使用pgcron用来定期执行性能低或运行时长较长的sql或存储过程,千万不要,能拆开尽量拆开,但是建议使用外部调度去操作。

因为工作业务需求关系,需要每天零点进行数据库sp操作,且业务使用pgsql,因此采用pgcron插件设置数据库定时任务。

前置条件——安装pgcron插件

2023.8.9 更新补充

  1. pgcron插件下载安装
    注意:只有9.5以上版本的postgresql才可以使用。
    • github的安装地址:github.com/citusdata/p…
    • 下载后放置db服务器的任意位置
    • 编译安装:
      cd xxx/pg_cron
      make
      make install
      
  2. 修改配置

    因为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
      
  3. 修改后重启服务器
    systemctl restart postgresql-12
    
  4. 执行命令
    # 创建扩展插件
    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;才是真正的切换数据库成功。