pg_task

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

概览

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

breaks on many systems

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.0.01817161514pg_task-
RPMPGDG2.1.71817161514pg_task_$v-
DEBPIGSTY2.1.121817161514postgresql-$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
u22.x86_64
u22.aarch64
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
u24.x86_64
u24.aarch64
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12
PIGSTY 2.1.12

构建

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

pig build pkg pg_task         # 构建 DEB 包

安装

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

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

使用 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: PostgreSQL 任务调度器

pg_task 允许在后台异步地在任意指定时间执行任意 SQL 命令。支持 PostgreSQL、Greenplum 和 Greengage。

首先在 postgresql.conf 中添加:

shared_preload_libraries = 'pg_task'

然后通过向 task 表插入记录来调度任务:

-- 立即执行 SQL
INSERT INTO task (input) VALUES ('SELECT now()');

-- 5 分钟后执行 SQL
INSERT INTO task (plan, input) VALUES (now() + '5 min'::INTERVAL, 'SELECT now()');

-- 在指定时间执行 SQL
INSERT INTO task (plan, input) VALUES ('2029-07-01 12:51:00', 'SELECT now()');

-- 每 5 分钟重复执行 SQL
INSERT INTO task (repeat, input) VALUES ('5 min', 'SELECT now()');

-- 异常会被捕获并写入 error 列
INSERT INTO task (input) VALUES ('SELECT 1/0');

-- 限制同一组内的并发任务数
INSERT INTO task (group, max, input) VALUES ('group', 1, 'SELECT now()');

-- 在远程数据库上执行 SQL
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host');

任务表列定义

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

你可以在此表上添加任意所需的列和/或创建分区。

配置参数(GUC)

关键设置:

参数类型默认值说明
pg_task.datatextpostgres任务表所在数据库名
pg_task.usertextpostgres任务表所用用户名
pg_task.schematextpublic任务表所在模式名
pg_task.tabletexttask任务表名
pg_task.sleepint1000每 N 毫秒检查一次任务
pg_task.deletebooltrue自动删除已完成任务
pg_task.driftboolfalse根据结束时间计算重复间隔
pg_task.repeatinterval0 sec默认重复间隔
pg_task.timeoutinterval0 sec默认任务超时
pg_task.maxint0默认组内最大并发任务数
pg_task.runint2147483647最大并发执行任务数
pg_task.jsonjson[{“data”:“postgres”}]多数据库配置

多数据库配置

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

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

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


最后修改 2026-03-14: update extension metadata (953cbd0)