pg_cron PostgreSQL的定时任务插件
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的定时任务插件相关推荐
- 基于QGIS初探PostgreSQL的PostGIS插件,包括YUM和编译安装PostGIS
写在前面:本文介绍 QGIS,只是为了展示怎么使用 PostGIS,因作者本人追求的是 PostgreSQL,所以本文的重点还是 PostGIS 这个 PostgreSQL 的插件,QGIS软件只做简 ...
- PostgreSQL全局临时表插件pgtt的使用
墨墨导读:本文主要介绍PostgreSQL全局临时表插件pgtt的使用. https://github.com/darold/pgtt 前言 PostgreSQL目前到最新12版本只支持本地临时表不支 ...
- postgresql安装postgis插件并导入数据
今天分享 postgresql安装postgis插件并导入数据,首先我们需要知道什么时候需要安装postgis插件,这是很重要的一个前提:一般来说数据有空间索引坐标相关的数据,需要安装,或者操作数据报 ...
- PostgreSQL SQL OUTLINE插件sr_plan (保存、篡改、固定 执行计划)
标签 PostgreSQL , sql plan outline , 执行计划篡改 , query rewrite , sr_plan , pg plan hint 背景 功能较为强大的数据库,通常都 ...
- 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 ...
- PostgreSQL使用PostGIS插件,存储GIS数据
PostGIS是PostgreSQL对象关系数据库的空间数据库扩展程序.它增加了对地理对象的支持,允许在SQL中运行位置查询. [About PostGIS](About PostGIS | Post ...
- 【Postgresql】pg_show_plans插件
介绍 pg_show_plans是一个显示当前运行的所有SQL语句执行计划的模块.它在plan结束位置,截获并存储当前plan tree,从而使其他会话可以打印存储plan tree.目前此模块支持从 ...
- Postgresql在线分区插件之pg_rewrite使用
在使用数据库的过程中,有一些表开始无法估量大小,后面表变大后,需要做分区表,那么是一件比较烦人的事情,现在好了,有了cybertec公司这款插件,轻松实现.说到这个功能,Oracle从很早就有了,叫在 ...
- java 定时任务插件_详解Spring整合Quartz实现动态定时任务
最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...
最新文章
- 树莓派3 64linux,树莓派3 model b安装64位debian+qt5.9
- 错误处理,触发,日志使用,异常机制
- 订单BOM与销售BOM的区别
- python元编程详解
- Java 解决采集UTF-8网页空格变成问号乱码
- 下标 获取字符_互联网人工智能编程语言Python的下标与切片详解
- ajax dorado,02. Dorado的AJAX异常
- rabbitmq 之 ack
- 已知一/27网络中有一个地址是167.199.170.82,问这个网络的网络掩码、网络前缀长度和网络后缀长度是多少,求这个地址块的地址数、首地址以及末地址是多少
- c盘瘦身。清理四个垃圾文件夹
- awb数据怎么计算_自动白平衡(AWB)算法
- fzoj Problem 2190 非提的救赎 【单调栈】
- response.sendError() 和 response.setStatus()的区别
- “校园舆情监测系统”网站设计及网页编辑总结
- 召回率 matlab代码,召回率和精度(示例代码)
- 绘制系列(十八)图形篇-Bitmap
- Docker常用命令超细介绍
- c语言单链表倒置(附原理讲解)
- 关于1998年,2008年的全球/东南亚-金融/经济危机的10年魔咒反思
- 自动化方法模拟Android手机点击、触屏事件