源码安装多版本PostgreSQL切换失败求助(Apache AGE开发)
从源码安装并维护多版本PostgreSQL(Ubuntu 22.04 LTS)
问题背景
作为Apache AGE扩展贡献者,需同时安装PostgreSQL 11、12、13版本用于测试/调试,已通过源码安装PG12,尝试在同一源码目录切换分支编译PG13后,pg_config显示路径指向/usr/local/pgsql-13但版本仍为12.14,尝试修改配置、安装依赖、设置环境变量等方法均无效,且不想通过修改端口同时运行多实例。
核心问题分析
在同一源码目录切换分支编译不同版本,即使执行make distclean也可能残留旧版本的编译缓存或依赖文件,导致新版本编译时仍调用旧版本组件;同时PATH环境变量中可能存在优先级更高的旧版本pg_config,引发版本识别错误。
正确操作步骤
1. 为每个版本准备独立源码目录
不要在同一目录切换分支编译,避免残留文件干扰:
# 分别克隆PostgreSQL仓库到不同目录 git clone https://git.postgresql.org/git/postgresql.git postgresql-11 git clone https://git.postgresql.org/git/postgresql.git postgresql-12 git clone https://git.postgresql.org/git/postgresql.git postgresql-13 # 进入各目录切换到对应稳定分支 cd postgresql-11 && git checkout REL_11_STABLE cd ../postgresql-12 && git checkout REL_12_STABLE cd ../postgresql-13 && git checkout REL_13_STABLE
2. 独立编译安装每个版本
为每个版本指定唯一的--prefix路径,确保文件完全隔离:
# 编译安装PG11 cd postgresql-11 make distclean ./configure --prefix=/usr/local/pgsql-11 make -j$(nproc) sudo make install # 编译安装PG12 cd ../postgresql-12 make distclean ./configure --prefix=/usr/local/pgsql-12 make -j$(nproc) sudo make install # 编译安装PG13 cd ../postgresql-13 make distclean ./configure --prefix=/usr/local/pgsql-13 make -j$(nproc) sudo make install
可选:添加
--without-readline --without-zlib参数,避免系统依赖与源码版本冲突。
3. 创建独立的数据目录并初始化实例
每个版本使用单独的数据目录,避免运行时冲突:
# 创建数据目录并设置权限 sudo mkdir -p /var/lib/postgresql/{11,12,13}/data sudo chown -R postgres:postgres /var/lib/postgresql/* # 切换到postgres用户初始化实例 sudo su - postgres # 初始化PG11 /usr/local/pgsql-11/bin/initdb -D /var/lib/postgresql/11/data # 初始化PG12 /usr/local/pgsql-12/bin/initdb -D /var/lib/postgresql/12/data # 初始化PG13 /usr/local/pgsql-13/bin/initdb -D /var/lib/postgresql/13/data exit
4. 快速切换版本的方法
临时切换(当前shell生效)
直接调整PATH和PGDATA环境变量:
# 切换到PG13 export PATH=/usr/local/pgsql-13/bin:$PATH export PGDATA=/var/lib/postgresql/13/data # 验证版本 pg_config --version # 启动/停止服务 pg_ctl start pg_ctl stop
永久切换(所有shell会话生效)
在~/.bashrc中添加别名:
echo "alias pg11='export PATH=/usr/local/pgsql-11/bin:\$PATH && export PGDATA=/var/lib/postgresql/11/data'" >> ~/.bashrc echo "alias pg12='export PATH=/usr/local/pgsql-12/bin:\$PATH && export PGDATA=/var/lib/postgresql/12/data'" >> ~/.bashrc echo "alias pg13='export PATH=/usr/local/pgsql-13/bin:\$PATH && export PGDATA=/var/lib/postgresql/13/data'" >> ~/.bashrc
执行source ~/.bashrc生效后,输入pg13即可切换到PG13环境,验证版本执行pg_config --version即可。
错误修复说明
- 同一目录切换分支编译的方法不可行,必须使用独立源码目录彻底隔离各版本的编译环境。
- 若仍出现版本显示错误,执行
which pg_config检查当前使用的命令路径,确保指向对应版本的/usr/local/pgsql-x.x/bin/pg_config,调整PATH优先级即可解决。
内容的提问来源于stack exchange,提问作者Carla
相关产品推荐
相关产品推荐

