pg_background

在后台运行 SQL 查询

概览

扩展包名版本分类许可证语言
pg_background1.8TIMEGPL-3.0C
ID扩展名BinLibLoadCreateTrustReloc模式
1100pg_background-
相关扩展pg_cron pg_task pg_later pgq timescaledb timescaledb_toolkit timeseries periods

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED1.81817161514pg_background-
RPMPGDG1.81817161514pg_background_$v-
DEBPIGSTY1.81817161514postgresql-$v-pg-background-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
d12.aarch64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
d13.x86_64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
d13.aarch64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
u22.x86_64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
u22.aarch64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
u24.x86_64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
u24.aarch64
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8
PIGSTY 1.8

构建

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

pig build pkg pg_background         # 构建 DEB 包

安装

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

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

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

pig install pg_background;          # 当前活跃 PG 版本安装
pig ext install -y pg_background -v 18  # PG 18
pig ext install -y pg_background -v 17  # PG 17
pig ext install -y pg_background -v 16  # PG 16
pig ext install -y pg_background -v 15  # PG 15
pig ext install -y pg_background -v 14  # PG 14
dnf install -y pg_background_18       # PG 18
dnf install -y pg_background_17       # PG 17
dnf install -y pg_background_16       # PG 16
dnf install -y pg_background_15       # PG 15
dnf install -y pg_background_14       # PG 14
apt install -y postgresql-18-pg-background   # PG 18
apt install -y postgresql-17-pg-background   # PG 17
apt install -y postgresql-16-pg-background   # PG 16
apt install -y postgresql-15-pg-background   # PG 15
apt install -y postgresql-14-pg-background   # PG 14

创建扩展

CREATE EXTENSION pg_background;

用法

pg_background: 在后台工作进程中执行 SQL

在 PostgreSQL 的后台工作进程中执行任意 SQL 命令。与 dblink(创建独立连接)不同,pg_background 的工作进程运行在数据库服务器内部,使用独立事务

使用场景:

  • 后台维护(VACUUM、ANALYZE、REINDEX)
  • 异步审计日志记录
  • 长时间运行的 ETL 管道
  • 独立的通知发送
  • 并行查询模式

快速开始(V2 API)

CREATE EXTENSION pg_background;

-- 启动后台任务
SELECT * FROM pg_background_launch_v2(
  'SELECT count(*) FROM large_table'
) AS handle;
--   pid  |      cookie
-- -------+-------------------
--  12345 | 1234567890123456

-- 获取结果(一次性消费)
SELECT * FROM pg_background_result_v2(12345, 1234567890123456) AS (count BIGINT);

-- 即发即忘(不需要结果)
SELECT * FROM pg_background_submit_v2(
  'INSERT INTO audit_log (ts, event) VALUES (now(), ''system_check'')'
) AS handle;

V2 API 参考

函数返回值说明
pg_background_launch_v2(sql, queue_size)pg_background_handle启动工作进程,返回 cookie 保护的句柄
pg_background_submit_v2(sql, queue_size)pg_background_handle即发即忘(不消费结果)
pg_background_result_v2(pid, cookie)SETOF record获取结果(一次性消费)
pg_background_detach_v2(pid, cookie)void停止跟踪工作进程(进程继续运行)
pg_background_cancel_v2(pid, cookie)void请求取消
pg_background_cancel_v2_grace(pid, cookie, grace_ms)void带宽限期的取消
pg_background_wait_v2(pid, cookie)void阻塞等待工作进程完成
pg_background_wait_v2_timeout(pid, cookie, timeout_ms)bool带超时的等待
pg_background_list_v2()SETOF record列出当前会话中已知的工作进程
pg_background_stats_v2()pg_background_stats会话统计信息(v1.8+)
pg_background_progress(pct, msg)void从工作进程中报告进度(v1.8+)
pg_background_get_progress_v2(pid, cookie)pg_background_progress获取工作进程进度(v1.8+)

取消与分离

操作停止执行移除跟踪
cancel_v2()是(尽力)
detach_v2()
  • 使用 cancel_v2()停止任务(终止执行,阻止提交)
  • 使用 detach_v2()停止跟踪(释放簿记资源,工作进程继续运行)

工作进程生命周期

-- 取消运行中的任务
SELECT pg_background_cancel_v2(pid, cookie);

-- 等待完成
SELECT pg_background_wait_v2(pid, cookie);

-- 带超时等待(完成则返回 true)
SELECT pg_background_wait_v2_timeout(pid, cookie, 5000);

-- 列出活跃的工作进程
SELECT * FROM pg_background_list_v2() AS (
  pid int4, cookie int8, launched_at timestamptz,
  user_id oid, queue_size int4, state text,
  sql_preview text, last_error text, consumed bool
);

工作进程状态:runningstoppedcancelederror

进度报告(v1.8+)

-- 在工作进程 SQL 内部调用
SELECT pg_background_progress(50, 'Halfway done');

-- 从启动方查看进度
SELECT * FROM pg_background_get_progress_v2(pid, cookie);

GUC 配置(v1.8+)

参数默认值说明
pg_background.max_workers16每个会话的最大并发工作进程数
pg_background.default_queue_size65536默认共享内存队列大小
pg_background.worker_timeout0工作进程执行超时(0 = 无限制)

V1 API(遗留)

V1 API 保留用于向后兼容,但缺少基于 cookie 的 PID 重用保护:

SELECT pg_background_launch('VACUUM VERBOSE my_table') AS pid \gset
SELECT * FROM pg_background_result(:pid) AS (result TEXT);
SELECT pg_background_detach(:pid);

生产环境建议使用 V2 API,因其具备基于 cookie 的 PID 重用保护。

安全模型

  • 扩展由超级用户安装,默认不授予 PUBLIC 权限
  • 会创建一个专用的 pg_background_worker NOLOGIN 角色
  • 辅助函数管理权限:grant_pg_background_privileges(role, include_v1)
  • 工作进程以启动用户(而非超级用户)身份执行

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