Amazon Linux 2 安装 postgresql-contrib 导致 PostgreSQL 小版本自动升级问题总结
一、问题背景
在 Amazon Linux 2 系统上运行 PostgreSQL 14.x,为了使用 pg_trgm(支持模糊查询、GIN 索引),需要执行:
CREATE EXTENSION pg_trgm;
但在数据库中执行时出现错误:
ERROR: could not open extension control file
"/usr/share/pgsql/extension/pg_trgm.control": No such file or directory
说明服务器上 未安装 PostgreSQL 的 contrib 扩展包。
二、问题现象
在尝试通过 yum 安装扩展包时:
sudo yum install -y postgresql-contrib
发现 可能触发 PostgreSQL 的小版本自动升级,例如:
postgresql 14.12 → 14.20
postgresql-server 14.12 → 14.20
在生产环境中,这类“非预期升级”通常是被严格禁止的,因此必须搞清楚原因并避免风险。
三、问题原因分析(关键点)
1. Amazon Linux 2 的 PostgreSQL 包策略
在 Amazon Linux 2 中:
-
PostgreSQL 主程序包:
postgresql
postgresql-server
-
扩展包(包括 pg_trgm):
postgresql-contrib
pg_trgm 不在主程序包中,而在 contrib 包中。
2. yum 的依赖解析机制
查看仓库可用版本:
yum list available | grep postgresql
可以看到类似:
postgresql 14.20-1.amzn2.0.1
postgresql-contrib 14.20-1.amzn2.0.1
而当前系统已安装的是:
postgresql 14.12-1.amzn2.0.1
postgresql-server 14.12-1.amzn2.0.1
⚠️ 关键原因在这里:
-
postgresql-contrib 对 postgresql 有严格版本依赖
-
yum 为了满足依赖,会选择:
升级已安装的 PostgreSQL 到仓库中最新的小版本
这就导致了 “装插件 → 自动升级 PostgreSQL” 的现象。
四、如何验证是否会发生升级(强烈推荐)
在正式安装前,先做一次 dry-run:
yum install postgresql-contrib --assumeno
如果输出中包含类似:
Updating:
postgresql 14.12 → 14.20
postgresql-server 14.12 → 14.20
说明 直接安装会触发升级,此时应立即停止。
此处附完整输出
[root@Premium /home/ec2-user]# sudo yum install -y postgresql-contrib --assumeno
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.6 kB 00:00:00
amzn2extra-docker | 2.9 kB 00:00:00
amzn2extra-epel | 2.5 kB 00:00:00
amzn2extra-kernel-5.10 | 3.0 kB 00:00:00
amzn2extra-postgresql14 | 3.0 kB 00:00:00
amzn2extra-redis6 | 2.9 kB 00:00:00
epel/aarch64/metalink | 2.5 kB 00:00:00
neo4j | 3.0 kB 00:00:00
231 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package postgresql-contrib.aarch64 0:14.20-1.amzn2.0.1 will be installed
--> Processing Dependency: postgresql(aarch-64) = 14.20-1.amzn2.0.1 for package: postgresql-contrib-14.20-1.amzn2.0.1.aarch64
--> Running transaction check
---> Package postgresql.aarch64 0:14.12-1.amzn2.0.1 will be updated
--> Processing Dependency: postgresql(aarch-64) = 14.12-1.amzn2.0.1 for package: postgresql-server-14.12-1.amzn2.0.1.aarch64
---> Package postgresql.aarch64 0:14.20-1.amzn2.0.1 will be an update
--> Running transaction check
---> Package postgresql-server.aarch64 0:14.12-1.amzn2.0.1 will be updated
--> Processing Dependency: postgresql-server(aarch-64) = 14.12-1.amzn2.0.1 for package: postgresql-upgrade-14.12-1.amzn2.0.1.aarch64
---> Package postgresql-server.aarch64 0:14.20-1.amzn2.0.1 will be an update
--> Running transaction check
---> Package postgresql-upgrade.aarch64 0:14.12-1.amzn2.0.1 will be updated
--> Processing Dependency: postgresql-upgrade(aarch-64) = 14.12-1.amzn2.0.1 for package: postgresql-upgrade-devel-14.12-1.amzn2.0.1.aarch64
---> Package postgresql-upgrade.aarch64 0:14.20-1.amzn2.0.1 will be an update
--> Running transaction check
---> Package postgresql-upgrade-devel.aarch64 0:14.12-1.amzn2.0.1 will be updated
---> Package postgresql-upgrade-devel.aarch64 0:14.20-1.amzn2.0.1 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================================================================================================================================================================================================================
Package Arch Version Repository Size
=========================================================================================================================================================================================================================================================================================================
Installing:
postgresql-contrib aarch64 14.20-1.amzn2.0.1 amzn2extra-postgresql14 931 k
Updating for dependencies:
postgresql aarch64 14.20-1.amzn2.0.1 amzn2extra-postgresql14 1.6 M
postgresql-server aarch64 14.20-1.amzn2.0.1 amzn2extra-postgresql14 5.5 M
postgresql-upgrade aarch64 14.20-1.amzn2.0.1 amzn2extra-postgresql14 6.7 M
postgresql-upgrade-devel aarch64 14.20-1.amzn2.0.1 amzn2extra-postgresql14 1.2 M
Transaction Summary
=========================================================================================================================================================================================================================================================================================================
Install 1 Package
Upgrade ( 4 Dependent packages)
Total download size: 16 M
Exiting on user command
Your transaction was saved, rerun it with:
yum load-transaction /tmp/yum_save_tx.2025-12-17.00-55.Djmqg9.yumtx
五、安全解决方案(不升级 PostgreSQL)
方案一(最推荐):安装与当前版本一致的 contrib 包
如果仓库中仍保留旧版本:
sudo yum install postgresql-contrib-14.12-1.amzn2.0.1
优点:
-
不触发 PostgreSQL 升级
-
风险最低
-
操作最简单
方案二(生产环境通用):使用 yum versionlock 锁版本
1️⃣ 安装 versionlock 插件
sudo yum install -y yum-plugin-versionlock
2️⃣ 锁定 PostgreSQL 相关包
sudo yum versionlock add postgresql postgresql-server libpq
3️⃣ 再安装 contrib
sudo yum install -y postgresql-contrib
效果:
-
如果安装会导致升级,yum 会直接失败
-
明确防止“静默升级”
六、完成后操作
安装成功后:
CREATE EXTENSION IF NOT EXISTS pg_trgm;
验证:
SELECT name, installed_version
FROM pg_extension
WHERE name = 'pg_trgm';
七、总结
-
在 Amazon Linux 2 上,pg_trgm 位于 postgresql-contrib 包中
-
postgresql-contrib 与 PostgreSQL 主程序 存在严格的小版本依赖
-
直接使用 yum install postgresql-contrib 可能触发 PostgreSQL 小版本升级
-
生产环境必须提前 dry-run 或使用 versionlock
-
推荐优先使用 同版本 contrib 或 versionlock 锁版本
八、最佳实践建议
-
任何生产环境 yum 安装前先 --assumeno
-
对数据库核心组件启用 versionlock
-
不要在不了解依赖关系的情况下直接装“看似无害的插件”
-
最简单安全方案,停机安装插件,让带着pg一起升级
更多推荐
所有评论(0)