18.6. 升级 PostgreSQL 集群

本节讨论如何将数据库数据从一个 PostgreSQL 版本升级到一个新版本。

当前的 PostgreSQL 版本号由主版本号和次版本号组成。例如,在版本号 10.1 中,10 是主要版本号,而 1 是次要版本号,这意味着这将是主要版本 10 的第一个次要版本。对于 PostgreSQL 10.0 之前的版本,版本号包括三个数字,例如 9.5.3. 在这些情况下,主要版本由版本号的前两位数字组(例如 9.5)组成,次要版本是第三个数字组(例如 3),这意味着这将是主要版本 9.5 的第三个次要版本。

次要版本永远不会更改内部存储格式,并且始终与相同主版本号的早期和较晚次要版本兼容。例如,版本 10.1 与版本 10.0 和版本 10.6 兼容。类似地,例如,9.5.3 与 9.5.0、9.5.1 和 9.5.6 兼容。要在兼容版本之间进行更新,只需在服务器关闭时替换可执行文件,然后重新启动服务器即可。数据目录保持不变-较小的升级就这么简单。

对于 PostgreSQL 的主要版本,内部数据存储格式可能会发生更改,从而使升级变得复杂。将数据移动到新的主要版本的传统方法是转储并重新加载数据库,尽管这可能很慢。更快的方法是pg_upgrade。复制方法也可用,如下所述。

新的主要版本通常还会引入一些用户可见的不兼容性,因此可能需要更改应用程序编程。所有用户可见的更改都在发行说明(Appendix E)中列出;请特别注意标有“迁移”的部分。如果要跨多个主要版本进行升级,请确保阅读每个中间版本的发行说明。

谨慎的用户会希望在完全切换之前在新版本上测试其 Client 端应用程序;因此,最好同时设置新旧版本的安装。在测试 PostgreSQL 重大升级时,请考虑以下类别的可能更改:

  • Administration

    • 在每个主要版本中,Management 员可用来监视和控制服务器的功能经常更改和改进。
  • SQL

    • 通常,这包括新的 SQL 命令功能,并且不包括行为更改,除非发行说明中特别提及。
  • Library API

    • 通常,像 libpq 这样的库只会添加新功能,除非发行说明中另有提及。
  • System Catalogs

    • 系统目录更改通常仅影响数据库 Management 工具。
  • 服务器 C 语言 API

    • 这涉及使用 C 编程语言编写的后端函数 API 的更改。此类更改会影响引用服务器内部后端功能的代码。

18 .6.1. 通过 pg_dumpall 升级数据

一种升级方法是从 PostgreSQL 的一个主要版本中转储数据,然后在另一个主要版本中重新加载-为此,必须使用 pg_dumpall 之类的逻辑备份工具;文件系统级备份方法将不起作用。 (已经进行了检查,阻止您将数据目录与 PostgreSQL 的不兼容版本一起使用,因此,尝试在数据目录上启动错误的服务器版本不会造成很大的伤害.)

建议您使用 PostgreSQL 较新版本的 pg_dump 和 pg_dumpall 程序,以利用这些程序中可能进行的增强。当前版本的转储程序可以从任何服务器版本回 7.0 读取数据。

这些说明假定您现有的安装位于/usr/local/pgsql目录下,并且数据区域位于/usr/local/pgsql/data中。适当替换您的路径。

  • 如果要进行备份,请确保未更新数据库。这不会影响备份的完整性,但是更改后的数据当然不会包括在内。如有必要,请编辑文件/usr/local/pgsql/data/pg_hba.conf(或等效文件)中的权限,以禁止除您之外的所有人进行访问。有关访问控制的其他信息,请参见Chapter 20

要备份数据库安装,请键入:

pg_dumpall > outputfile

要进行备份,可以使用当前正在运行的版本中的 pg_dumpall 命令。有关更多详细信息,请参见Section 25.1.2。为了获得最佳结果,请尝试使用 PostgreSQL 11.8 中的 pg_dumpall 命令,因为该版本包含错误修复和对旧版本的改进。尽管由于尚未安装新版本,此建议似乎有些特殊,但如果您打算与旧版本并行安装新版本,建议您遵循该建议。在这种情况下,您可以正常完成安装并稍后传输数据。这也将减少停机时间。

  • 关闭旧服务器:
pg_ctl stop

在启动时已启动 PostgreSQL 的系统上,可能会有一个启动文件来完成相同的任务。例如,在 Red Hat Linux 系统上,您可能会发现这可行:

/etc/rc.d/init.d/postgresql stop

有关启动和停止服务器的详细信息,请参见Chapter 18

  • 如果要从备份还原,请重新命名或删除旧的安装目录(如果它不是特定于版本的)。最好重命名目录,而不是删除目录,以防万一您需要恢复到该目录。请记住,目录可能会占用大量磁盘空间。要重命名目录,请使用如下命令:
mv /usr/local/pgsql /usr/local/pgsql.old

(请确保将目录作为一个整体移动,以便相对路径保持不变.)

  • 按照Section 16.4中所述安装新版本的 PostgreSQL。

  • 如果需要,创建一个新的数据库集群。请记住,登录到特殊数据库用户帐户(如果要进行升级,则已经拥有)时必须执行这些命令。

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
  • 恢复您以前的pg_hba.conf和任何postgresql.conf修改。

  • 再次使用特殊的数据库用户帐户启动数据库服务器:

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  • 最后,使用以下方法从备份中还原数据:
/usr/local/pgsql/bin/psql -d postgres -f outputfile

使用* new * psql。

通过将新服务器安装在不同目录中并在不同端口上并行运行旧服务器和新服务器,可以实现最少的停机时间。然后,您可以使用类似:

pg_dumpall -p 5432 | psql -d postgres -p 5433

传输您的数据。

18 .6.2. 通过 pg_upgrade 升级数据

pg_upgrade模块允许将安装从一个主要 PostgreSQL 版本就地迁移到另一个主要 PostgreSQL 版本。升级可以在几分钟内完成,尤其是在--link模式下。它需要类似于上述 pg_dumpall 的步骤,例如启动/停止服务器,运行 initdb。 pg_upgrade documentation概述了必要的步骤。

18 .6.3. 通过复制升级数据

也可以使用逻辑复制方法使用更新版本的 PostgreSQL 创建备用服务器。这是可能的,因为逻辑复制支持在 PostgreSQL 的不同主要版本之间进行复制。备用计算机可以在同一台计算机上,也可以在另一台计算机上。一旦它与主服务器同步(运行旧版本的 PostgreSQL),您就可以切换主服务器并将备用服务器作为主服务器,并关闭旧数据库实例。这种切换只会导致升级停机几秒钟。

可以使用内置逻辑复制工具以及外部逻辑复制系统(例如 pgologic,Slony,Londiste 和 Bucardo)来执行这种升级方法。