pg_task

在特定时间点在后台执行SQL命令

概览

扩展包名版本分类许可证语言
pg_task2.1.29TIMEMITC
ID扩展名BinLibLoadCreateTrustReloc模式
1080pg_task-
相关扩展timescaledb pg_cron pg_later pg_background pg_partman timescaledb_toolkit timeseries periods

breaks on many systems

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.1.291817161514pg_task-
RPMPIGSTY2.1.291817161514pg_task_$v-
DEBPIGSTY2.1.291817161514postgresql-$v-pg-task-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u22.x86_64
u22.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u24.x86_64
u24.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 pg_task 扩展的 RPM / DEB 包:

pig build pkg pg_task         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_task 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_task;          # 当前活跃 PG 版本安装
pig ext install -y pg_task -v 18  # PG 18
pig ext install -y pg_task -v 17  # PG 17
pig ext install -y pg_task -v 16  # PG 16
pig ext install -y pg_task -v 15  # PG 15
pig ext install -y pg_task -v 14  # PG 14
dnf install -y pg_task_18       # PG 18
dnf install -y pg_task_17       # PG 17
dnf install -y pg_task_16       # PG 16
dnf install -y pg_task_15       # PG 15
dnf install -y pg_task_14       # PG 14
apt install -y postgresql-18-pg-task   # PG 18
apt install -y postgresql-17-pg-task   # PG 17
apt install -y postgresql-16-pg-task   # PG 16
apt install -y postgresql-15-pg-task   # PG 15
apt install -y postgresql-14-pg-task   # PG 14

预加载配置

shared_preload_libraries = 'pg_task';

用法

来源:pg_task upstream READMEPGXN pg_tasklocal metadata

pg_task 是一个后台工作进程调度器,用于在计划时间异步执行 SQL。上游文档说明它支持 PostgreSQL、Greenplum 和 Greengage。

在服务器启动时启用 worker,然后在拥有任务表的数据库中创建扩展:

shared_preload_libraries = 'pg_task'
CREATE EXTENSION pg_task;

调度任务

通过向配置的任务表插入行来调度工作。默认情况下,任务表是 postgres 数据库中的 public.task,除非通过 GUC 修改。

-- Run SQL immediately
INSERT INTO task (input) VALUES ('SELECT now()');

-- Run SQL after 5 minutes
INSERT INTO task (plan, input) VALUES (now() + '5 min'::interval, 'SELECT now()');

-- Run SQL at a specific time
INSERT INTO task (plan, input) VALUES ('2029-07-01 12:51:00', 'SELECT now()');

-- Repeat SQL every 5 minutes
INSERT INTO task (repeat, input) VALUES ('5 min', 'SELECT now()');

-- Exceptions are caught and written to the error column
INSERT INTO task (input) VALUES ('SELECT 1/0');

-- Limit concurrent tasks in a group.
-- max = 1 means one task at a time for this group.
INSERT INTO task ("group", max, input) VALUES ('billing', 1, 'SELECT refresh_billing_cache()');

-- Run SQL on a remote database
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host');

任务表

任务表是面向用户可见的。上游说明用户可以为它添加列,也可以对它分区。

关键列:

名称类型默认值说明
idbigserialautoincrement主键
parentbigintpg_task.id父任务 ID
plantimestamptzstatement_timestamp()计划开始时间
starttimestamptz实际开始时间
stoptimestamptz实际结束时间
activeinterval1 hour计划时间后任务仍可执行的活跃时段
liveinterval0 sec后台工作进程最长存活时间
repeatinterval0 sec自动重复间隔
timeoutinterval0 sec任务运行允许的时间
countint0worker 退出前的最大任务数
maxint0分组内最大并发任务数;负值表示任务之间的暂停毫秒数
pidint执行任务的进程 ID
stateenumPLANPLAN、TAKE、WORK、DONE、STOP
deletebooltrue当 output 和 error 为空时自动删除
driftboolfalse根据 stop 时间计算下一次重复
headerbooltrue在输出中显示列标题
grouptext‘group’任务分组名称
inputtext要执行的 SQL 命令
outputtext接收到的结果
errortext捕获的错误
remotetext远程数据库连接字符串

配置

关键设置:

名称类型默认值说明
pg_task.deletebooltrue自动删除已完成任务
pg_task.driftboolfalse根据 stop 时间计算重复
pg_task.headerbooltrue在任务输出中显示列标题
pg_task.stringbooltrue输出中仅为字符串加引号
pg_task.countint0worker 退出前默认最多执行的任务数
pg_task.fetchint100一次抓取的任务行数
pg_task.limitint1000一次处理的任务行限制
pg_task.maxint0分组内默认最大并发任务数
pg_task.runint2147483647work 中最多同时执行的任务数
pg_task.sleepint1000每 N 毫秒检查一次任务
pg_task.activeinterval1 hour计划时间后任务仍可执行的活跃时段
pg_task.liveinterval0 secworker 进程最长存活时间
pg_task.repeatinterval0 sec默认重复间隔
pg_task.timeoutinterval0 sec默认任务超时
pg_task.datatextpostgres任务表所在数据库名
pg_task.usertextpostgres任务表所用用户名
pg_task.schematextpublic任务表所在 schema
pg_task.tabletexttask任务表名
pg_task.jsonjson[{"data":"postgres"}]多数据库配置
pg_task.idbigint0当前任务 ID,只读会话设置

多数据库配置

通过 JSON 配置在多个数据库上运行任务:

pg_task.json = '[{"data":"database1"},{"data":"database2","user":"username2"},{"data":"database3","schema":"schema3"}]'

如果指定的数据库、用户、schema 或表不存在,pg_task 会创建它们。

本地元数据将该包标记为 headless,因此它依赖 shared_preload_libraries,而不是纯 SQL 的用户侧安装路径。把它用于关键作业前,请在目标 PostgreSQL 版本上验证后台调度行为。


最后修改 2026-07-02: extension update 2026-07-02 (d4da20c)