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失败,只能为空字符串
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |