19.6. 升级PostgreSQL集群#
本节讨论如何将数据库数据从一个PostgreSQL版本升级到一个较新的版本。
当前PostgreSQL版本号由主版本号和次版本号组成。例如,在版本号 10.1 中,10 是主版本号,1 是次版本号,这意味着这将是主版本 10 的第一个次版本。对于PostgreSQL10.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。复制方法也可用,如下所述。(如果您使用的是PostgreSQL的预打包版本,它可能会提供帮助执行主要版本升级的脚本。有关详细信息,请参阅包级文档。)
新的主要版本通常还会引入一些用户可见的不兼容性,因此可能需要进行应用程序编程更改。所有用户可见的更改都列在发行说明中(附录 E);特别注意标记为“迁移”的部分。虽然您可以从一个主要版本升级到另一个主要版本,而无需升级到中间版本,但您应该阅读所有中间版本的主要发行说明。
谨慎的用户会希望在完全切换之前在新版本上测试其客户端应用程序;因此,通常建议同时安装旧版本和新版本。在测试PostgreSQL主要升级时,请考虑以下可能更改的类别
- 管理
管理员用于监视和控制服务器的功能通常在每个主要版本中都会更改和改进。
- SQL
这通常包括新的 SQL 命令功能,而不是行为更改,除非发行说明中明确提到。
- 库 API
通常,像 libpq 这样的库只会添加新功能,除非发行说明中提到。
- 系统目录
系统目录更改通常只影响数据库管理工具。
- 服务器 C 语言 API
这涉及后端函数 API 的更改,该 API 使用 C 编程语言编写。此类更改会影响在服务器内部引用后端函数的代码。
19.6.1. 通过pg_dumpall升级数据#
一种升级方法是从一个主要版本的PostgreSQL中转储数据,并在另一个版本中还原数据——要执行此操作,您必须使用逻辑备份工具,例如pg_dumpall;文件系统级别的备份方法不起作用。(已实施检查以防止您使用与PostgreSQL版本不兼容的数据目录,因此在数据目录上尝试启动错误的服务器版本不会造成太大危害。)
建议您使用PostgreSQL较新版本中的pg_dump和pg_dumpall程序,以利用这些程序中可能进行的增强。转储程序的当前版本可以读取任何服务器版本(回溯至 9.2)的数据。
这些说明假定您的现有安装位于/usr/local/pgsql
目录下,并且数据区域位于/usr/local/pgsql/data
中。请相应地替换您的路径。
如果进行备份,请确保您的数据库未被更新。这不会影响备份的完整性,但更改的数据当然不会包含在内。如有必要,请编辑文件
/usr/local/pgsql/data/pg_hba.conf
(或等效文件)中的权限,以禁止除您之外的任何人的访问。有关访问控制的更多信息,请参见第 21 章。pg_dumpall >
outputfile
要进行备份,您可以使用您当前正在运行的版本中的 pg_dumpall 命令;有关更多详细信息,请参见第 26.1.2 节。但是,为了获得最佳结果,请尝试使用 PostgreSQL 16.2 中的 pg_dumpall 命令,因为此版本包含了对旧版本的错误修复和改进。虽然这条建议可能看起来很特别,因为您尚未安装新版本,但如果您计划与旧版本并行安装新版本,建议您遵循此建议。在这种情况下,您可以正常完成安装,稍后传输数据。这也将减少停机时间。
关闭旧服务器
pg_ctl stop
在启动时启动 PostgreSQL 的系统上,可能有一个启动文件可以完成相同的事情。例如,在 Red Hat Linux 系统上,您可能会发现此方法有效
/etc/rc.d/init.d/postgresql stop
有关启动和停止服务器的详细信息,请参见第 19 章。
如果从备份中还原,请重命名或删除旧的安装目录(如果它不是特定于版本的)。最好重命名目录,而不是删除它,以防出现问题且需要还原到它。请记住,该目录可能会占用大量的磁盘空间。要重命名目录,请使用类似于以下的命令
mv /usr/local/pgsql /usr/local/pgsql.old
(请务必将目录作为一个单元移动,以便相对路径保持不变。)
按照第 17 章中概述的步骤安装新版本的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
使用新的psql。
最少的停机时间可以通过在不同的目录中安装新服务器并在不同的端口上同时运行旧服务器和新服务器来实现。然后,您可以使用类似以下内容
pg_dumpall -p 5432 | psql -d postgres -p 5433
来传输您的数据。
19.6.2. 通过pg_upgrade升级数据#
pg_upgrade模块允许将安装从一个主要PostgreSQL版本就地迁移到另一个版本。升级可以在几分钟内完成,尤其是在--link
模式下。它需要类似于上面的pg_dumpall的步骤,例如,启动/停止服务器,运行initdb。pg_upgrade文档概述了必要的步骤。
19.6.3. 通过复制升级数据#
还可以使用逻辑复制方法创建带有更新版本的PostgreSQL的备用服务器。这是可能的,因为逻辑复制支持在不同主要版本的PostgreSQL之间进行复制。备用服务器可以在同一台计算机或不同的计算机上。一旦它与主服务器(运行较旧版本的PostgreSQL)同步,就可以切换主服务器,使备用服务器成为主服务器并关闭较旧的数据库实例。这种切换只需要几秒钟的升级停机时间。
可以使用内置逻辑复制工具以及外部逻辑复制系统(例如pglogical、Slony、Londiste和Bucardo)执行这种升级方法。