# 19.6.

升级 PostgreSQL 集群19.6.1.通过 pg 升级数据_

饺子19.6.2.通过 pg 升级数据_

升级19.6.3.

通过复制升级数据

本节讨论如何将您的数据库数据从一个 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 版本中,内部数据存储格式可能会发生变化,从而使升级变得复杂。将数据移动到新的主要版本的传统方法是转储并重新加载数据库,尽管这可能很慢。一种更快的方法是皮克_升级.复制方法也可用,如下所述。(如果您使用的是 PostgreSQL 的预打包版本,它可能会提供脚本来帮助进行主要版本升级。有关详细信息,请参阅包级文档。)

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

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

行政

管理员可用于监视和控制服务器的功能通常会在每个主要版本中更改和改进。

SQL

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

库 API

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

系统目录

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

服务器C语言API

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

# 19.6.1.通过pg升级数据_dumpall

一种升级方法是从一个主要版本的PostgreSQL中转储数据,然后重新加载到另一个版本中——为此,必须使用必然的像pg这样的备份工具_邓帕尔;文件系统级备份方法将不起作用。(有一些检查阻止您使用具有不兼容版本的PostgreSQL的数据目录,因此尝试在数据目录上启动错误的服务器版本不会造成太大危害。)

建议您使用pg_转储和pg_从更新的版本的PostgreSQL,以利用这些程序中可能进行的增强。当前版本的转储程序可以将任何服务器版本的数据读回7.0.

这些说明假定您现有的安装在/usr/local/pgsql目录,并且数据区域位于/usr/local/pgsql/data.适当地替换你的路径。

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

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

    pg_dumpall > outputfile
    

    要进行备份,可以使用pg_来自当前运行版本的dumpall命令;看见第26.1.2节更多细节。但是,为了获得最佳效果,请尝试使用pg_来自PostgreSQL 14.2的dumpall命令,因为该版本包含错误修复和较旧版本的改进。由于您尚未安装新版本,此建议可能显得有些特殊,但如果您计划与旧版本并行安装新版本,则建议遵循此建议。在这种情况下,您可以正常完成安装并稍后传输数据。这也将减少停机时间。

  2. 关闭旧服务器:

    pg_ctl stop
    

    在启动时启动PostgreSQL的系统上,可能有一个启动文件可以完成同样的任务。例如,在Red Hat Linux系统上,您可能会发现这是可行的:

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

    看见第19章有关启动和停止服务器的详细信息。

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

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

    (请确保将目录作为单个单元移动,以便相对路径保持不变。)

  4. 安装新版本的PostgreSQL,如中所述第17.4节.

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

    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    
  6. 恢复以前的pg_hba。形态还有postgresql。形态修改。

  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

来传输你的数据。

# 19.6.2.通过pg升级数据_升级

这个pg_升级模块允许安装从一个主要的PostgreSQL版本迁移到另一个版本。升级可以在几分钟内完成,尤其是在--链接模式它需要类似于pg的步骤_所有这些,例如,启动/停止服务器,运行initdb。pg_升级文档概述了必要的步骤。

# 19.6.3.通过复制升级数据

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

这种升级方法可以使用内置逻辑复制设施以及外部逻辑复制系统(如pglogical、Slony、Londiste和Bucardo)来执行。