
点击上方蓝字,关注了解我们~
为何不用PGAgent,而用pg_cron?
PGAgent功能确实不错,但是需要的依赖太多了,需要先装PGadmin以及一大堆的依赖包,这导致使用起来非常不方面,很不友好。而pg_cron相对而言简单了很多,只需要编译和修改三两个参数就可以了。
pg_cron用法
2.1安装
就和我们平常装插件一样三步走,解压,编译,安装
$unzip pg_cron-main.zip
$cd pg_cron-main
$make $ make install
友情提示:如果多个pg,需要先刷新pg的环境变量,再进行编译,否则后果。。。
通常装完插件,还有一个地方需要修改,那就是参数
pg_cron需要修改参数如下
shared_preload_libraries = 'pg_cron'
cron.database_name = 'yxp'
创建扩展
# create extension pg_cron;

至此安装已经成功,接下来就要看使用了
2.2使用
使用起来其实也很简单
只需要利用我们装的pg_cron扩展中的schedule函数就很方便的加入需要执行的任务
我这里用了一个很简单的vacuummy_table做演示,方便起见设置的是每十分钟。
SELECT cron.schedule('0,10,20,30,40,50 * * * *', 'VACUUM my_table');


五个*咱们都知道和crontab里的一样代表分时日月周,后面接我们需要执行的语句即可。
如果我们想给这个任务起个名字呢,就在前面加上就好,如下所示:
做一个重启postgreSQL就更新一下pg_cron插件的操作
SELECT cron.schedule('upgrade-pgcron', '@reboot', 'ALTER EXTENSION pg_cron UPDATE');

重点:
Jobname不仅仅可以方便我们看任务,同时再做更改job内容的时候提供必要的帮助
我又做了一个vacuummy_table的job,起了一个vacuum1的名字,这时候我们看到同时存在有两个vacuummy_table的job,一个jobid是15,一个是17。

这时,jobid=17的有jobname,我依据jobname做一个更改,把时间调成2点
select cron.schedule(' vacuum1', '0 2 * * *', 'vacuum my_table');


这就充分体现的jobname的重要性。
我又随意加了几条job,等了等,发现job根本没有执行,看细节报了一堆连接错误

什么原因导致会报这种连接失败的错误呢?

经过查阅资料发现,由于我们的pg_cron使用的是libpq的方式连接,需要调整一些密码类的控制文件
第一种说法调整pg_hba.conf,第二种说法要调整.passwd,简单来说就是要免密登录。我一看,怎么这么麻烦,实在头皮发麻,要是我有很多用户,岂不每个都要配置一下,工作量也太大了吧!
我们简单喵下这两个配置
1)先看pg_hba.conf
每条记录可以是下面七种格式之一

有兴趣的自行官网查询含义,实在太多,就不赘述了
2)再看.passwd

这个简单一点,但也要一个个添加
其实,
现在的pg_cron版本已经更新到了1.3,功能也再完善,我们苦恼的东西其实已经被Bertrand和Nathan解决了,他们使用动态后台工作程序代替了连接,也就是再也不需要更改密码相关的参数文件,只需增加一个参数cron.use_background_workers= on,并重启一下,pg_cron强大功能由你带回家。
审核日志
审核日志可让我们查看正在运行的cron作业以及过去的作业运行
在我们上面就已经用过了,cron这个schema下有个job_run_details表,这个表其实就是查看我们命令执行的一些细节。
1)命令开始和结束的时间
2)pg_cron命令是否成功
3)返回的行数-或错误消息,
这些信息可帮助我们快速检测问题,是很有帮助的。

那么我们还有一个问题,这个表是会一直增加的,日志如何清理也是个问题?
这个问题就留给大家思考一下吧!




微信号:justdoit2019syy
关注我们,了解更多




