news 2026/9/11 5:04:43

PostgreSQL版本选择与升级迁移:从选型到实战的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PostgreSQL版本选择与升级迁移:从选型到实战的完整指南

先讲个我前阵子遇到的场景。有位做后端的朋友发消息问我,说团队新项目准备上线了,开发环境用的 PostgreSQL 15,测试下来也没毛病,但他看到 17 已经发布了,里面有增量备份、逻辑复制增强这些新功能,心里痒,问我是不是该直接上 17。我反问他一句:你知道 17 是 2024 年 9 月底才出的吗?他愣了几秒,说知道,但觉得新版本新气象,能少折腾就少折腾。

这个问题的本质,就是“PostgreSQL 版本选择”最常见的坑——越新越好。说实话,不做 DBA 的人很容易有这种直觉,好像数据库跟手机系统一样,更新就更流畅。但数据库不是 App,它是你的数据底座,选错版本、盲目升级,后面要付出的代价远超你的想象。这篇文章我就结合自己这些年管理 PostgreSQL 生产环境的经验,把版本选择的底层逻辑、选型维度、升级实操、以及从 Oracle 迁过来时最容易踩的语法差异,一次说清楚。

适合谁看?后端开发、运维、架构师、以及准备从其他数据库迁移到 PostgreSQL 的团队。文章不会写那种“一路 Next 安装完收工”的废话,重点放在你怎么判断该用哪个大版本、怎么规划升级路径、以及升级后又可能遇到哪些幺蛾子。我也尽量贴近实际,给出能直接抄作业的命令和步骤。

1. 版本编号与支持周期:先搞懂规则,才不会选错

1.1 PostgreSQL 的版本命名到底怎么回事

很多人对 PostgreSQL 版本的第一印象是“乱”。9.6、10、11、12……一直到 17,这编号跨度有点怪。其实原因不复杂:在 9.x 时代,PostgreSQL 走的是“大版本.小版本”惯例,比如 9.5、9.6,9.6 是个常规大版本;到了 2017 年发布 10.0 的时候,社区干脆把“大版本号”直接提高,不再保留两位数字,于是就有了 10、11、12 一直到现在的 17。

所以你要记住一个要点:PostgreSQL 的主版本号就是我们常说的“大版本”,比如 14、15、16、17 都是各自独立的功能版本;而 16.1、16.2、16.3 这类叫“小版本”或“补丁版本”,只修 bug 和安全漏洞,不引入新功能。换句话说,你在 16.1 上跑得好好的,升到 16.4,行为不会有本质变化,更稳,更安全。

很多老文章里会提到“PostgreSQL 奇数版本是开发版,偶数版本是稳定版”,这个说法在 9.x 时代确实存在,9.6 之后基本就不适用了。现在每个主版本都是正式发布版,不会拿奇数版本当实验品。如果你看到有人还在拿这个说事儿,可以直接判定他的信息停留在好几年前。

1.2 五年支持窗口:PostgreSQL 虽然没有 LTS,但胜似 LTS

PostgreSQL 官方没有像某些商业数据库那样弄一个“长期支持版”的概念,但它有一个硬性的支持策略:每个主版本发布后,社区会持续提供小版本更新(包含 bug 修复和安全修复),持续 5 年。过了这个窗口,你只能靠自己或者第三方商业支持。

举个例子,PostgreSQL 14 是 2021 年 9 月发布的,按 5 年计算,它的常规维护到 2026 年底左右结束。13 则是到 2025 年底,12 已经过了维护期。这个信息很关键,因为你在选版本时,不能只看功能,还得看这个版本“还能活多久”。

版本发布时间预计维护截止当前状态建议
172024-092029 年底新项目观望可用,生产环境建议等 17.1/17.2
162023-092028 年底目前最稳的主力选择
152022-102027 年底成熟稳定,适合保守团队
142021-092026 年底老系统仍可用,但要开始规划升级
13 及以下更早已停或即将停尽量别再用在生产环境

有了这个表,你再看“选哪个版本”的问题,思路就清晰多了:不是选“最新的”,而是选“正处于维护期内、且经过充分验证的版本”。

1.3 小版本更新不能拖

我见过不少团队,主版本盯得很紧,但小版本常年不更新。比如数据库一直停在 14.2,社区都发到 14.11 了,他也不知道。PostgreSQL 的小版本更新,通常包含一批安全修复,尤其是权限绕过、内存越界这类高危问题。虽然升级小版本确实需要重启实例,但窗口通常很短,相比安全风险,这个代价很值。

我的习惯是:每隔一两个月,或者官方发布安全通告时,就检查一次当前版本的最新小版本号。如果当前版本落后太多,先在预发环境升一轮,再排生产窗口。好多人一想到“升级”就头大,其实小版本升级比大版本安全得多,基本不会出现行为不兼容的问题。

2. 选型决策:稳定、生态和团队成本怎么平衡

2.1 你是求稳,还是想尝鲜

选 PostgreSQL 版本,第一个要明确的维度就是“稳定压倒一切”还是“新功能可以冒点险”。

如果你维护的是核心交易库、账务库、或者对外提供高可用服务的数据库,我的建议非常直接:不要用发布不满半年的大版本。PostgreSQL 社区虽然测试做得很足,但新版本的潜在 bug 往往是在大规模真实负载下才会暴露,而这类 bug 通常会在发布后的几个小版本里被修复。举个例子,17 刚发布时,我就见过有人在分区表某些操作下被 bug 坑到,后来 17.1 修复了。你要是直接拿 17.0 上生产,风险全得自己扛。

反过来,如果你做的是内部系统、数据分析平台、或者没有强 SLA 的互联网应用,适当追新是可以的,毕竟新版本在性能、运维便利性上确实有提升。但即便这样,也建议至少等到 .1 或 .2 的小版本再上,别拿 .0 当小白鼠。

2.2 扩展生态:版本锁定比你想的严重

PostgreSQL 强大的原因之一就是扩展生态丰富,但每次大版本升级,扩展往往需要重新编译或跟随适配。像 PostGIS、TimescaleDB、pgvector、pgaudit 这些知名扩展,大版本发布时经常晚于 PG 主版本。所以你在选 PG 版本时,一定得先问一句:我需要用的扩展,在这个版本上有可用的稳定版吗?

我之前有一个项目,因为想用某个时序数据库扩展的最新特性,不得不把 PostgreSQL 从 16 升到 17,但在测试环境第一次跑CREATE EXTENSION就报了版本不匹配,折腾了一天才发现官方适配版还没发布,又退回 16。这个坑相当典型。正确的做法是:在决定版本前,去对应扩展的官方文档或 GitHub Releases 页面,确认它支持哪个 PG 主版本,别等装完数据库再补救。

2.3 操作系统与部署方式会限制你的选择

另一个很多人忽略的因素是操作系统自带的软件源版本。Ubuntu、Debian、RHEL 系的默认源里,PostgreSQL 版本往往偏旧。比如 Ubuntu 24.04 默认源里的 PostgreSQL 是 16,这还好;但某些更早的发行版可能只带 13 甚至 12。如果你没有用官方仓库(PGDG),直接apt install postgresql,装出来的版本大概率不是你想要的最新版。

如果你一定要用某个特定主版本,正确做法是配置 PostgreSQL 官方提供的 APT/YUM 源,然后按需安装。比如在 Ubuntu 上要通过 PGDG 装 PostgreSQL 16,可以这样操作:

# 安装基础依赖和 GPG 密钥 sudo apt install -y curl ca-certificates sudo install -d /usr/share/postgresql-common/pgdg sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc \ --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' sudo apt update sudo apt install -y postgresql-16

装完之后,你会发现系统里会多出来/usr/lib/postgresql/16/bin这一套独立工具链,和旧版本共存完全没问题。这其实是 PostgreSQL 的一个优势:多版本并行安装不冲突,你可以在同一台机器上保留多个大版本,平滑过渡。这也为后面的升级提供了便利。

2.4 团队能力和配套工具链也不能忽略

选版本的时候,最好把团队里其他人的经验也算进去。如果你的团队对某个版本已经很熟,明明 16 能满足需求,就没必要为了追新去引入 17,给团队增加学习成本。数据库是基础设施,学习曲线集中在“问题排查”上,版本太新,网上踩坑资料少,出了问题只能自己啃源码,这对小团队来说并不友好。

另外,ORM、驱动、备份工具、监控面板对版本的支持情况也要提前确认。比如一些比较老的 JDBC 驱动或者 Python 驱动,对新版本的scram-sha-256认证、新数据类型支持不够完善。选版本之前,顺手查一下你依赖的那些客户端库是否兼容,能省掉后面联调时的很多麻烦。

3. 不同使用场景下的版本推荐:别一把尺子量到底

3.1 全新项目:我现在的默认推荐是 16

如果今天有个全新项目来找我,说数据库随便选,没有历史包袱,我会默认推 PostgreSQL 16,并且选当前最新的小版本。原因很简单:16 已经是 2023 年 9 月发布的版本,到现在已经过了好几个小版本迭代,社区反馈和生产验证都比较充分,同时它还在五年支持窗口的中前段,未来几年不用为 EOL 发愁。功能上,16 带来的逻辑复制性能提升、vacuum 加速、pg_stat_io视图等,对日常运维非常友好。

至于 17,功能确实香,像增量备份、逻辑复制的主备切换优化、COPY性能提升,都是实打实的进步。但我的建议是:等它的小版本到 .2 或 .3 之后,再在评估环境里跑一轮压测,确认没有大坑后再进生产。如果你愿意做“半年的观察者”,17 的中后期会是很香的选择。

3.2 已有老系统:先看支持截止日期,再决定升级窗口

如果你维护的还是 13、12 这种老版本,我的建议是别等 EOL 那天再折腾,现在就排升级计划。因为一旦官方停止小版本更新,你的数据库就裸奔在安全风险里,任何已知漏洞都没有免费补丁可用。

老系统升级有个原则:不要跳太多版本。PostgreSQL 官方对 pg_upgrade 支持跨版本升级,但跨太多大版本时,行为和配置差异会叠加,排查问题的复杂度会成倍上涨。比较稳的做法是逐级升级,比如 13 -> 14 -> 15 -> 16,每一级验证通过后再往上走。如果嫌麻烦,可以考虑逻辑导出导入的方式一步到位,但这对大库来说停机时间更明显,后面我会详细说。

3.3 高并发、大数据量场景:对版本特性要有取舍

在高并发场景下,版本选择更多是看你想解决什么问题。比如你当前最头疼的是 vacuum 压力大,那么 16 里对 vacuum 的改进就能解近渴;如果你需要做在线逻辑复制,并且希望主备切换后复制不中断,17 的逻辑复制增强就很有价值。但一定要记住:数据库版本是基础设施,不能为了某一个特性就盲目升级,你要把“该特性带来的收益”和“升级整体的风险与工作量”放在一起权衡。

我见过一个团队,为了用 17 的增量备份功能,把整套核心系统从 16 强升到 17,结果备份插件、监控脚本全都需要改造,上线前焦头烂额。后来他们反思,其实用 16 的pg_basebackup+ WAL 归档也够用,折腾一圈并没有本质进步。

3.4 学习、测试、本地开发:最新版随便用

如果你的场景是学习、写博客、个人项目、或者验证某个新功能,那完全没有必要保守,直接用最新版就好。最新版能让你第一时间感受 PostgreSQL 的发展方向,比如性能提升、更现代的 SQL 特性。这时候“踩坑”反而是好事,因为你在低风险环境里提前积累了经验。等你在本地把新版本玩熟了,未来生产环境升级时,你对它就不是一无所知了。

4. 升级与迁移实操:从 15 到 16/17 的完整路径

4.1 升级前必须做的四件事

不管你是从 15 升 16,还是从 14 一路升上来,升级前有几件事不能跳过。第一,确认当前版本和扩展清单,记录所有已安装扩展的版本,尤其是 PostGIS、pgvector 这类二进制扩展;第二,分析数据库中是否存在废弃对象、权限异常或无效索引,可以提前跑一遍REINDEXVACUUM ANALYZE;第三,备份,而且要验证备份可恢复,别等到升级失败才发现备份是坏的;第四,检查所有连接数据库的客户端驱动版本,是否支持目标版本。

这里我多说一句,平时很多人习惯用pg_dumpall做备份,但在大版本升级场景下,我更推荐pg_basebackup或文件系统级快照,因为它保留的是物理一致的数据目录。逻辑备份过程中可能丢失序列值、权限这类细节,物理备份则没有这个问题。而且物理备份是升级失败后回滚的唯一可靠途径。

4.2 方案一:pg_upgrade 原地升级,快但要求停机窗口

pg_upgrade是 PostgreSQL 官方提供的原生升级工具,原理是在旧数据目录旁边生成一套新版本的数据文件,支持直接链接旧文件以减少磁盘占用和拷贝时间。它的优点是速度快,尤其适合大库;缺点是需要停机,并且在升级过程中新旧版本二进制必须共存。

以一个典型的从 15 升到 16 的流程为例:

# 假设你已经通过 PGDG 安装了 postgresql-16 # 1. 先用新版本的 initdb 初始化一个空的新数据目录 sudo -u postgres /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16data # 2. 停掉旧集群 sudo pg_ctlcluster 15 main stop # 3. 跑一次预检查(重要,不要跳过) sudo -u postgres /usr/lib/postgresql/16/bin/pg_upgrade \ -b /usr/lib/postgresql/15/bin \ -B /usr/lib/postgresql/16/bin \ -d /var/lib/postgresql/15/main \ -D /var/lib/postgresql/16data \ --check # 4. 检查通过后,正式升级,--link 模式可以极大减少拷贝时间 sudo -u postgres /usr/lib/postgresql/16/bin/pg_upgrade \ -b /usr/lib/postgresql/15/bin \ -B /usr/lib/postgresql/16/bin \ -d /var/lib/postgresql/15/main \ -D /var/lib/postgresql/16data \ --link # 5. 启动新集群 sudo pg_ctlcluster 16 main start # 6. 升级成功后,脚本会自动生成 analyze_new_cluster.sh,记得执行 sudo -u postgres ./analyze_new_cluster.sh

这里有个容易被忽略的细节:--link模式本质上是将旧数据文件硬链接到新数据目录,因此新旧目录必须在同一个文件系统上。如果你不确定,就别加--link,老老实实让pg_upgrade拷贝文件,虽然慢,但更靠稳。升级完成后,旧的 15 数据目录不要立刻删,保存一段时间,确认线上运行无异常再清理。

pg_upgrade有一个隐含限制:官方原则上支持跨多个大版本升级,但实际操作中我建议不要直接跨太多版本。比如 9.6 直接升到 16,虽然工具上可能允许,但 9.6 到 10 变更了默认scram-sha-256认证策略、10 到 13 又改了一堆并行查询行为,之前很多隐藏的兼容性问题会在升级后集中爆发。跨多个版本时,逐级升虽然费时间,但排查问题的成本反而更低。

4.3 方案二:逻辑迁移,跨平台和不降低停机的折中

如果你需要跨操作系统迁移、或者停机窗口短到不能跑pg_upgrade,可以考虑逻辑迁移。逻辑迁移有两种常见思路:一种是用pg_dump/pg_restore导出导入数据;另一种是基于发布订阅的逻辑复制,实现准在线迁移。

pg_dump / pg_restore适合数据量在几百 GB 以内、能接受数小时停机的场景。命令上大致是:

# 在旧库上导出 pg_dump -h old_host -U user -Fc -d old_db > old_db.dump # 在新库上恢复,-j 开并行可以提速 pg_restore -h new_host -U user -d new_db --no-owner -j 4 old_db.dump

pg_dump有个容易踩的坑:默认不会导出表空间和某些角色权限,恢复后要记得补。另外,大对象、序列值这些细节,恢复后要验证一遍,别想当然。

