此部分讨论如何将您的数据库数据从一个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.1 中的 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 等外部逻辑复制系统,执行这种升级方法。