CentOS系统更新PostgreSQL后版本未变更问题咨询
嗨,我之前碰到过好几个用户都踩过这个小版本更新的坑,咱们一步步来排查可能的原因:
1. 你可能只更新了部分PostgreSQL包,主程序包没跟上
CentOS上PostgreSQL的10系列是分多个包的,比如postgresql10-server(服务端)、postgresql10(客户端工具)、postgresql10-libs(依赖库)等等。如果你的更新命令只覆盖了部分包,就会出现版本不一致的情况。
检查方式:执行这条命令看看所有PostgreSQL 10相关包的版本:
yum list installed postgresql10*
如果看到有包还是10.1版本,那就是更新不完整。
解决办法:执行完整的更新命令,确保所有相关包都升级到10.2:
yum update postgresql10*
2. 系统PATH里优先加载了旧版本的二进制文件
有时候系统里可能存在多个PostgreSQL版本的二进制文件(比如之前手动编译安装过,或者残留了旧的路径),你的PATH环境变量里旧版本的目录排在前面,导致你执行psql --version时调用的是旧版本的客户端工具。
检查方式:
- 先看当前
psql命令的路径:which psql - 再查看系统的PATH顺序:
echo $PATH
如果输出的路径不是/usr/pgsql-10/bin(PostgreSQL 10系列官方yum源的默认路径),那就是问题所在。
解决办法:
- 临时验证:直接调用官方路径下的工具看版本:
/usr/pgsql-10/bin/psql --version - 永久修复:把
/usr/pgsql-10/bin加到PATH的最前面,可以编辑/etc/profile或者~/.bashrc,添加一行:export PATH=/usr/pgsql-10/bin:$PATH
然后执行source /etc/profile(或者对应的配置文件)让修改生效。
3. PostgreSQL服务没真正重启,旧进程还在跑
有时候执行restart命令看似成功,但实际上旧的服务进程没彻底终止,导致服务还是运行在10.1版本上。
检查方式:
- 查看postgres进程的详细信息:
ps aux | grep postgres - 直接查看服务端程序的版本:
/usr/pgsql-10/bin/postgres --version
解决办法:
- 先彻底停止服务:
systemctl stop postgresql-10 - 强制终止残留的postgres进程(谨慎操作,确保没有未提交的重要事务):
pkill -9 postgres - 再启动服务:
systemctl start postgresql-10 - 最后登录数据库,执行这条SQL查看最准确的服务版本:
SELECT version();
4. 混淆了客户端工具版本和数据库服务版本
要注意:psql --version显示的是客户端工具的版本,而数据库服务实际运行的版本需要在数据库内部用SELECT version();查看。有可能你只更新了服务端,但客户端工具没更新,反过来也有可能。
检查方式:
- 对比客户端版本:
psql --version - 对比服务端版本:登录数据库执行
SELECT version();
解决办法:如果客户端没更新,单独更新客户端包:
yum update postgresql10
内容的提问来源于stack exchange,提问作者Sébastien Clément