发布订阅的方式更适合需要把停机窗口压缩到分钟级的场景。你可以先在目标库建好表结构,然后在旧库上创建发布,在新库上创建订阅。这个过程中需要注意:初始同步时如果数据量大,会在旧库产生 WAL 堆积,要提前评估磁盘空间;其次,在切换读写之前,要确保追平位点。我习惯在切换前用一条业务侧的校验 SQL,比如对核心表做SELECT count(*)和关键字段的 checksum 校验,确保两边数据一致,再执行应用层切换。

4.4 升级后不能偷懒的收尾工作

升级成功后,第一件事不是庆祝,而是重新收集统计信息。pg_upgrade生成的analyze_new_cluster.sh已经把这事做了,但如果你用其他方式升级,一定要手动执行ANALYZE,否则规划器拿着旧统计信息很容易产生烂执行计划。

第二件事是检查扩展,尤其是二进制扩展。pg_upgrade在预检查阶段会报告哪些扩展不兼容,你要在升级后的库里重新执行CREATE EXTENSION或者升级扩展版本。比如 PostGIS,通常需要刷新到与 PG 16 配套的版本。

第三件事是更新连接配置和监控脚本。如果从旧版本升上来,pg_hba.conf的默认认证方式、postgresql.conf里的参数默认值都可能变化,不要太相信旧配置能直接套用。可以对照目标版本的postgresql.conf.sample逐项过一遍,避免因为某个参数在新版本中已被弃用而导致报警异常。

4.5 回滚预案:宁可不用,不能没有

听我一句劝:任何数据库升级,都必须准备回滚方案。我在生产环境做过很多次升级,最紧张的一次就是从一个存在坏块风险的旧库升级,当时旧数据目录在升完后被我一时手快删了,后来新库出现了一个查不到原因的锁等待,我整整紧张了一个下午,最后发现是监控连接打满了连接数,跟数据损坏没关系,但那个过程足以让我记住教训。

现在我的规矩是:升级前完整保留旧版本的 base 备份,升级过程中不动旧数据目录,升级完成后至少观察一个业务周期再清理旧目录。如果你用了pg_upgrade --link,旧数据目录里的文件在物理上已经指向了新版本,回滚就没那么灵了,所以更应该在升级前做一份独立于数据目录之外的pg_basebackup

# 升级前做物理备份 sudo -u postgres pg_basebackup -h 127.0.0.1 -U replicator \ -D /backup/pg15_before_upgrade -Ft -z -P

备份不是做给别人看的,是真正出问题时救命的。这个东西可能一年用不上一次,但用上一次就值回所有成本。

5. Oracle 与 PostgreSQL 语法差异:迁移时避开这些坑

5.1 为什么语法差异会影响版本选择

很多团队是从 Oracle 往 PostgreSQL 迁的,或者同时用这两套库做异构数据同步。这时候你会发现,选 PostgreSQL 版本其实不光是选版本,还涉及你的 SQL 能否平滑迁移。PostgreSQL 从 15 开始支持MERGE,这是很多人从 Oracle 迁移时的刚需语法,因此你会看到不少迁移项目把 15 当最低底线。这也说明一个道理:版本选择必须结合你手上的历史包袱。

如果你们团队对 Oracle 语法依赖很深,选 PostgreSQL 16 或 17 能减少一部分改写工作量,但还有很多细节是版本解决不了的,得靠业务侧调 SQL。

5.2 最容易踩的几类语法差异

Oracle 和 PostgreSQL 虽然都是关系型数据库,但细节差异非常多。下面几个是我在迁移项目里反复遇到的类型:

字符串拼接与NULL处理:Oracle 里||拼接时,遇到NULL结果就是NULL,而且 Oracle 的空字符串''本身也等价于NULL;PostgreSQL 则认为空字符串是合法的非 NULL 值,拼接时不会吞掉它。这会对报表里大量拼接字段造成结果不一致。

分页查询:Oracle 传统写法是ROWNUM,或者是 12c 以后的FETCH FIRST;PostgreSQL 的标准写法是LIMIT/OFFSET。迁移时不只是换关键词,还要注意在大偏移量下性能下降的问题。

