本节讨论如何将数据库数据从一个 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 18.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。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。