一、问题背景

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

  • 推荐优先使用 同版本 contribversionlock 锁版本


八、最佳实践建议

  1. 任何生产环境 yum 安装前先 --assumeno

  2. 对数据库核心组件启用 versionlock

  3. 不要在不了解依赖关系的情况下直接装“看似无害的插件”

  4. 最简单安全方案,停机安装插件,让带着pg一起升级

更多推荐