数据类型:Oracle 的NUMBER对应 PostgreSQL 的numeric,但要注意精度和舍入行为;VARCHAR2对应varchar,但字符集和默认长度的语义不同。最坑的是日期类型,Oracle 的DATE是带时分秒的,PostgreSQL 的date只到天,如果代码里把DATE当时间用,迁移后经常出现“日期对不上”的诡异问题。

序列与自增字段:Oracle 里主键常用SEQUENCE.NEXTVAL,PostgreSQL 推荐generated ... as identityserial,两者在事务回滚后的单调性和间隙行为上有差别,依赖“连续自增”逻辑的应用在迁移时需要改写。

函数差异:NVL要改成COALESCESYSDATE要改成now()current_timestampDECODE建议改成CASE WHEN。注意COALESCENVL在类型推断和性能表现上并不完全一样。

5.3 一个速查表,迁移时直接对照

场景Oracle 写法PostgreSQL 写法
字符串拼接a || b,注意 NULL 扩散a || b,空字符串不会吞掉,建议用CONCAT(a, b)
分页WHERE ROWNUM <= 10LIMIT 10
空值替代NVL(col, 0)COALESCE(col, 0)
当前时间SYSDATEnow()CURRENT_TIMESTAMP
自增主键SEQUENCE.NEXTVALGENERATED ALWAYS AS IDENTITY
日期是否带时间DATE类型带时分秒timestamp才带,date不带
批量插入INSERT ALLINSERT INTO ... VALUES ... , ...
MERGEMERGE INTO ...(10g 起支持)15 起支持MERGE,语法相近但行为有差异

这里有一个心态上的建议:不要指望用orafce这类兼容层把 Oracle 语法完整翻译成 PostgreSQL。兼容层能解决一部分简单 SQL,但遇到复杂查询、存储过程、包、触发器时,终究还是要重写。与其在兼容层里纠结,不如把迁移当成一次业务 SQL 现代化的机会。

6. 常见问题与排查思路速查

6.1 我整理的常见问题清单

整理一份我在实际升级、迁移过程中见过的高频问题,用一张表列出来,方便你以后对号入座。

现象可能原因处理思路
pg_upgrade --check报扩展不兼容目标版本还没适配当前扩展升级前先查看扩展官方支持矩阵,必要时先删扩展或换替代方案
升级后某条慢 SQL 执行计划变差统计信息未更新或参数默认值变化全库ANALYZE,对比新旧两版计划,调整work_memrandom_page_cost
逻辑订阅初始同步卡住旧库 WAL 量巨大,磁盘被塞满增大max_slot_wal_keep_size,分批次迁移大表
新库无法用密码登录认证方式从md5换成了scram-sha-256检查pg_hba.conf,确认客户端驱动支持 SCRAM,或重新设置密码
迁移后日期显示差 8 小时/错位数据库时区与会话时区不一致统一使用timestamptz,应用层传带时区的值,别靠数据库默认时区
扩展编译时报pg_config找不到新版本二进制目录不在 PATH 中明确指定PG_CONFIG=/usr/lib/postgresql/16/bin/pg_config再编译
CREATE EXTENSION提示版本不受支持扩展安装的是旧版本编译产物卸载旧扩展,重新用新版本源码编译安装,再创建扩展
升级后postmaster.pid残留导致无法启动上次停库未正常结束确认没有相关进程后,删除旧postmaster.pid,再启动

6.2 一个容易被忽视的坑:第三方 AI 辅助工具的干扰

这段时间“AI 编程助手免费版无法选择模型,提示要升级到 Pro”之类的问题在网上讨论得很多。在数据库选型这件事上,我的态度很明确:AI 工具能帮你写代码、解释报错、生成 yaml,但它替代不了你对关键依赖版本的技术判断。工具弹窗让你升级,那是它自己的商业化策略,你不应该因为一个免费功能受限,就改变数据库版本这种底层决策。

