Devrim GÜNDÜZ:PostgreSQL 2026年11月小版本发布:服务器与扩展需一同更新
内容提要
2026年11月,PostgreSQL发布18.7、17.12、16.16、15.20和14.25版本,修复CVE-2026-6460。该修复改变了复合类型存储及扩展接口,因此所有扩展均已针对新小版本重建。旧扩展在新服务器上缺少安全校验,新扩展在旧服务器上会因未定义符号无法加载,所以服务器与扩展必须在同一事务中一起更新。扩展包现要求对应小版本,今后每次小版本发布都会重建扩展。14.25是PostgreSQL 14的最终版本。
延伸解读
为何这次小版本不能只升服务器
CVE-2026-6460 的修复改动了复合类型存储方式,并调整了服务器对扩展的接口:DatumGetHeapTupleHeader() 由宏改为函数,heap_getattr() 调用新的 heap_datum_check()。由于头文件会编译进扩展,旧扩展在新服务器上虽能加载却缺少安全校验,新扩展在旧服务器上则因未定义符号无法加载。因此服务器与扩展必须同批更新,不能分次进行。
包依赖已把两者绑定在一起
从本次重建起,每个编译型扩展都要求至少当前小版本的 postgresqlXX-libs,例如 PostgreSQL 18 的扩展要求 >= 18.7;服务器、客户端和 contrib 也要求同一版本。这意味着 dnf 或 zypper 无法把新扩展装在旧服务器旁。今后每次小版本发布都会重建扩展,依赖关系会持续约束升级方式。
更新时的操作风险与注意事项
服务器包更新会通过 systemctl try-restart 重启运行中的服务,需预留短暂停机。若用 versionlock 或 exclude 锁住服务器,扩展也会因依赖无法解析而无法更新;只锁扩展则旧扩展仍缺少修复校验。--skip-broken 和 --nobest 会留下半更新系统。若服务不由 postgresql-18 单元管理(如 Patroni),需在更新后自行重启,否则旧二进制加载新扩展库可能报未定义符号。
重建暴露的问题与 14 的终点
重建时运行回归测试发现三处需处理:pg_repack 的测试因 pg_attribute.attoptions 新增 pg_attver 条目而调整;rum 删除了一个结果本未定义的查询;pllua 则是真实缺陷,新版本修复 CVE-2026-120143 后,其触发器循环使用 transition table 会导致服务器崩溃,包中已带修复。另外,14.25 是 PostgreSQL 14 的最终版本,之后不再有更新,应规划升级到更新的大版本。
Q&A
2026年11月PostgreSQL小版本发布包含哪些版本?
包含 PostgreSQL 18.7、17.12、16.16、15.20 和 14.25。
为什么这次小版本更新必须同时更新服务器和扩展?
因为修复 CVE-2026-6460 改变了复合类型存储和服务器与扩展的接口:旧扩展在新服务器上缺少安全校验,新扩展在旧服务器上会因未定义符号无法加载,所以必须一起更新。
CVE-2026-6460 的修复对扩展接口做了哪些具体改动?
DatumGetHeapTupleHeader() 从宏改为函数;heap_getattr() 现在调用新的 heap_datum_check()。这些头文件被编译进扩展,因此影响双向兼容。
更新时应该用什么命令确保服务器和扩展一起更新?
在 RHEL/Rocky/AlmaLinux/Fedora/Amazon Linux 上使用 sudo dnf update;在 SLES/openSUSE Leap 上使用 sudo zypper update。依赖关系通常会自动处理。
如果只更新服务器而保留旧扩展会有什么风险?
旧扩展仍能加载,但缺少修复中的安全检查,可能不受漏洞保护;此外,旧 pllua 包在新服务器上处理触发器过渡表时会崩溃。
PostgreSQL 14.25 有什么特殊意义?
14.25 是 PostgreSQL 14 的最终版本,之后不再有更新,需要规划升级到更新的主版本。
扩展包依赖要求发生了什么变化?
以前扩展包只要求 PostgreSQL 主版本;现在每个编译扩展要求至少当天的小版本,例如 Requires: postgresql18-libs >= 18.7,并且构建时要求匹配的 -devel 版本。
重建扩展时发现了哪些需要修复的问题?
pg_repack 的测试因 pg_attver 条目需要调整;rum 的测试中一个未定义结果的查询被移除;pllua 存在真实 bug,已修复并提交上游(pllua/pllua#19)。