postgresql pg_cron 扩展设置定时任务
postgresql pg_cron 扩展设置定时任务原本看起来非常简单的一个扩展以及使用,最后还是遇到一个奇葩的问题,设置好定时任务之后,所有的任务执行时都提示connection failed,最后也找到相应的解决方案。
### 1,编译安装
git clone https://github.com/citusdata/pg_cron.git
cd pg_cron
sudo make && make install
会编译出来一个pg_cron.so到环境变量中设置的postgresql的home路径下
### 2,创建扩展
修改postgresql配置文件,增加shared_preload_libraries参数pg_cron,并重启
shared_preload_libraries = 'pg_stat_statements,pg_cron' # (change requires restart)
sudo systemctl restart postgresql9300 (我本地服务名称为postgresql9300)
--查看preload_libraries
show shared_preload_libraries;
--创建扩展,请注意,pg_cron只能安装在postgres库,
CREATE EXTENSION pg_cron;
select * from pg_catalog.pg_extension where extname = 'pg_cron';
### 3,创建定时任务
-- 1,本地任务
SELECT cron.schedule(
cron_expression, -- CRON 表达式,如 '*/5 * * * *'
sql_command -- 要执行的 SQL 命令(用 $$ 包裹)
);
-- 2,备注名称+本地任务
SELECT cron.schedule(
job_name, -- 自定义任务名称(PG 13+ 支持)
cron_expression,
sql_command
);
-- 3,跨库其他库的定时任务
SELECT cron.schedule(
job_name,
cron_expression,
sql_command,
database_name -- 执行任务所在数据库名
);
### 4 示例demo
-- 设置好权限
root@iZ7xv55xixens4mlf4jusqZ:/usr/local/pgsql16# chmod 700 -R /usr/local/pgsql16
root@iZ7xv55xixens4mlf4jusqZ:/usr/local/pgsql16# chown -R postgres:postgres /usr/local/pgsql16
SELECT cron.schedule_in_database('test bakcup task','*/1 * * * *',
' DO $$
DECLARE
ts TEXT;
filepath TEXT;
BEGIN
SELECT to_char(now(), ''YYYY-MM-DD_HH24MISS'') INTO ts;
filepath := format(''/usr/local/pgsql16/backup/my_table_%s.csv'', ts);
EXECUTE format(''COPY public.mytable01 TO %L WITH CSV HEADER'', filepath);
END;
$$; ','db01');
SELECT cron.schedule_in_database('VACUUM task','*/5 * * * * ','VACUUM','db01');
### 5,定时任务管理
-- 查看任务
SELECT * FROM cron.job;
SELECT cron.pause(job_id);
-- 恢复任务:
SELECT cron.resume(job_id);
-- 删除任务
SELECT cron.unschedule(6);
-- 任务历史记录
select * from cron.job_run_details order by runid asc;
-- 上述定时任务的脚本没有任何问题,但是所有的执行都是失败的,失败信息为connection failed
-- 定时任务默认是 localhost+端口号,端口号也有了。不知道跟''有啥区别
-- 神奇,nodename修改成127.0.0.1也是connection failed失败,只能为空字符串
UPDATE cron.job SET nodename = '';
-- 查看历史,定时任务执行成功
select * from cron.job_run_details order by runid asc;
SELECT cron.unschedule(9);demo中定时任务的脚本没有任何问题,但是所有的执行都是失败的,失败信息为connection failed
定时任务cron.job表的nodename默认是 localhost,端口号字段也有了,默认创建的定时任务一直失败。
后面尝试参考这个https://dba.stackexchange.com/questions/297882/connection-failed-error-for-pg-cron-extension,修改 nodename = ''就好了,神奇,nodename修改成127.0.0.1也是connection failed失败,只能为空字符串
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]