pg_cron

1.简介

pg_cron是Citus Data研发的一个PostgreSQL扩展。它包含一个后台工作程序 (pg_cron scheduler),用于在服务器端执行数据库任务。它使用与常规cron相同的语法,允许直接从数据库定期执行PostgreSQL命令。

2.安装

2.1 环境

本次测试环境为:

CentOS Linux release 7.6.1810 (Core)
PostgreSQL 11.2

2.2 安装pg_cron

2.2.1 编译安装
git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
source /home/postgres/.bash_profile
make
make install
2.2.2 参数配置
  • postgresql.conf配置:
shared_preload_libraries = 'pg_cron'
cron.database_name = 'mydb'

注:配置了cron.database_name参数才能在对应数据库上安装pg_cron扩展。

  • pg_hba.conf配置:
host    all    all   localhost        trust
host    all   all  0.0.0.0/0     trust

另外也可以配置.pgpass文件。

  • .pgpass配置:
hostname:port:database:user:password
2.2.3 创建扩展
pg_ctl restart
psql
CREATE EXTENSION pg_cron;#可以选择给普通用户授权:
GRANT USAGE ON SCHEMA cron TO username;

3.使用

3.1 创建定时任务

SELECT cron.schedule('0 10 * * *', 'VACUUM');
SELECT cron.schedule('0 10 * * *', $$insert into aa values(2)$$);#另外可以直接使用标准sql来创建定时任务:
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)
VALUES ('0 4 * * *', 'VACUUM', 'node-1', 5432, 'postgres', 'marco');

3.2 取消定时任务

#取消单个定时任务
SELECT cron.unschedule(1);#一次取消所有定时任务
SELECT cron.unschedule (jobid) FROM cron.job ; #另外可以选择直接删除表cron.job表中对应记录来取消定时任务:
delete from cron.job where jobid=1;

注:1为对应的jobid

3.3 查询定时任务

select * from cron.job;
flying=# select * from cron.job;
-[ RECORD 1 ]-----------------------
jobid    | 1
schedule | */10 * * * *
command  | VACUUM
nodename | localhost
nodeport | 5432
database | flying
username | postgres
active   | t

4.pg_cron日志记录

pg_cron日志会打印在数据库日志中

  • pg_cron启动日志:
LOG:  pg_cron scheduler started
  • 操作成功的日志:
LOG:  cron job 1 starting: SELECT public.f_pull('pg_cron import');
LOG:  cron job 1 completed: 1 row
  • 操作失败的日志:
LOG:  cron job 1 starting: SELECT public.f_pull('pg_cron import');
LOG:  cron job 1 connection failed

注:操作失败一般是由于pg_hba.conf或者.pgpass文件配置有问题导致连接失败,请仔细查看其配置。

5.应用举例

5.1 定期删除旧数据

  • 周六早点三点半删除一周前的数据
SELECT cron.schedule ('30 3 * * 6',$$DELETE FROM events WHERE event_time < now()-interval '1 week'$$);

5.2 定期vacuum

  • 每天晚上23点vacuum
SELECT cron.schedule ('0 23 * * *','VACUUM');

6.关于认证

6.1 本地localhost连接

pg_cron使用libpq打开与本地数据库的新连接。能够使用pg_cron的数据库和用户必须有相应的访问权限。

默认情况下,使用:

SELECT cron.schedule('0 10 * * *', 'VACUUM');

这种创建定时任务的方法,会默认创建localhost本地连接,数据库为postgresql.conf文件中cron.database_name参数对应的数据库,用户为postgres。因此想要使用这种方式创建定时任务,必须有本地localhost访问数据库的权限。

通常的pg_hba.conf文件配置包含以下内容即可:

host    all    all   localhost        trust

6.2 远程连接

除了上面提到的默认创建定时任务的方式外,还可以使用以下方式创建定时任务:

INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username)
VALUES ('0 4 * * *', 'VACUUM', '192.168.86.151', 5432, 'postgres', 'marco');

此方法可以创建远程连接。但是必须有远程连接数据库的权限。

通常的pg_hba.conf文件配置包含以下内容即可:

host    all   all  0.0.0.0/0     trust

综上所述,为了方便创建本地localhost连接和远程连接,通常pg_hba.conf包含以下内容:

注:考虑到数据安全问题,可以根据自己的实际需求另行设置。

host    all    all   localhost        trust
host    all   all  0.0.0.0/0     trust

7.关于流复制中使用pg_cron

流复制环境中,主库使用pg_cron,备库也会相应的创建pg_cron扩展和定时任务,但是备库并不会主动执行定时任务,相应的定时任务会保存在备库cron.job表中,等备库promote的时候就会执行。

