忿媚饱 发表于 2025-7-30 09:24:03

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]
查看完整版本: postgresql pg_cron 扩展设置定时任务