支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

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。复制方法也可用,如下所述。(如果您使用的是预打包版本的 PostgreSQL,它可能会提供脚本来协助进行主要版本升级。有关详细信息,请参阅包级文档。)

新的主要版本通常也会引入一些用户可见的不兼容性,因此可能需要进行应用程序编程更改。所有用户可见的更改都列在发行说明中(附录 E);请特别注意标记为“迁移”的部分。尽管您可以从一个主要版本升级到另一个主要版本,而无需升级到中间版本,但您应该阅读所有中间版本的主要发行说明。

谨慎的用户希望在完全切换之前在新版本上测试其客户端应用程序;因此,通常最好设置旧版本和新版本的并发安装。在测试 PostgreSQL 主要升级时,请考虑以下可能的更改类别

管理

管理员用来监视和控制服务器的功能通常在每个主要版本中都会发生变化和改进。

SQL

通常,这包括新的 SQL 命令功能,而不是行为上的更改,除非在发行说明中特别提及。

库 API

通常,像 libpq 这样的库只会添加新功能,除非在发行说明中再次提及。

系统目录

系统目录更改通常只会影响数据库管理工具。

服务器 C 语言 API

这涉及到后端函数 API 的更改,该 API 是用 C 编程语言编写的。此类更改会影响引用服务器内部深处的后端函数的代码。

18.6.1. 通过 pg_dumpall 升级数据 #

一种升级方法是从一个主要版本的 PostgreSQL 中转储数据,然后将其恢复到另一个版本中 — 要做到这一点,您必须使用 逻辑 备份工具,如 pg_dumpall;文件系统级备份方法将不起作用。(有一些检查可以防止您将数据目录与不兼容版本的 PostgreSQL 一起使用,因此尝试在数据目录上启动错误的服务器版本不会造成太大的损害。)

建议您使用 PostgreSQL较新 版本的 pg_dumppg_dumpall 程序,以利用这些程序中可能进行的增强功能。当前版本的转储程序可以读取任何服务器版本(最远到 9.2)的数据。

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

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

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

    pg_dumpall > outputfile
    

    要进行备份,您可以使用当前正在运行的版本中的 pg_dumpall 命令;有关详细信息,请参见 第 25.1.2 节。但是,为了获得最佳结果,请尝试使用 PostgreSQL 17.2 中的 pg_dumpall 命令,因为此版本包含较旧版本的错误修复和改进。尽管这个建议可能看起来有点奇怪,因为您尚未安装新版本,但如果您计划将新版本与旧版本并行安装,则建议遵循此建议。在这种情况下,您可以正常完成安装并在以后传输数据。这也将减少停机时间。

  2. 关闭旧服务器

    pg_ctl stop
    

    在启动时启动 PostgreSQL 的系统上,可能有一个启动文件可以完成相同的工作。例如,在 Red Hat Linux 系统上,可能会发现此方法有效

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

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

  3. 如果要从备份还原,请重命名或删除旧的安装目录(如果它不是特定于版本的)。最好重命名该目录,而不是删除它,以防您遇到问题并且需要恢复到该目录。请记住,该目录可能会占用大量磁盘空间。要重命名该目录,请使用如下命令

    mv /usr/local/pgsql /usr/local/pgsql.old
    

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

  4. 按照 第 17 章 中的概述安装新版本的 PostgreSQL

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

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

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

    /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
    
  8. 最后,使用以下命令从备份还原您的数据

    /usr/local/pgsql/bin/psql -d postgres -f outputfile
    

    使用psql

通过在不同的目录中安装新服务器并在不同的端口上并行运行旧服务器和新服务器,可以实现最短的停机时间。然后,您可以使用如下命令

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

来传输您的数据。

18.6.2. 通过 pg_upgrade 升级数据 #

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

18.6.3. 通过复制升级数据 #

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

这种升级方法可以使用内置的逻辑复制功能以及外部逻辑复制系统(例如 pglogicalSlonyLondisteBucardo)来执行。

提交更正

如果您发现文档中的任何内容不正确、与您使用特定功能的经验不符或需要进一步澄清,请使用此表单报告文档问题。