ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PostgreSQL版本选择实战指南:从维护周期到自建/云托管全解析

PostgreSQL版本选择实战指南:从维护周期到自建/云托管全解析 前阵子有个朋友找我说公司要上一套新的PostgreSQL环境他翻了一晚上教程有的让他装12有的说14稳妥还有人直接推荐17他彻底看晕了跑来问我到底该选哪个版本。这个问题看起来简单其实背后牵扯到维护周期、扩展生态、升级路径、甚至是云厂商和大版本的关系。版本选对了后面几年都省心选错了可能半年后就要加班做升级。我自己的经验是PostgreSQL的版本选择不能只看“最新”或者“别人推荐”而得看你的使用场景、部署方式、以及你愿意承担的运维成本。这篇文章我就从实际踩坑的角度把大版本、小版本、自建和云托管、迁移场景下怎么定版本这件事讲透。1. 大版本怎么选先看懂版本背后的维护周期1.1 一个版本能活多久社区承诺了什么PostgreSQL是开源的但开源不等于没有版本纪律。社区每年大概发布一个大版本比如2023年9月发162024年9月发172025年9月预计会发18。关键点在于每个大版本发布之后社区只会对它提供大约五年的bug修复和安全补丁。五年之后这个版本就进入EOLEnd of Life停止维护状态官方不再发布任何补丁。这意味着什么如果你的数据库跑在一个已经EOL的版本上遇到安全漏洞没人管遇到bug也没人修出了问题只能自己扛。对一个生产系统来说这是很难接受的风险。我之前接过一个现场客户的PostgreSQL还停在9.62021年底这个版本就已经EOL了但业务一直没升级。后来遇到一个和并发控制相关的bug社区早就修了但他们版本太老补丁根本打不进去最后只能紧急做迁移非常被动。所以“能用”和“被官方支持”是两回事选版本的时候第一个条件就是这个版本还在官方维护期内。1.2 截至2025年还在维护的版本怎么选截至2025年4月PostgreSQL官方仍在维护的大版本大概有这几个13、14、15、16、17。我把它们的情况列出来方便你对照着看。大版本发布时间大致维护到当前状态建议132020年9月2025年11月左右接近EOL不建议新项目使用正在用的抓紧规划升级142021年9月2026年11月左右维护中存量项目可继续用但要考虑后续升级152022年10月2027年11月左右维护中生产环境可用成熟稳定162023年9月2028年11月左右维护中目前最适合生产环境的版本172024年9月2029年11月左右维护中新项目优先考虑功能最全如果让我给一个简单结论新项目直接选17生产环境求稳选16已经在跑14、15的还可以继续用但要把升级排进规划。为什么新项目建议直接上17因为PostgreSQL的版本演进其实挺激进的17版本在备份、逻辑复制、vacuum效率、JSONB计算性能上都有明显提升。你新项目从17开始未来两三年内都有充足的时间窗口做技术迭代不会一上来就背一个旧版本的技术债。那为什么不建议所有生产环境都无脑选17因为很多第三方工具、监控插件、备份工具对最新大版本的支持会有延迟。比如有些老的监控脚本、ORM驱动刚开始可能没适配17直接上了之后反而要处理兼容性问题。生产环境用16是目前生态兼容性和功能之间的平衡点。还有一个小提醒很多人在网上看到“PostgreSQL双数版本比单数版本稳定”的说法这个我劝你别当成决策依据。这个说法更多是早期版本的民间经验PostgreSQL官方从来没有这种承诺。15和16出来后都有过各自的bug不存在单数版就做实验、双数版才稳的规律。1.3 为什么不要长期停在老版本我见过很多团队数据库一装就是五六年不升级。理由是“跑得好好的动它干嘛”。这个想法可以理解但代价很大。PostgreSQL每个大版本都有大量改进不夸张地说性能差距可能是一倍甚至更多。举几个我印象比较深的例子14版本改进了vacuum和索引维护机制B-tree索引去重、并行vacuum都有了明显提升15版本加入了MERGE语句还收紧了public schema的默认权限安全性增强16版本逻辑复制和并行查询能力提升很大性能监控视图也更丰富17版本直接支持了增量备份相关的原生能力备份策略可以做得更轻量。如果你一直停在13甚至更老的版本相当于这几年社区的优化一个都没吃到硬件不变的情况下SQL也可能越来越慢。而且版本越老升级路径越长将来做升级的难度和风险都会成倍增加。所以我的原则是一个PostgreSQL大版本上线后使用不超过两年就应该认真规划升级。不要让它变成“历史遗留问题”。2. 小版本和补丁版本最容易漏掉的坑2.1 小版本号里藏着什么很多人把PostgreSQL版本只看到大版本比如“我用的是16”但其实完整版本号长这样16.4、17.3、14.15。点号后面的就是小版本也叫补丁版本。小版本号不是随便加的它代表的是在这个大版本上修复了多少个bug和安全问题。PostgreSQL社区几乎每个季度都会发布一次补丁更新比如16.4就是16这个版本在第N次补丁更新时的状态。这些小版本修复的问题里有一部分是严重安全问题比如权限绕过、数据泄露、远程执行漏洞。还有一部分是数据可靠性问题比如复制异常、索引损坏、崩溃恢复失败等。不夸张地说延迟打小版本补丁比延迟升大版本更危险。我遇到过有团队PostgreSQL 16.0装好就再没升级过一直跑到16.4都出来了还在用16.0。后来查一个复制延迟的诡异问题发现官方在16.2就修了但他们还在老版本上白白排查了好几天。所以选版本不只是选大版本小版本同样重要。我的做法是每季度社区发布补丁后先在测试环境验证一两周内推到生产。这个节奏不算激进属于维护数据库的基本素养。2.2 怎么查看当前版本和判断是否需要升级这个很简单连上数据库执行一条SQL就能看到完整版本信息SELECT version();返回结果大概是这样的PostgreSQL 16.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0, 64-bit如果你想看内核版本号和编译信息还可以用这条SHOW server_version; SHOW server_version_num;server_version_num返回的是数字比如160004这个数字方便你写脚本比对版本。那怎么判断自己是否需要升级我一般看两点第一当前小版本是不是过于落后比如主版本号没变但小版本号比官方最新版落后两个以上第二官方补丁说明里有没有修复和你使用场景相关的安全问题。去官方查看补丁信息可以关注PostgreSQL官方release notes页面里面有每个版本修复内容的详细说明。不会有哪个网站比它更新得更快。2.3 小版本升级的最佳做法小版本升级一般有两种方式。第一种是用系统包管理器直接升级。如果你是用apt装的sudo apt update sudo apt install postgresql-16或者yum/dnfsudo dnf update postgresql-server这种方式会直接替换二进制文件但数据目录不会动。升级完成后需要重启数据库服务让新版本的内核生效。第二种是如果你用的是容器或者自己编译的二进制那就需要重新拉取对应大版本的最新镜像或重新编译然后替换掉旧的可执行文件。这里有几个实操中的注意事项升级前一定要做全量备份哪怕是小版本升级。我以前觉得小版本升级很安全跳过备份直接升结果有一次遇到pg_upgrade相关的意外折腾了一晚上。从此再也不敢不备份了。升级过程中需要停服或者重启实例最好选业务低峰期操作。升级后马上执行一次基础巡检比如查一下日志有没有异常、连接数是否正常、复制是否恢复。如果你开了流复制注意主备节点的版本要一致别出现主库升了备库没升的情况这会直接导致复制断掉。再提醒一句如果你用的是云数据库托管服务比如RDS PostgreSQL小版本升级通常是厂商自动处理或者一键触发这个后面我会详细说。3. 自建还是买云数据库版本选择的出发点完全不同3.1 自建自由但所有责任自己扛自建PostgreSQL版本选择完全由你控制你可以用官方源装17也可以自己编译部署。但反过来补丁升级、安全修复、备份恢复全部都要自己负责。自建场景下我建议这么做版本规划生产环境首选最近一年内发布且已发布过一个以上小版本的稳定版比如现在选16或17不要在生产环境用刚发布不到一个月的“首发版”等一个小版本补丁出来再用更稳测试环境可以激进一点用最新大版本提前验证未来要上的功能和兼容性。另外一个自建容易忽略的问题是操作系统发行版默认源里的PostgreSQL版本往往比较旧。比如Ubuntu 22.04默认源里是PostgreSQL 14Debian 12默认源里是15CentOS官方源里版本也偏老。如果你直接apt install postgresql装出来的大概率是几年前的版本。要装新版本最好使用PostgreSQL官方提供的apt/yum源也就是PGDG源。配置好后你能直接装到当前官方维护的最新大版本后续小版本升级也能跟上节奏。3.2 云托管选版本就是选策略云数据库托管服务的版本逻辑和自建有挺大差别。你不需要关心操作系统、补丁包、二进制文件主要看云厂商对每个大版本的支持周期。大多数云厂商会同时提供多个PostgreSQL大版本比如14、15、16、17然后给每个版本设置一个“不推荐使用”和“停止支持”的时间点。你在云上创建实例的时候会看到一个下拉框里面就是这些版本选项。我的选择原则是新建实例选择云厂商当前主推且维护能力最强的大版本。一般就是最新稳定版或次新版如果业务里有大量第三方应用依赖特定的驱动或ORM选版本前先确认这些中间件对目标版本的支持情况尽量避免选择“即将停止支持”的版本因为在云上EOL意味着实例有可能被强制升级或无法新购。云数据库还有一个优势绝大多数云厂商会帮你做小版本自动升级特别是在安全补丁发布后。如果你不想被自动升级打断也可以关闭自动升级手动选择一个维护窗口。但无论如何长期不看小版本更新在云上同样危险。3.3 Linux发行版默认源里的版本为什么总是落后这个问题很多人问过。为什么我用apt装的PostgreSQL版本那么老原因很简单操作系统发行版有自己的发布周期锁定在发行版发布那一刻的软件版本。Ubuntu 22.04是2022年发布的它的软件仓库里PostgreSQL版本就固定在那时候的主版本之后只会做安全修复不会主动升级到大版本。这其实是Linux发行版的经典取舍稳定优先。软件版本不追新只保证在当前范畴内的安全性。这对操作系统本身是合理的但对数据库这种需要长期演进的基础软件来说反而成了限制。所以自建的话建议别用系统默认源装PostgreSQL直接用官方PGDG源或者用二进制压缩包部署。这个选择带来的好处是你能自己决定大版本也能及时收到小版本更新。4. 从Oracle迁移过来时怎么定版本4.1 迁移项目里版本选择的几个现实约束最近几年从Oracle迁移到PostgreSQL的案例越来越多。如果你也是这个背景选PostgreSQL版本时要额外考虑几个现实因素。第一个是兼容性评估。PostgreSQL和Oracle在SQL语法、数据类型、存储过程语言上都有差异虽然有很多兼容性工具但迁移工作终究需要逐项验证。你选的大版本越新工具链对Oracle对象类型的支持通常越完善因为很多迁移工具会跟随PostgreSQL新版本做优化。第二个是团队技能。如果团队对PostgreSQL还比较陌生不要一上来就选最新版本追求极致功能稳定性更重要。先选一个生态兼容性成熟的版本把业务跑稳后续再规划升级。第三个是周边配套。比如你可能正在用某种数据同步工具做Oracle到PostgreSQL的增量同步这些工具对大版本的支持情况参差不齐。选版本前先确认你计划用的同步工具、ETL工具、BI连接器都支持目标版本。在版本选择上我的建议是迁移项目优先选16这个版本目前性能和生态都比较均衡。如果你要使用到17的新特性比如某些备份或逻辑复制的新能力再考虑直接上17。4.2 迁移链路与扩展兼容性检查清单做迁移之前我建议按下面这个清单过一遍确认PostgreSQL目标版本是否在你的迁移工具支持列表里确认数据库驱动版本是否支持目标PostgreSQL版本尤其是JDBC、ODBC、Python驱动确认要使用的扩展比如PostGIS、pgcrypto、uuid-ossp是否有对应目标版本的编译包检查原有Oracle对象类型在PostgreSQL里的对应实现比如序列、触发器、存储过程、物化视图准备一个全面的回归测试用例集迁移完逐项跑一遍。特别说一下扩展的问题。PostgreSQL的扩展是和版本绑定的一个扩展在不同大版本下可能是不同的二进制版本。比如PostGIS对PostgreSQL大版本要求很严格版本不匹配轻则无法安装重则运行时直接报错。选择大版本前先到扩展官方文档里确认支持矩阵能少踩很多坑。5. 我踩过的版本坑常见问题排查实录5.1 pg_dump版本不匹配最容易被忽视的导出问题我曾经在一台机器上用pg_dump去导另一台机器的数据库结果导出报了一堆看不懂的错误。后来一查是本地pg_dump版本太高远程数据库版本太老两边版本不兼容。pg_dump和数据库服务端版本不一致很容易出问题。官方说明是pg_dump的新版本可以导出旧版本的数据库但反过来不行旧版pg_dump无法连接新版数据库服务端。但就算新版导旧版也可能遇到某些特定对象导出异常。解决办法很简单用和你目标数据库大版本匹配的pg_dump客户端。比如要导出PostgreSQL 15的库就用PostgreSQL 15的pg_dump而不是11的。生产环境如果长期维护多个版本建议把不同版本的客户端工具分开安装避免混淆。5.2 扩展版本和PostgreSQL大版本不匹配这个坑我踩过好几次。最典型的是PostGIS有一次我在一个刚升级到17的环境里安装PostGIS直接提示没有可用的已编译包。原因是PostGIS的版本发布节奏和PostgreSQL大版本不完全同步。新的大版本发布后PostGIS可能需要几个星期甚至几个月才会发布对应的编译版本。如果你急着用就面临自己编译的麻烦。所以我现在养成一个习惯升级PostgreSQL大版本前先查清楚我要用的扩展是否已经支持目标版本。如果还没支持要么等要么就把升级计划延后。在生产环境里数据库内核版本和扩展版本必须一起考虑不能只盯着内核。5.3 逻辑复制跨大版本前进容易回退难PostgreSQL的逻辑复制原则上支持跨大版本比如从16复制到17是可以的。但这里有个前提逻辑复制通常是单项的你可以让订阅端比发布端新但反向做很难。实际操作中我做跨版本升级时都会借助逻辑复制做切换但从来不会忽略回退方案。逻辑复制带来的架构切换确实方便但一旦切换完成如果需要回退数据库结构和数据可能已经发生变化回退成本极高。这个问题的教训是别把逻辑复制当万能升级工具。在做跨大版本升级时无论用什么方案都先做全量备份并且保留升级前的所有备份文件至少保留一个完整的恢复验证记录。版本升级这件事看起来是技术操作实际上拼的是容错能力。5.4 用了系统默认源导致版本过老这个前面提过但是值得再说一次。很多人在装完PostgreSQL后才发现版本不对问“为什么我装的是14而不是17”十有八九是用了系统源。如果你要走自建部署直接到PostgreSQL官网找对应操作系统的源配置方式把官方PGDG源配好。Debian系和RedHat系都有现成步骤配好后就能直接安装到当前维护中的版本后续补丁也能及时拿到。5.5 升级后启动失败先看日志不管是小版本升级还是大版本升级重启数据库失败都是个常见故障。很多人一遇到启动失败就慌其实大部分问题在日志里已经写得很清楚了。PostgreSQL的日志默认在数据目录下的log目录里也可能被系统日志接管。排查顺序我一般是直接看PostgreSQL日志大多数情况下错误信息里会说明原因检查数据目录权限升级后如果换了用户或路径权限不对会导致启动失败确认新二进制版本和data目录的兼容性比如把14的data目录用15的二进制启动基本都会失败检查监听地址和端口冲突有时候是端口被占用导致启动不了。排错的核心思路是先看日志再做判断不要盲目重启。写在最后的经验版本选择这件事说白了就是在“新功能”和“稳定兼容”之间做平衡。我做了这么多年数据库相关工作最大的体会是PostgreSQL版本选型没有绝对的正确答案但有一套可以复用的判断框架——先确认版本还在维护期再评估周边生态是否已经跟上最后根据自己是自建还是云托管来做最终决定。我个人现在的默认组合是新业务无脑上最新的稳定大版本存量生产环境控制在次新版本每个季度固定节奏更新小版本。这套策略不算激进但能保证你不会被安全问题追着跑也不会因为版本太老而被技术生态淘汰。如果你现在也在纠结选哪个版本别只看网上零散的建议按照上面这些维度自己列个清单过一遍答案其实很清晰。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进