找回密码
 立即注册
首页 业界区 安全 postgresql pg_cron 扩展设置定时任务

postgresql pg_cron 扩展设置定时任务

忿媚饱 昨天 09:24
postgresql pg_cron 扩展设置定时任务

原本看起来非常简单的一个扩展以及使用,最后还是遇到一个奇葩的问题,设置好定时任务之后,所有的任务执行时都提示connection failed,最后也找到相应的解决方案。
  1. ### 1,编译安装
  2. git clone https://github.com/citusdata/pg_cron.git
  3. cd pg_cron
  4. sudo make && make install
  5. 会编译出来一个pg_cron.so到环境变量中设置的postgresql的home路径下
  6. ### 2,创建扩展
  7. 修改postgresql配置文件,增加shared_preload_libraries参数pg_cron,并重启
  8. shared_preload_libraries = 'pg_stat_statements,pg_cron'        # (change requires restart)
  9. sudo systemctl restart postgresql9300 (我本地服务名称为postgresql9300)
  10. --查看preload_libraries
  11. show shared_preload_libraries;
  12. --创建扩展,请注意,pg_cron只能安装在postgres库,
  13. CREATE EXTENSION pg_cron;
  14. select * from pg_catalog.pg_extension where extname = 'pg_cron';
  15. ### 3,创建定时任务
  16. -- 1,本地任务
  17. SELECT cron.schedule(
  18.     cron_expression,       -- CRON 表达式,如 '*/5 * * * *'
  19.     sql_command            -- 要执行的 SQL 命令(用 $$ 包裹)
  20. );
  21. -- 2,备注名称+本地任务
  22. SELECT cron.schedule(
  23.     job_name,              -- 自定义任务名称(PG 13+ 支持)
  24.     cron_expression,
  25.     sql_command
  26. );
  27. -- 3,跨库其他库的定时任务
  28. SELECT cron.schedule(
  29.     job_name,
  30.     cron_expression,
  31.     sql_command,
  32.     database_name           -- 执行任务所在数据库名
  33. );
  34. ### 4 示例demo
  35. -- 设置好权限
  36. root@iZ7xv55xixens4mlf4jusqZ:/usr/local/pgsql16# chmod 700 -R /usr/local/pgsql16
  37. root@iZ7xv55xixens4mlf4jusqZ:/usr/local/pgsql16# chown -R postgres:postgres /usr/local/pgsql16
  38. SELECT cron.schedule_in_database('test bakcup task','*/1 * * * *',
  39. ' DO $$
  40. DECLARE
  41.     ts TEXT;
  42.     filepath TEXT;
  43. BEGIN
  44.     SELECT to_char(now(), ''YYYY-MM-DD_HH24MISS'') INTO ts;
  45.     filepath := format(''/usr/local/pgsql16/backup/my_table_%s.csv'', ts);
  46.     EXECUTE format(''COPY public.mytable01 TO %L WITH CSV HEADER'', filepath);
  47. END;
  48. $$; ','db01');
  49. SELECT cron.schedule_in_database('VACUUM task','*/5 * * * * ','VACUUM','db01');
  50. ### 5,定时任务管理
  51. -- 查看任务
  52. SELECT * FROM cron.job;
  53. SELECT cron.pause(job_id);
  54. -- 恢复任务:
  55. SELECT cron.resume(job_id);
  56. -- 删除任务
  57. SELECT cron.unschedule(6);
  58. -- 任务历史记录
  59. select * from cron.job_run_details order by runid asc;
  60. -- 上述定时任务的脚本没有任何问题,但是所有的执行都是失败的,失败信息为connection failed
  61. -- 定时任务默认是 localhost+端口号,端口号也有了。不知道跟''有啥区别
  62. -- 神奇,nodename修改成127.0.0.1也是connection failed失败,只能为空字符串
  63. UPDATE cron.job SET nodename = '';
  64. -- 查看历史,定时任务执行成功
  65. select * from cron.job_run_details order by runid asc;
  66. 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.png

2.png
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册