在同一台服务器上使用多个版本的PostgreSQL的方法

首先

以下是 PostgreSQL 的各个版本:5个 Supported Version(9.6、10、11、12、13)以及可能存在的新版本 Development Version(14)。在开发 PostgreSQL 应用程序和系统时,需要在每个版本中进行测试。因此,我们总结了在备忘录中安装和使用多个版本的 PostgreSQL 的方法。为了简便起见,本次我们将从源代码开始安装 PostgreSQL,而不创建专用的 PostgreSQL 账户,而是使用我们自己的账户。

PostgreSQL_multi_version1b.png
PostgreSQL_multi_version1.png

环境

我正在使用Ubuntu 20.04版本的操作系统。

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"

事前准备

安装所需的PostgreSQL软件包。

$ sudo apt install libreadline-dev zlib1g-dev bison flex

创建必要的目录来安装和运行PostgreSQL。src目录用于存储源代码,pgsql目录用于安装PostgreSQL,而data目录则用作数据库集群的存储位置。

$ cd $HOME
$ mkdir src
$ mkdir pgsql
$ mkdir data

安装PostgreSQL

获取PostgreSQL源代码的存档文件,并解压存档文件。本次安装的版本包括9.6.22、10.17、11.12、12.7、13.2和14beta2。稍后将13.2替换为13.3。

$ cd src
$ wget https://ftp.postgresql.org/pub/source/v9.6.22/postgresql-9.6.22.tar.gz
$ wget https://ftp.postgresql.org/pub/source/v10.17/postgresql-10.17.tar.gz
$ wget https://ftp.postgresql.org/pub/source/v11.12/postgresql-11.12.tar.gz
$ wget https://ftp.postgresql.org/pub/source/v12.7/postgresql-12.7.tar.gz
$ wget https://ftp.postgresql.org/pub/source/v13.2/postgresql-13.2.tar.gz
$ wget https://ftp.postgresql.org/pub/source/v14beta2/postgresql-14beta2.tar.gz
$ tar xvzf postgresql-9.6.22.tar.gz 
$ tar xvzf postgresql-10.17.tar.gz 
$ tar xvzf postgresql-11.12.tar.gz 
$ tar xvzf postgresql-12.7.tar.gz 
$ tar xvzf postgresql-13.2.tar.gz 
$ tar xvzf postgresql-14beta2.tar.gz 

在构建PostgreSQL时,可以通过在运行配置命令时使用prefix选项来指定其安装路径。本次安装的路径将设为$HOME/postgres/postgresql-(版本号)。

安装PostgreSQL 9.6.22。

$ cd $HOME/src/postgresql-9.6.22
$ ./configure --prefix=$HOME/pgsql/postgresql-9.6
$ make
$ make install

安装 PostgreSQL 10.17

$ cd $HOME/src/postgresql-10.17
$ ./configure --prefix=$HOME/pgsql/postgresql-10
$ make
$ make install

PostgreSQL 11.12 安装

$ cd $HOME/src/postgresql-11.12
$ ./configure --prefix=$HOME/pgsql/postgresql-11
$ make
$ make install

安装 PostgreSQL 12.7

$ cd $HOME/src/postgresql-12.7
$ ./configure --prefix=$HOME/pgsql/postgresql-12
$ make
$ make install

安装 PostgreSQL 13.2

$ cd $HOME/src/postgresql-13.2
$ ./configure --prefix=$HOME/pgsql/postgresql-13
$ make
$ make install

安装PostgreSQL 14beta2

$ cd $HOME/src/postgresql-14beta2
$ ./configure --prefix=$HOME/pgsql/postgresql-14
$ make
$ make install

创建数据库集群

创建各个版本的数据库集群。本次将使用“cluster(版本号)”作为数据库集群名称。

$ cd $HOME/pgsql/postgresql-9.6/bin
$ ./initdb $HOME/data/cluster9_6
$ cd $HOME/pgsql/postgresql-10/bin
$ ./initdb $HOME/data/cluster10
$ cd $HOME/pgsql/postgresql-11/bin
$ ./initdb $HOME/data/cluster11
$ cd $HOME/pgsql/postgresql-12/bin
$ ./initdb $HOME/data/cluster12
$ cd $HOME/pgsql/postgresql-13/bin
$ ./initdb $HOME/data/cluster13
$ cd $HOME/pgsql/postgresql-14/bin
$ ./initdb $HOME/data/cluster14

编写各种脚本

首先,我们将创建一个名为setver.sh的脚本,用于设置以下版本和PostgreSQL的执行目录。在VER变量中,我们将设置支持版本(9.6、10、11、12、13)和开发版本(14)的六个版本。

#!/bin/sh
VER='9.6 10 11 12 13 14'
USAGE="Usage: $0 $VER"

