PostgreSQL 教程: 使用 pg_upgrade 进行大版本升级

三月 10, 2025

摘要:在本教程中,您将学习如何在 PostgreSQL 中使用 pg_upgrade 执行大版本升级。

目录

介绍

您很可能在某个时候被要求将软件从一个主版本升级到另一个主版本。对于该应用场景,我们将会使用 pg_upgrade。

要实现一次成功且正常的升级,至关重要的一个部分是:阅读版本的发行说明。有时,即使在小版本的升级中,也可能需要额外的步骤,除非您阅读了发行说明,或者在升级过程中遇到问题,否则您不会知道这些情况。通常,您无需执行任何额外的步骤,但有时可能需要重新构建索引或更改路径等操作。同样,请务必阅读发行说明,以避免在实施升级时出现问题。

在本例中,我们将使用 pg_upgrade 在 CentOS 7 上从 PostgreSQL 14 升级到 PostgreSQL 15。选择 pg_upgrade 是因为升级速度。大多数时候,它实际上是在几分钟内完成的。pg_upgrade 二进制文件的位置,可以在 initdb、pg_ctl 等的同一默认位置找到,比如 /usr/pgsql-##/bin。

升级的准备

在仔细阅读了相应版本的发行说明后,就可以进行升级了!

在我们开始执行实际的 pg_upgrade 命令之前,我们应该使用我们最常用的备份工具进行一次备份。

现在,我们已经进行了备份,我们将安装 PostgreSQL 15 二进制文件。

yum -y install postgresql15-server postgresql15-contrib

让我们以 postgres 用户身份初始化新的实例。

/usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data

停止从应用程序(或其他地方)到数据库的所有连接。为此,请使用 postgres 用户,并运行下面的命令;注意:如果您更改了 PostgreSQL 的数据目录或二进制文件的位置,则需要将以下路径替换为您的自定义路径。

/usr/pgsql-14/bin/pg_ctl -D /var/lib/pgsql/14/data/ -mf stop

升级检查

初始化新实例并停止旧实例后,我们现在将运行带有 -c (check) 选项的 pg_upgrade 命令。

time /usr/pgsql-15/bin/pg_upgrade --old-bindir /usr/pgsql-14/bin --new-bindir /usr/pgsql-15/bin --old-datadir /var/lib/pgsql/14/data --new-datadir /var/lib/pgsql/15/data --link --check

有关上面使用的选项的一些信息,如下:

-b (--old-bindir=bindir) 是旧实例的可执行文件的目录

-B (--new-bindir=bindir) 是新实例的可执行文件的目录

-d (--old-datadir=configdir) 是旧实例的数据目录

-D (--new-datadir=configdir) 是新实例的数据目录

-k (--link) 采用链接,而不是将文件复制到新实例。注意:如果您需要保留一份旧实例数据文件的本地副本,请删除此选项。这将会增加运行升级所需的时间以及磁盘上实例的大小。使用-k后无法回退。如果您不使用-k选项,请确保您有足够的磁盘空间,来存储实例的 2 个完整副本。

-c (--check) 仅执行 “检查”,并不会更改任何数据。这会运行许多的一致性检查。请始终先使用这个选项运行 pg_upgrade 命令。

有关 pg_upgrade 的其他信息,请参阅文档

执行升级

我们已经了解了升级命令的使用方式。让我们删除-c (--check)选项,来运行升级!

time /usr/pgsql-15/bin/pg_upgrade --old-bindir /usr/pgsql-14/bin --new-bindir /usr/pgsql-15/bin --old-datadir /var/lib/pgsql/14/data --new-datadir /var/lib/pgsql/15/data --link

完成上面的操作后,您应该会收到一个祝贺您成功的输出!此时,建议您运行./analyze_new_cluster.sh脚本,以生成统计信息,以使系统可用。您也可以等待,vacuum 最终会为您生成这些信息。前一种方法,通常是一个最佳实践。

最后,如果您希望删除旧实例的数据文件,您可以使用 postgres 用户身份运行./delete_old_cluster.sh

了解更多

PostgreSQL 管理