Jeremy Schneider:Postgres 18.7 小版本再次破坏 ABI 兼容性

Jeremy Schneider:Postgres 18.7 小版本再次破坏 ABI 兼容性

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

PostgreSQL 18.7 在修复 CVE-2026-6460 时引入了 ABI 变更,导致 C 语言扩展需要重新编译,部分扩展还需修改源码。用户必须协调核心与扩展同步升级,否则扩展可能失效;AGE、pg_cron 等新扩展已不兼容 18.6。

🔎

延伸解读

ABI 变更的根源与影响

PostgreSQL 18.7 为修复 CVE-2026-6460,引入了复合数据类型版本检测逻辑,导致 C 语言扩展的 ABI 兼容性被破坏。这意味着所有 C 扩展必须重新编译,部分扩展甚至需要修改源码。虽然官方提供了 composite_type_mismatch 参数来禁用检查,但会带来安全风险。对于依赖扩展的用户,升级核心版本时需同步处理扩展,否则扩展可能完全失效。

升级顺序与协调风险

文章指出,核心与扩展的升级必须严格同步。由于新扩展可能依赖新版内部接口,旧版核心无法运行新扩展,因此应先升级核心,再升级扩展。但实际中,扩展包可能先于核心包到达更新渠道,导致扩展在旧核心上无法工作。作者自己的构建流水线就因此中断,AGE、pg_cron 等扩展的新版本已不兼容 18.6。用户需谨慎管理更新顺序,避免意外先获取扩展包。

打包生态的应对与用户注意事项

RPM 打包已通过添加头部要求特定小版本,来强制核心与扩展的版本匹配,但 Debian 生态是否跟进尚不明确。对于使用 Kubernetes 或 CloudNativePG 的用户,需确保构建流水线中核心与扩展同步更新。文章提醒,18.7 包含重要 CVE 修复,但用户能否获得这些修复取决于扩展是否兼容。因此,升级前应检查扩展的兼容性声明,并协调数据库与扩展的更新时机。

❓

Q&A

Postgres 18.7 小版本为什么又破坏了 ABI 兼容性?

因为 18.7 在修复 CVE-2026-6460 时引入了版本化逻辑,用于检测复合数据类型与元组描述符不匹配的情况。该变更需要重新编译 C 语言扩展,部分扩展还需修改源码,从而破坏了 ABI 兼容性。

Postgres 18.7 的 ABI 变更对 C 语言扩展有什么具体影响?

C 语言扩展需要重新编译,部分扩展还需要修改源代码才能继续使用。如果不重新编译或修改,扩展可能无法在 18.7 上正常工作。

升级到 Postgres 18.7 时,用户应该如何协调核心与扩展的更新?

用户必须确保核心 Postgres 和扩展同步升级,避免扩展包先于核心更新。建议先更新核心 Postgres 包,再更新扩展,并注意更新渠道中包的到达顺序,防止意外先获取到不兼容的新扩展。

哪些扩展已经因为 18.7 的更新而无法在 18.6 上运行?

AGE、credcheck 和 pg_cron 已经发布了新版本,这些新版本完全无法在 Postgres 18.6 上运行。

如果不想重新编译扩展,有没有办法绕过 18.7 的新检查?

可以设置新的服务器参数 composite_type_mismatch 来禁用这些检查,但这样做会带来安全风险。

Postgres 社区为什么通常努力避免破坏 ABI 兼容性?

因为破坏 ABI 兼容性会导致扩展无法在次要版本之间互操作,用户需要协调核心与扩展的升级,增加维护负担。社区通常努力避免这种情况,但此次为了修复 CVE-2026-6460 不得不做出例外。

🏷️

标签

➡️

继续阅读