PostgreSQL 19 Beta 3 已于 2026 年 8 月 13 日发布,发行说明也在持续完善。正式版日期尚未公布,但按照 PostgreSQL 项目通常在 9 月或 10 月发布的节奏,现在已经进入升级准备窗口。
这时最有价值的工作不是背诵新功能列表,而是把真实数据库、扩展和应用查询放到 PG 19 上跑一遍。发行说明仍可能变化,Beta 版本也不应承载生产流量,但它足以帮助团队提前发现兼容性变化、镜像问题和 SQL 行为差异。
先把 Beta 当成兼容性测试目标
升级 PostgreSQL 时,风险往往不在某个醒目的新功能,而在日常代码依赖的细节:旧语法、隐式类型转换、关键字冲突、扩展版本,以及驱动程序对新服务端版本的识别。
因此,阅读 PG 19 发行说明时可以把变化分成三类:
- 必须处理的兼容性变化:可能造成 SQL 报错、结果变化或启动失败。
- 值得启用的 SQL 能力:能够简化现有查询,但不应和升级本身绑定发布。
- 暂时无关的内部改进:记录下来即可,不必为了“用上新版本”立即改造代码。
升级和采用新语法最好拆成两个变更。先证明应用在 PG 19 上保持原有行为,再单独引入新能力,这样发生回归时更容易定位原因。
用 Docker 建立可重复的 PG 19 环境
来源摘要提到,实验环境可通过下面的变量选择 PG 19 Beta 3:
POSTGRES_VERSION=19beta3 PG_MAJOR=19 docker compose up
其中 POSTGRES_VERSION 用来选择预构建镜像;PG_MAJOR 只在 Compose 需要本地构建时生效。普通的 docker compose up 仍保持 PG 16,直到 PG 19 正式发布。这种设计很适合测试仓库:默认环境稳定,预发布版本必须显式选择。
如果项目还没有对应配置,可以这样实践。下面假设所用镜像仓库提供 postgres:19beta3 标签;运行前应根据团队实际镜像地址修改 image:
# compose.yaml
services:
postgres:
image: postgres:${POSTGRES_VERSION:-16}
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: app
ports:
- "54329:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 2s
timeout: 3s
retries: 30
volumes:
- pg19-data:/var/lib/postgresql/data
volumes:
pg19-data:
启动 Beta 3,并确认真正连接到了预期版本:
POSTGRES_VERSION=19beta3 docker compose up -d
docker compose exec postgres \
psql -U app -d app -c 'select version();'
不要让 PG 16 和 PG 19 复用同一个数据卷。主版本之间不能靠替换镜像直接升级数据目录;正式迁移仍应使用 pg_upgrade,或者通过逻辑备份与恢复完成。
把真实负载变成升级测试
空数据库能够验证容器启动,却无法证明应用兼容。更可靠的做法是导入一份脱敏后的生产数据或固定测试数据集,然后执行迁移、查询测试和应用集成测试。
下面是一条简单的逻辑备份与恢复路径。请把容器名、数据库名和账号改成项目自己的值:
# 从现有数据库导出自定义格式备份
pg_dump \
--host=127.0.0.1 \
--port=5432 \
--username=app \
--dbname=app \
--format=custom \
--file=app.dump
# 恢复到映射在 54329 端口的 PG 19 测试实例
pg_restore \
--host=127.0.0.1 \
--port=54329 \
--username=app \
--dbname=app \
--clean \
--if-exists \
--no-owner \
app.dump
恢复成功只是第一关。测试流程还应覆盖:
- 从零执行全部 schema migration,并验证重复执行或回滚路径。
- 运行业务查询和报表,对比关键结果集,而不只是检查是否报错。
- 检查所有扩展是否存在 PG 19 兼容版本。
- 使用生产同版本的客户端驱动、连接池和 ORM。
- 执行
ANALYZE后检查关键查询计划,避免把统计信息缺失误判成版本回归。 - 验证备份、恢复、监控、复制和故障切换脚本。
还可以在两个版本上分别导出结构,再进行文本比较:
pg_dump --schema-only --no-owner --no-privileges \
--host=127.0.0.1 --port=5432 --username=app app > schema-pg16.sql
pg_dump --schema-only --no-owner --no-privileges \
--host=127.0.0.1 --port=54329 --username=app app > schema-pg19.sql
diff -u schema-pg16.sql schema-pg19.sql
这个差异不能直接判定兼容或不兼容,因为不同版本的 pg_dump 可能采用不同输出形式,但它能快速暴露意外缺失的对象、扩展和权限定义。
上线决策不要只看 GA 日期
PG 19 正式发布并不等于所有依赖都已经准备好。真正的上线条件应由项目自己的验证结果决定:目标扩展提供兼容版本,驱动程序明确支持 PG 19,备份可以恢复,核心查询结果一致,性能基线没有不可解释的退化,并且回退方案已经演练。
建议保留一份短而明确的升级清单:
- 固定并记录测试所用的 PG 19 镜像版本。
- 逐条审阅最终版发行说明中的不兼容变化。
- 在接近生产的数据规模上执行恢复和迁移。
- 对核心 SQL 做结果与执行计划对比。
- 验证扩展、驱动、ORM、连接池和运维工具。
- 将升级与新 SQL 特性的采用分开发布。
- 在正式切换前完成一次计时迁移和回退演练。
Beta 阶段的意义不是抢先把生产环境升级,而是把未知问题提前变成可以复现、可以分派、可以验证的工程任务。等 PG 19 GA 到来时,团队需要做的应该只是确认最终版本差异,而不是第一次启动测试环境。