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