Skip to content

PostgreSQL 多版本共存安装

在实际运维场景中,经常需要在同一台服务器上安装多个PostgreSQL版本,用于测试、迁移验证或不同应用需求。PostgreSQL支持安全的多版本共存,通过隔离的数据目录、配置文件和端口实现。

1. 多版本共存的设计原则

1.1 隔离原则

  • 数据目录隔离:每个版本使用独立的数据目录
  • 配置文件隔离:每个版本有自己的postgresql.conf、pg_hba.conf等配置文件
  • 端口隔离:每个实例使用不同的TCP端口
  • 服务名隔离:在系统服务中使用不同的服务名称

1.2 版本选择考虑

  • 生产环境建议使用LTS版本
  • 测试环境可以安装最新稳定版和即将升级的目标版本
  • 考虑版本之间的兼容性,特别是扩展和功能

2. Linux 系统多版本共存安装

2.1 使用包管理器安装多版本

Debian/Ubuntu

bash
# 安装默认版本(如15)
sudo apt update
sudo apt install postgresql postgresql-contrib
# 安装特定版本(如14)
sudo apt install postgresql-14 postgresql-client-14 postgresql-contrib-14
# 安装另一个版本(如13)
sudo apt install postgresql-13 postgresql-client-13 postgresql-contrib-13

CentOS/RHEL

bash
# 安装PostgreSQL官方仓库
# 安装15版本
sudo dnf install postgresql15 postgresql15-server postgresql15-contrib
# 安装14版本
sudo dnf install postgresql14 postgresql14-server postgresql14-contrib
# 安装13版本
sudo dnf install postgresql13 postgresql13-server postgresql13-contrib

2.2 二进制安装多版本

  1. 下载不同版本的二进制包

    bash
    # 下载15版本
    wget https://ftp.postgresql.org/pub/source/v15.4/postgresql-15.4.tar.gz
    # 下载14版本  
    wget https://ftp.postgresql.org/pub/source/v14.9/postgresql-14.9.tar.gz
    # 解压
    tar -xzf postgresql-15.4.tar.gz
    tar -xzf postgresql-14.9.tar.gz
  2. 编译安装到不同目录

    bash
    # 编译安装15版本到 /usr/local/pgsql15
    cd postgresql-15.4
    ./configure --prefix=/usr/local/pgsql15
    make && sudo make install
    # 编译安装14版本到 /usr/local/pgsql14
    cd ../postgresql-14.9
    ./configure --prefix=/usr/local/pgsql14
    make && sudo make install
  3. 创建独立的数据目录

    bash
    # 创建数据目录
    sudo mkdir -p /data/pgsql15 /data/pgsql14
    sudo chown -R postgres:postgres /data/pgsql15 /data/pgsql14
    # 初始化数据库
    sudo -u postgres /usr/local/pgsql15/bin/initdb -D /data/pgsql15
    sudo -u postgres /usr/local/pgsql14/bin/initdb -D /data/pgsql14
  4. 配置不同端口

    bash
    # 修改15版本的端口为5432
    sudo -u postgres sed -i 's/#port = 5432/port = 5432/' /data/pgsql15/postgresql.conf
    # 修改14版本的端口为5433
    sudo -u postgres sed -i 's/#port = 5432/port = 5433/' /data/pgsql14/postgresql.conf
  5. 创建系统服务

    • 为每个版本创建独立的systemd服务文件

2.3 管理多版本实例

bash
# 启动不同版本的服务
sudo systemctl start postgresql@15-main
sudo systemctl start postgresql@14-main
# 连接到不同版本
sudo -u postgres psql -p 5432  # 连接15版本
sudo -u postgres psql -p 5433  # 连接14版本
# 查看所有运行的PostgreSQL实例
sudo ss -tuln | grep 543

3. Windows 系统多版本共存安装

3.1 使用官方安装程序

  1. 下载不同版本的安装程序

    • 从PostgreSQL官网下载不同版本的Windows安装包
    • 例如:postgresql-15.4-1-windows-x64.exe 和 postgresql-14.9-1-windows-x64.exe
  2. 安装第一个版本(如15)

    • 运行安装程序,按照向导进行安装
    • 选择默认数据目录:C:\Program Files\PostgreSQL\15\data
    • 默认端口:5432
    • 服务名:postgresql-x64-15
  3. 安装第二个版本(如14)

    • 运行安装程序
    • 关键选择
      • 安装目录:C:\Program Files\PostgreSQL\14\
      • 数据目录:C:\Program Files\PostgreSQL\14\data
      • 端口:5433(必须与第一个版本不同)
      • 服务名:postgresql-x64-14(自动生成不同名称)
  4. 验证安装

    • 打开服务管理器,确认两个PostgreSQL服务都已安装
    • 使用pgAdmin或psql连接不同端口验证