正确做法是:该看官方 release notes 就看,该做性能测试就做,该找社区邮件列表查历史 bug 报告就查。AI 给的建议可以作为参考,但最终判断要落在官方文档和你的实测数据上。数据库版本一旦定错,跑半年再想换,成本远比想象中高。

6.3 设计一个“上线前检查清单”

我把自己的经验整理成一份可复用的检查清单,每次 Postgres 版本升级前过一遍,能少踩很多坑:

  • 确认目标版本处于官方支持窗口期。
  • 确认所有第三方扩展在目标版本有可用版本。
  • 确认客户端驱动、ORM、备份工具兼容目标版本。
  • 生产环境保留一份可恢复的物理备份。
  • 在预发环境完整跑一遍pg_upgrade --check
  • 升级后执行全库ANALYZE,对比核心 SQL 的耗时。
  • 观察逻辑复制延迟、连接数、WAL 生成速率等关键指标。
  • 设置旧版本数据目录保留期和最终清理时间。

这个过程不一定非要 DBA 才能做,后端开发自己也能按着清单来。关键是别把升级当“一键操作”,每一步都要有明确的目的和验证标准。

我的选型习惯与一点小建议

做了这么多年数据库相关工作,我现在的习惯其实很简单:新项目默认用当前主流的 PG 16 最新小版本;生产环境升级不会追着最新大版本跑,等它出生至少半年、小版本迭代到 .2 或 .3 之后再认真评估;老系统则一定以官方支持截止日期倒排升级计划,绝不让数据库裸奔超过 EOL。

最后再分享一个小技巧。选型这件事,建议写进团队的技术决策记录里。比如团队来了新同学,问你“为什么我们不用 PG 17”,你能翻出半年前的决策记录,写清楚当时是因为扩展不兼容、还是因为某个性能问题暂时没验证,这比每次口头解释一遍高效得多,也能避免团队里每个人上来都按自己的喜好装最新版。数据库版本选择从来不是一道“最新最好”的单选题,它是维护成本、生态兼容、安全窗口和团队经验这四件事的综合平衡。希望这篇文章能帮你把这道题做对。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 5:04:39

微服务异步事件总线设计:可靠投递与高可用实战

微服务架构折腾到现在&#xff0c;注册发现、配置中心、网关、熔断限流这些基础设施已经算不上什么新鲜事了。真正让人头疼的&#xff0c;恰恰是服务之间的数据一致性和异步协作问题。我见过太多团队把服务拆得稀碎&#xff0c;结果一次下单请求串联调用七八个服务&#xff0c;…

作者头像 李华
网站建设 2026/9/11 5:03:02

振动环境下接近感知系统的抗干扰优化方案

1. 振动源干扰下的接近感知挑战在工业自动化、机器人导航和智能安防等领域&#xff0c;接近感知系统常面临振动环境下的误判问题。当振动源与传感器距离小于1米时&#xff0c;传统基于单一信号强度的接近检测算法会出现高达30%的误报率。去年我们在汽车装配线上部署的接近传感器…

作者头像 李华
网站建设 2026/9/11 5:01:51

树莓派Pico低功耗实战:休眠API与功耗优化全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 5:00:49

V93000与SmarTest 8入门:从零构建ATE测试程序的完整路径

干这行的人迟早会撞上一台叫V93000的机器。我当年刚转做ATE测试工程师&#xff0c;第一次踏进实验室看到测试头展开的样子&#xff0c;说实话挺震撼——几层板卡密密麻麻插在一起&#xff0c;旁边立着Linux工作站&#xff0c;上面跑着一个叫SmarTest的软件。带我的老工程师丢给…

作者头像 李华
网站建设 2026/9/11 4:57:12

Druid连接池生产实践与性能优化指南

1. Druid连接池核心价值解析数据库连接池作为现代应用架构中的关键组件&#xff0c;其重要性往往被开发者低估。在实际生产环境中&#xff0c;我们曾经历过因连接池配置不当导致的连锁反应&#xff1a;某次促销活动期间&#xff0c;不当的maxActive参数设置导致连接耗尽&#x…

作者头像 李华