基本上大部分数据库都有定时任务,最近开发问我PostgreSQL 要做定时任务,有的存储过程要在夜间去和financial 的 服务器来交互。我的第一个反应就是用LINUX 的定时任务不就可以了,但这个程序员提出 SQL SERVER ORACLE 都有定时任务,postgresql 也应该有吧。所以就有了这篇文字
首先为什么选择pg_cron ,pg_cron 在安装上要方便与 pgagent,也曾经安装过pgagent 但众多的一些依赖以及编译中的问题,导致pgagent 在某些初始化的方面并不友好。
pg_cron 是 citus 的一款开源产品,citus 也是POSTGRESQL 分布式插件的产品提供者。
安装相当简单
curl https://install.citusdata.com/community/rpm.sh
下载相关的 package repository
sudo yum install -y pg_cron_11
然后就直接yum 安装即可
安装完后,需要的是对他与postgresql进行配置
shared_preload_libraries = 'pg_cron'
cron.database_name = 'postgres'
但实际上如果这样安装很可能会,无法启动postgresql报无法找到pg_cron文件,别问为什么(呵呵)
这边能正常进行安装的方式是从git上下载文件,直接在有PG_CONFIG 的环境下,直接进行make ,make install 即可。
安装后还是需要在postgresql.conf 中添加那两句,重启服务器后就可以正常使用了
实际当中安装了pg_cron 扩展会在当前数据库生成一张cron.job表
下面就演示存储过程定期运行例子,数据库启动时会启动pg_cron
添加一个测试表
我们定期每分钟,往表里面插入一条数据
实际当中如果认为这么容易就能进行定期任务的执行那么大概率会失败
1 PG_CRON 使用的是libpq 的方式连接,也就是说他执行命令的方式不是在内部,直接执行命令,而是他通过连接的方式将命令发送进来,在执行。
2 既然如此,那有两点(经过碰过钉子,并且查询大部分相关文档都没有找到明确的答复),是需要注意的,1 nodename ,必须是本机的IP地址如果你配置了监听地址,则最好你的数据库服务的监听地址就是你填入nodename的地址。
2 你需要保证PG_HBA.CONF 中允许你的账户进行免密的访问,当然如果不行请设置.pgpass 到postgres 的用户目录中,否则你会经常看到无法连接的错误。
另外发现很多文章在说一个事情的时候,部分是不求细节的,例如如果我只想的语句是这样的 怎么办 call insert_D('a','b')写入到表里面如果按照固定的格式,前后加'' 那是一定会报错的,具体使用还需要注意
插入的数据的时候,需要在有单引号的地方,在添加单引号,
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username) VALUES ('0 4 * * *', 'call insert_D(''a'',''b'');', 'node-1', 5432, 'postgres', 'postgres');
或者下面的写法也可以被接受。
INSERT INTO cron.job (schedule, command, nodename, nodeport, database, username) VALUES ('0 4 * * *', $$call insert_D('a','b')$$, '192,.168.198.120', 5432, 'postgres', 'job');
另在cron 中会有两个函数,来进行添加和取消定时任务,但实际操作中,直接操作 cron.job 表的方式更为直接
使用函数添加JOB,需要提供什么时间允许,以及运行什么命令
取消的函数,直接给出job_id 就会直接需要禁止的JOB 的数字就可以了