3.2 使用二进制文件手动安装

  1. 下载二进制文件

    • 下载不同版本的Windows二进制包
    • 解压到不同目录,如 C:\pgsql15C:\pgsql14
  2. 初始化数据目录

    cmd
    REM 初始化15版本,端口5432
    C:\pgsql15\bin\initdb.exe -D C:\pgsql15\data -U postgres -W
    REM 初始化14版本,端口5433
    C:\pgsql14\bin\initdb.exe -D C:\pgsql14\data -U postgres -W
  3. 注册为系统服务

    cmd
    REM 注册15版本服务
    C:\pgsql15\bin\pg_ctl.exe register -N postgresql-15 -D C:\pgsql15\data -S auto
    REM 注册14版本服务  
    C:\pgsql14\bin\pg_ctl.exe register -N postgresql-14 -D C:\pgsql14\data -S auto

4. macOS 系统多版本共存安装

4.1 使用Homebrew安装

bash
# 安装最新版本(默认)
brew install postgresql
# 安装特定版本
brew install postgresql@14
brew install postgresql@13
# 链接需要的版本
brew link postgresql@14  # 链接14版本
brew link postgresql@13  # 链接13版本

4.2 使用PostgreSQL.app

PostgreSQL.app支持多版本管理:

  1. 下载并安装PostgreSQL.app
  2. 在应用中,点击"+"按钮添加不同版本
  3. 每个版本可以独立启动/停止
  4. 自动管理不同版本的数据目录和端口

5. 多版本共存的最佳实践

5.1 环境变量管理

  • 为每个版本创建环境变量脚本
  • 例如,创建 pg15_env.shpg14_env.sh
bash
# pg15_env.sh
export PATH=/usr/local/pgsql15/bin:$PATH
export PGDATA=/data/pgsql15
export PGPORT=5432
export PGUSER=postgres
# pg14_env.sh
export PATH=/usr/local/pgsql14/bin:$PATH
export PGDATA=/data/pgsql14
export PGPORT=5433
export PGUSER=postgres

5.2 客户端工具管理

  • 使用完整路径调用特定版本的客户端工具
  • 或使用环境变量切换版本
bash
# 直接使用特定版本的psql
/usr/local/pgsql15/bin/psql -p 5432
/usr/local/pgsql14/bin/psql -p 5433
# 或通过环境变量
. pg15_env.sh
psql  # 使用15版本的psql
. pg14_env.sh  
psql  # 使用14版本的psql

5.3 扩展管理

  • 每个版本的扩展需要单独安装
  • 注意扩展版本与PostgreSQL版本的兼容性
bash
# 为15版本安装扩展
sudo -u postgres psql -p 5432 -c "CREATE EXTENSION pg_stat_statements;"
# 为14版本安装扩展  
sudo -u postgres psql -p 5433 -c "CREATE EXTENSION pg_stat_statements;"

5.4 监控与维护

  • 为每个实例配置独立的监控
  • 定期对所有版本进行维护操作
  • 监控每个实例的资源使用情况

6. 多版本共存的常见问题与解决方案

6.1 端口冲突

问题:安装时端口被占用 解决方案

  • 检查端口使用情况:sudo ss -tuln | grep 543
  • 选择未被使用的端口
  • 修改现有实例的端口配置

6.2 服务启动失败

问题:某个版本的服务无法启动 解决方案

  • 检查日志文件:tail -n 100 /data/pgsql14/log/postgresql-*.log
  • 验证数据目录权限
  • 检查端口是否被占用
  • 验证配置文件语法:pg_ctl -D /data/pgsql14 check

6.3 客户端连接问题

问题:无法连接到特定版本 解决方案

  • 确认实例正在运行:pg_isready -p 5433
  • 检查pg_hba.conf配置
  • 验证防火墙设置
  • 确认使用正确的端口和主机

6.4 共享库冲突

问题:扩展加载失败或出现共享库错误 解决方案

  • 确保扩展与PostgreSQL版本匹配
  • 为每个版本使用独立的扩展目录
  • 重新编译扩展以匹配目标PostgreSQL版本

7. 版本升级测试流程

多版本共存非常适合版本升级测试:

  1. 在测试服务器上安装当前生产版本和目标版本
  2. 从生产环境备份数据
  3. 恢复到当前版本实例进行验证
  4. 使用pg_upgrade或pg_dump/pg_restore迁移到目标版本
  5. 进行功能和性能测试
  6. 验证所有应用功能正常
  7. 编写详细的升级方案

8. 多版本共存的清理

当不再需要某个版本时:

8.1 Linux系统

bash
# Debian/Ubuntu
sudo apt remove --purge postgresql-13 postgresql-client-13 postgresql-contrib-13
# CentOS/RHEL
sudo dnf remove postgresql13 postgresql13-server postgresql13-contrib
# 删除数据目录(谨慎操作)
sudo rm -rf /data/pgsql13

8.2 Windows系统

  • 通过控制面板的"程序和功能"卸载
  • 手动删除数据目录(如需要)

8.3 macOS系统

bash
# 使用Homebrew卸载
brew uninstall postgresql@13
# 删除数据目录
rm -rf ~/Library/Application\ Support/Postgres/var-13

9. 总结

PostgreSQL的多版本共存安装是DBA日常运维中的重要技能,通过合理的规划和配置,可以安全地在同一台服务器上运行多个版本。关键是要遵循隔离原则,管理好端口、数据目录和服务,同时建立良好的环境变量管理机制。

多版本共存不仅方便测试和迁移,也为不同应用提供了灵活的版本选择,是现代化PostgreSQL运维的重要组成部分。