另外,不能直接在流复制的备库创建pg_cron扩展。

flying=# create extension pg_cron ;
ERROR:  cannot execute CREATE EXTENSION in a read-only transaction

8.参考

https://github.com/citusdata/pg_cron

https://fluca1978.github.io/2019/05/21/pgcron.html

pg_cron PostgreSQL的定时任务插件相关推荐

  1. 基于QGIS初探PostgreSQL的PostGIS插件,包括YUM和编译安装PostGIS

    写在前面:本文介绍 QGIS,只是为了展示怎么使用 PostGIS,因作者本人追求的是 PostgreSQL,所以本文的重点还是 PostGIS 这个 PostgreSQL 的插件,QGIS软件只做简 ...

  2. PostgreSQL全局临时表插件pgtt的使用

    墨墨导读:本文主要介绍PostgreSQL全局临时表插件pgtt的使用. https://github.com/darold/pgtt 前言 PostgreSQL目前到最新12版本只支持本地临时表不支 ...

  3. postgresql安装postgis插件并导入数据

    今天分享 postgresql安装postgis插件并导入数据,首先我们需要知道什么时候需要安装postgis插件,这是很重要的一个前提:一般来说数据有空间索引坐标相关的数据,需要安装,或者操作数据报 ...

  4. PostgreSQL SQL OUTLINE插件sr_plan (保存、篡改、固定 执行计划)

    标签 PostgreSQL , sql plan outline , 执行计划篡改 , query rewrite , sr_plan , pg plan hint 背景 功能较为强大的数据库,通常都 ...

  5. postgresql垃圾清理插件pg_repack

    pg_repack插件部署: wget http://api.pgxn.org/dist/pg_repack/1.4.5/pg_repack-1.4.5.zip source /home/postgr ...

  6. PostgreSQL使用PostGIS插件,存储GIS数据

    PostGIS是PostgreSQL对象关系数据库的空间数据库扩展程序.它增加了对地理对象的支持,允许在SQL中运行位置查询. [About PostGIS](About PostGIS | Post ...

  7. 【Postgresql】pg_show_plans插件

    介绍 pg_show_plans是一个显示当前运行的所有SQL语句执行计划的模块.它在plan结束位置,截获并存储当前plan tree,从而使其他会话可以打印存储plan tree.目前此模块支持从 ...

  8. Postgresql在线分区插件之pg_rewrite使用

    在使用数据库的过程中,有一些表开始无法估量大小,后面表变大后,需要做分区表,那么是一件比较烦人的事情,现在好了,有了cybertec公司这款插件,轻松实现.说到这个功能,Oracle从很早就有了,叫在 ...

  9. java 定时任务插件_详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

最新文章

  1. 树莓派3 64linux,树莓派3 model b安装64位debian+qt5.9
  2. 错误处理,触发,日志使用,异常机制
  3. 订单BOM与销售BOM的区别
  4. python元编程详解
  5. Java 解决采集UTF-8网页空格变成问号乱码
  6. 下标 获取字符_互联网人工智能编程语言Python的下标与切片详解
  7. ajax dorado,02. Dorado的AJAX异常
  8. rabbitmq 之 ack
  9. 已知一/27网络中有一个地址是167.199.170.82,问这个网络的网络掩码、网络前缀长度和网络后缀长度是多少,求这个地址块的地址数、首地址以及末地址是多少
  10. c盘瘦身。清理四个垃圾文件夹
  11. awb数据怎么计算_自动白平衡(AWB)算法
  12. fzoj Problem 2190 非提的救赎 【单调栈】
  13. response.sendError() 和 response.setStatus()的区别
  14. “校园舆情监测系统”网站设计及网页编辑总结
  15. 召回率 matlab代码,召回率和精度(示例代码)
  16. 绘制系列(十八)图形篇-Bitmap
  17. Docker常用命令超细介绍
  18. c语言单链表倒置(附原理讲解)
  19. 关于1998年,2008年的全球/东南亚-金融/经济危机的10年魔咒反思
  20. 自动化方法模拟Android手机点击、触屏事件

热门文章

  1. Eclipse使用手册(基础篇)
  2. Windows vbs脚本获取系统信息
  3. Swift 3有什么新功能?
  4. Python-123 试题 天龙八部
  5. 概率统计·概率论的基本概念【古典概型、几何概型】
  6. 繁华三千如梦散,红尘俗世要释怀
  7. 路由器的搭建以及实现虚拟机上网
  8. 在线图像扫描技术解决方法
  9. Android 设计模式
  10. 南京理工大学 计算机调剂科目,南京理工大学2017年接收优秀考生考研调剂的公告...