使用pg_upgrade升级PostgreSQL 9.2到9.5时pg_ctl版本异常求助
嘿,这个坑我踩过好多次了——你只设置了LD_LIBRARY_PATH但没调整PATH环境变量,这就是系统还在找9.2版本pg_ctl的核心原因!
为什么会这样?
LD_LIBRARY_PATH只负责告诉系统去哪里找动态链接库文件(.so),而pg_ctl、pg_upgrade这类是可执行程序,系统是通过PATH环境变量来查找它们的。CentOS 7默认的PostgreSQL 9.2可执行文件通常在/usr/bin或/usr/pgsql-9.2/bin,而rh-postgresql95的可执行文件路径是/opt/rh/rh-postgresql95/root/usr/bin,如果这个路径没加入PATH或者优先级不够,系统自然会先找到旧版本的工具。
解决步骤
1. 临时调整PATH环境变量
先把9.5版本的bin目录加到PATH最前端,确保系统优先调用新版本工具:
export PATH=/opt/rh/rh-postgresql95/root/usr/bin:$PATH
执行完后验证一下:
which pg_ctl
如果输出是/opt/rh/rh-postgresql95/root/usr/bin/pg_ctl,说明PATH设置生效了。
2. 用绝对路径指定新旧版本工具(更稳妥)
如果不想依赖PATH,执行pg_upgrade时可以直接用-b和-B参数分别指定旧版本和新版本的bin目录,彻底避免路径混淆:
pg_upgrade \ -b /usr/pgsql-9.2/bin \ -B /opt/rh/rh-postgresql95/root/usr/bin \ -d /var/lib/pgsql/9.2/data \ -D /var/lib/pgsql/9.5/data
参数说明:
-b:旧PostgreSQL版本的bin目录-B:新PostgreSQL版本的bin目录-d:旧版本的数据目录-D:新版本的数据目录
3. 用SCL工具自动配置环境(推荐)
CentOS的Software Collections(SCL)提供了更省心的方式,执行下面的命令会启动一个已经配置好9.5环境变量的shell:
scl enable rh-postgresql95 bash
在这个shell里,PATH、LD_LIBRARY_PATH等变量都会自动设置为rh-postgresql95的对应路径,不需要手动调整。
4. 检查环境变量是否被覆盖
如果上面的设置没生效,检查一下你的~/.bashrc、/etc/profile或者其他启动脚本里有没有硬编码的旧版本PATH设置,这些可能会覆盖你临时export的变量。可以用下面的命令查看当前PATH内容:
echo $PATH
确认/opt/rh/rh-postgresql95/root/usr/bin出现在最前面即可。
内容的提问来源于stack exchange,提问作者davegreen100