if [ $# != 1 ] || ! echo "$VER"|grep -q $1 ; then
  echo $USAGE
  exit 1
fi

export PG_VERSION=$1
export PG_DIR="$HOME/pgsql/postgresql-$1/bin/"
echo "Set PostgreSQL $PG_VERSION"

接下来,将创建一个名为pgctl.sh的脚本,用于启动/检查/停止以下类似的PostgreSQL实例。如果环境变量PG_VERSION未设置,则将启动/检查/停止指定版本的实例,该版本由DEF变量指定。

#!/bin/bash

DEF="10"
USAGE="Usage: $0 {start|stop|status}"
if [ $# != 1 ]; then
  echo $USAGE
  exit 1
fi
VERSION=$PG_VERSION
if [ -z $VERSION ] ; then
  VERSION=$DEF
fi

PGCTL="$HOME/pgsql/postgresql-$VERSION/bin/pg_ctl"
PGDATA="$HOME/data/cluster$VERSION"
PGLOG="$HOME/data/cluster$VERSION/pglog$VERSION.log"

case "$1" in
  start)
    echo -n "Starting PostgreSQL $VERSION: "
    $PGCTL -D $PGDATA -l $PGLOG -w start
    touch /var/lock/pgsql
    ;;
  stop)
    echo -n "Stopping PostgreSQL $VERSION: "
    $PGCTL -D $PGDATA -m f stop
    rm -f /var/lock/pgsql
    ;;
  status)
    echo -n "postgreSQL $VERSION: "
    $PGCTL -D $PGDATA status
    ;;
  *)
    echo $USAGE
    exit 1
esac

exit 0

启动和验证PostgreSQL实例的操作

使用之前提到的 setver.sh 脚本来确定要执行的 PostgreSQL 实例,并使用 pgctl.sh 脚本来启动/检查/停止该实例。

以以下的方式指定将PostgreSQL 14作为PostgreSQL实例启动。

$ source ./setver 14
Set PostgreSQL 14

请使用pgctl.sh脚本启动实例。

$ ./pgctl.sh start
Starting PostgreSQL 14: waiting for server to start.... done
server started

使用pgctl.sh脚本来检查实例的状态。可以确认PostgreSQL 14实例是否已启动。

$ ./pgctl.sh status
postgreSQL 14: pg_ctl: server is running (PID: 9631)
/home/hoge/pgsql/postgresql-14/bin/postgres "-D" "/home/hoge/data/cluster14"

进入环境变量 $PG_DIR 指定的目录,并执行 psql 命令。确认 PostgreSQL 的版本后,我们可以看到正在启动 PostgreSQL 14beta2。
尽管本次访问的是 postgres 数据库,但如果需要另一个数据库,请使用位于同一目录下的 createdb 命令来创建数据库。

$ cd $PG_DIR
$ ./psql postgres
psql (14beta2)
Type "help" for help.

postgres=#

首先停止 PostgreSQL 14 实例,然后启动 PostgreSQL 13。通过 psql 检查 PostgreSQL 版本,确认已经成功启动了 PostgreSQL 13.2。

$ cd $HOME
$ ./pgctl.sh stop
Stopping PostgreSQL 14: waiting for server to shut down.... done
server stopped
$ source ./setver 13
Set PostgreSQL 13
$ ./pgctl.sh start
Starting PostgreSQL 13: waiting for server to start.... done
server started
$ cd $PG_DIR
$ ./psql postgres
psql (13.2)
Type "help" for help.

postgres=# SELECT version();
                                               version                                               
------------------------------------------------------------------------------------------------------
 PostgreSQL 13.2 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
(1 row)
postgres=# \q

将 PostgreSQL 13 从版本 13.2 更换至 13.3。

我将介绍如何处理升级到较小版本的情况。首先,停止并卸载 PostgreSQL 13.2。

$ cd $HOME
$ ./pgctl.sh stop
Stopping PostgreSQL 13: waiting for server to shut down.... done
server stopped
$ cd src/postgresql-13.2/
$ make uninstall

接下来,我们要安装 PostgreSQL 13.3。

$ cd $HOME/src
$ wget https://ftp.postgresql.org/pub/source/v13.3/postgresql-13.3.tar.gz
$ tar xvzf postgresql-14beta1.tar.gz 
$ cd work/postgresql-14beta2
$ ./configure --prefix=$HOME/work/postgresql-13
$ make
$ make install

按照下面的步骤启动 PostgreSQL 13。通过使用 psql 命令检查 PostgreSQL 版本,确认 PostgreSQL 13.3 已成功启动。

$ ./pgctl.sh start
Starting PostgreSQL 13: waiting for server to start.... done
server started
$ cd $PG_DIR
$ ./psql postgres
psql (13.3)
Type "help" for help.

db13=# SELECT version();
                                               version                                               
------------------------------------------------------------------------------------------------------
 PostgreSQL 13.3 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, 64-bit
(1 row)

由于可以在不更改数据库的情况下使用数据库集群,因此升级到次要版本时,我们保持了在13.2版本中创建的数据库集群和数据库的原样使用。
然而,由于PostgreSQL 14仍然处于开发版本,因此从14beta1升级到14beta2时,无法直接使用数据库集群。您需要升级数据库集群。请参考此处了解详情。

    PostgreSQL 14beta2 Documentation 19.6. Upgrading a PostgreSQL Cluster

汇总

我安装了多个版本的PostgreSQL,并创建了脚本,以便总结出不同版本的使用方法。通过我的账户,我可以轻松查看多个版本的PostgreSQL。

如果有任何描述上的错误或者您有任何不满意之处,欢迎通过编辑请求或者评论来提供反馈,非常感谢。

请参考

我已参考了以下信息。

    • PostgreSQL: Versioning Policy

 

    PostgreSQL: Documentation: 13: pg_uograde
广告
将在 10 秒后关闭
bannerAds