本节讨论如何将数据库数据从一个 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。下面将讨论复制方法。 (如果您使用的是 PostgreSQL 的预打包版本,它可能会提供一些脚本来帮助进行主版本升级。请参阅包级文档以获取详细信息。)
新的主版本通常还会引入一些用户可见的不兼容性,因此可能需要更改应用程序编程。所有用户可见的更改都列在发行说明中(附录 E);请特别注意标记为“迁移”的部分。虽然您可以在不升级到中间版本的情况下从一个主版本升级到另一个主版本,但您应该阅读所有中间版本的主版本发行说明。
谨慎的用户会在完全切换之前先在新的版本上测试他们的客户端应用程序;因此,通常最好设置旧版本和新版本的并发安装。在测试 PostgreSQL 主版本升级时,请考虑以下几类可能的更改
管理员用于监视和控制服务器的功能在每个主要版本中通常都会发生变化和改进。
通常这包括新的 SQL 命令功能,而不是行为变化,除非发行说明中特别提到。
通常像 libpq 这样的库只会添加新功能,除非发行说明中提到。
系统目录更改通常只会影响数据库管理工具。
这涉及后端函数 API 的更改,该 API 是用 C 编程语言编写的。此类更改会影响引用服务器内部后端函数的代码。
一种升级方法是从一个主版本的 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
(或等效文件)中的权限,以禁止除您以外的所有人的访问。有关访问控制的更多信息,请参见第 20 章。
pg_dumpall > outputfile
要进行备份,您可以使用您当前正在运行的版本的 pg_dumpall 命令;有关更多详细信息,请参见第 25.1.2 节。但是,为了获得最佳结果,请尝试使用 PostgreSQL 17.0 中的 pg_dumpall 命令,因为此版本包含对旧版本的错误修复和改进。虽然此建议可能看起来很特殊,因为您尚未安装新版本,但如果您计划并行安装新版本和旧版本,则建议您遵循此建议。在这种情况下,您可以正常完成安装并在以后传输数据。这还将减少停机时间。
关闭旧服务器
pg_ctl stop
在启动时启动 PostgreSQL 的系统上,可能存在一个启动文件可以完成相同的事情。例如,在 Red Hat Linux 系统上,可能会发现这有效
/etc/rc.d/init.d/postgresql stop
有关启动和停止服务器的详细信息,请参见第 18 章。
如果从备份恢复,如果旧安装目录不是特定于版本的,请重命名或删除它。最好重命名目录,而不是删除它,以防出现问题并需要恢复到它。请记住,目录可能会占用大量的磁盘空间。要重命名目录,请使用以下命令
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
来传输您的数据。
pg_upgrade 模块允许就地将安装从一个主要 PostgreSQL 版本迁移到另一个版本。升级可以在几分钟内完成,尤其是在 --link
模式下。它需要类似于上面 pg_dumpall 的步骤,例如,启动/停止服务器,运行 initdb。pg_upgrade 的 文档概述了必要的步骤。
还可以使用逻辑复制方法来创建具有更新版本的 PostgreSQL 的备用服务器。这是可能的,因为逻辑复制支持不同主要版本的 PostgreSQL 之间的复制。备用服务器可以在同一台计算机上或不同的计算机上。一旦它与主服务器(运行旧版本的 PostgreSQL)同步,您就可以切换主服务器并使备用服务器成为主服务器,并关闭旧的数据库实例。这样的切换会导致升级只有几秒钟的停机时间。
此升级方法可以使用内置的逻辑复制功能以及 pglogical、Slony、Londiste 和 Bucardo 等外部逻辑复制系统来执行。
如果您在文档中发现任何错误,与您使用特定功能的体验不符,或需要进一步说明,请使用此表单报告文档问题。