# 皮克_升级

皮克_upgrade — 升级 PostgreSQL 服务器实例

# 概要

pg_upgrade -b 旧绑定目录 -B 新绑定目录 -d 旧配置目录 -D 新配置目录 [选项...]

# 描述

皮克_升级(以前称为 pg_migrator) 允许将存储在 PostgreSQL 数据文件中的数据升级到更高的 PostgreSQL 主要版本,而无需主要版本升级通常需要的数据转储/重新加载,例如,从 9.5.8 到 9.6.4 或从 10.7 到 11.2.次要版本升级不需要它,例如,从 9.6.2 到 9.6.3 或从 10.1 到 10.2.

主要的 PostgreSQL 版本会定期添加新功能,这些新功能经常会更改系统表的布局,但内部数据存储格式很少更改。皮克_upgrade 利用这一事实通过创建新的系统表并简单地重用旧的用户数据文件来执行快速升级。如果未来的主要版本曾经以使旧数据格式不可读的方式更改数据存储格式,pg_upgrade 将无法用于此类升级。(社区会尽量避免这种情况。)

皮克_upgrade 尽最大努力确保新旧集群是二进制兼容的,例如,通过检查兼容的编译时设置,包括 32/64 位二进制文​​件。重要的是任何外部模块也是二进制兼容的,尽管 pg 无法检查这一点_升级。

皮克_upgrade 支持从 8.4.X 及更高版本升级到 PostgreSQL 的当前主要版本,包括快照和 beta 版本。

# 选项

皮克_upgrade 接受以下命令行参数:

-b 宾迪尔
--old-bindir=宾迪尔

旧的 PostgreSQL 可执行目录;环境变量PGINOLD

-B 宾迪尔
--new-bindir=宾迪尔

新的 PostgreSQL 可执行目录;默认是 pg 所在的目录_升级驻留;环境变量PGBINNEW

-c
- 查看

仅检查集群,不要更改任何数据

-d 配置目录
--旧数据目录=配置目录

旧的数据库集群配置目录;环境变量PGD​​ATAOLD

-D 配置目录
--新数据目录=配置目录

新的数据库集群配置目录;环境变量PGD​​ATA新

-j *njobs*
--工作=*njobs*

同时使用的进程或线程数

-k
- 关联

使用硬链接而不是将文件复制到新集群

-o 选项
--旧选项 选项

选项直接传递给旧的postgres命令;附加了多个选项调用

-O 选项
--新选项 选项

选项直接传递给新的postgres命令;附加了多个选项调用

-p 港口
--旧端口=港口

旧集群端口号;环境变量PGPORTOLD

-P 港口
--新端口=港口

新的集群端口号;环境变量PGPORT新

-r
- 保持

即使在成功完成后仍保留 SQL 和日志文件

-s 目录
--socketdir=目录

升级期间用于 postmaster 套接字的目录;默认为当前工作目录;环境变量PGSOCKETDIR

-U 用户名
--用户名=用户名

集群的安装用户名;环境变量PG用户

-v
--详细

启用详细的内部日志记录

-V
- 版本

显示版本信息,然后退出

- 克隆

使用高效的文件克隆(在某些系统上也称为“reflinks”)而不是将文件复制到新集群。这可以导致数据文件的近乎即时的复制,从而具有速度优势-k/- 关联同时保持旧集群不变。

文件克隆仅在某些操作系统和文件系统上受支持。如果它被选中但不支持,则 pg_升级运行会出错。目前,它在带有 Btrfs 和 XFS 的 Linux(内核 4.5 或更高版本)(在使用 reflink 支持创建的文件系统上)以及带有 APFS 的 macOS 上受支持。

-?
- 帮助

显示帮助,然后退出

# 用法

这些是使用 pg 执行升级的步骤_升级:

  1. 可选择移动旧集群

    如果您使用的是特定于版本的安装目录,例如,/opt/PostgreSQL/14,您不需要移动旧集群。图形安装程序都使用特定于版本的安装目录。

    如果您的安装目录不是特定于版本的,例如,/usr/local/pgsql,必须移动当前的 PostgreSQL 安装目录,以免干扰新的 PostgreSQL 安装。当前 PostgreSQL 服务器关闭后,重命名 PostgreSQL 安装目录是安全的;假设旧目录是/usr/local/pgsql, 你可以做:

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

    重命名目录。

  2. 对于源安装,构建新版本

    构建新的 PostgreSQL 源代码配置与旧集群兼容的标志。皮克_升级会检查pg_controldata在开始升级之前确保所有设置都兼容。

  3. 安装新的 PostgreSQL 二进制文件

    安装新服务器的二进制文件和支持文件。皮克_升级包含在默认安装中。

    对于源安装,如果您希望在自定义位置安装新服务器,请使用字首多变的:

    make prefix=/usr/local/pgsql.new install
    
  4. 初始化新的 PostgreSQL 集群

    使用初始化新集群初始化数据库.再次,使用兼容初始化数据库与旧集群匹配的标志。许多预建安装程序会自动执行此步骤。无需启动新集群。

  5. 安装扩展共享对象文件

    许多扩展和自定义模块,无论是来自贡献或其他来源,使用共享对象文件(或 DLL),例如,pgcrypto.so.如果旧集群使用这些,与新服务器二进制文件匹配的共享对象文件必须安装在新集群中,通常通过操作系统命令。不要加载模式定义,例如,创建扩展 pgcrypto,因为这些将从旧集群中复制。如果有可用的扩展更新,pg_upgrade 将报告此情况并创建一个脚本,该脚本可以稍后运行以更新它们。

  6. 复制自定义全文搜索文件

    将任何自定义全文搜索文件(字典、同义词、同义词、停用词)从旧集群复制到新集群。

  7. 调整身份验证

    pg_upgrade将多次连接到新旧服务器,因此您可能需要将身份验证设置为同行pg_hba.conf或使用~/.pgpass文件(见第 34.16 节)。

  8. 停止两台服务器

    确保在 Unix 上停止使用两个数据库服务器,例如:

    pg_ctl -D /opt/PostgreSQL/9.6 stop
    pg_ctl -D /opt/PostgreSQL/14 stop
    

    或在 Windows 上,使用正确的服务名称:

    NET STOP postgresql-9.6
    NET STOP postgresql-14
    

    流式复制和日志传送备用服务器可以继续运行,直到后面的步骤。

  9. 准备备用服务器升​​级

    如果您使用部分中概述的方法升级备用服务器第 11 步,通过运行 pg 验证旧的备用服务器是否被赶上_controldata 针对旧的主集群和备用集群。验证所有集群中的“最新检查点位置”值是否匹配。(如果旧的备用服务器在旧的主服务器之前关闭,或者旧的备用服务器仍在运行,则会出现不匹配。)另外,请确保wal_level未设置为最小的在里面postgresql.conf新主集群上的文件。

  10. 运行 pg_升级

    始终运行 pg_升级新服务器的二进制文件,而不是旧的。皮克_升级需要指定新旧集群的数据和可执行文件() 目录。您还可以指定用户和端口值,以及是否要链接或克隆数据文件,而不是默认复制行为。

    如果使用链接模式,升级会更快(无需复制文件)并且使用更少的磁盘空间,但是一旦升级后启动新集群,您将无法访问旧集群。链接模式还要求新旧集群数据目录在同一个文件系统中。(表空间和pg_wal可以在不同的文件系统上。)克隆模式提供相同的速度和磁盘空间优势,但不会导致旧集群在新集群启动后无法使用。克隆模式还要求新旧数据目录在同一个文件系统中。此模式仅在某些操作系统和文件系统上可用。

    - 工作选项允许使用多个 CPU 内核来复制/链接文件以及并行转储和重新加载数据库模式;一个好的起点是 CPU 内核和表空间的最大数量。此选项可以显着减少升级在多处理器机器上运行的多数据库服务器的时间。

    对于 Windows 用户,您必须登录到管理帐户,然后启动 shell 作为postgres用户并设置正确的路径:

    RUNAS /USER:postgres "CMD.EXE"
    SET PATH=%PATH%;C:\Program Files\PostgreSQL\14\bin;
    

    然后运行 ​​pg_使用引用目录升级,例如:

    pg_upgrade.exe
            --old-datadir "C:/Program Files/PostgreSQL/9.6/data"
            --new-datadir "C:/Program Files/PostgreSQL/14/data"
            --old-bindir "C:/Program Files/PostgreSQL/9.6/bin"
            --new-bindir "C:/Program Files/PostgreSQL/14/bin"
    

    一旦开始,pg_upgrade将验证两个集群是否兼容,然后进行升级。您可以使用pg_upgrade --检查仅执行检查,即使旧服务器仍在运行。pg_upgrade --检查还将概述升级后您需要进行的任何手动调整。如果您要使用链接或克隆模式,则应使用该选项- 关联要么- 克隆- 查看启用特定于模式的检查。pg_upgrade需要当前目录的写权限。

    显然,升级期间不应有人访问集群。皮克_升级默认为在端口 50432 上运行服务器,以避免意外的客户端连接。升级时可以为两个集群使用相同的端口号,因为新旧集群不会同时运行。但是,在检查旧的运行服务器时,新旧端口号必须不同。

    如果在恢复数据库模式时发生错误,pg_upgrade将退出,您将不得不恢复到旧集群,如第 17 步以下。尝试pg_upgrade再次,您将需要修改旧集群,以便 pg_升级架构还原成功。如果问题是贡献模块,您可能需要卸载贡献旧集群中的模块并在升级后将其安装到新集群中,假设该模块不用于存储用户数据。

  11. 升级流复制和日志传送备用服务器

    如果您使用链接模式并具有流式复制(请参阅第 27.2.5 节)或日志传送(见第 27.2 节) 备用服务器,您可以按照这些步骤快速升级它们。你不会运行 pg_在备用服务器上升级,而是在主服务器上进行 rsync。暂时不要启动任何服务器。

    如果你做了不是使用链接模式,没有或不想使用 rsync,或者想要更简单的解决方案,跳过本节中的说明,只需重新创建备用服务器一次 pg_升级完成,新的主节点正在运行。

  12. 在备用服务器上安装新的 PostgreSQL 二进制文件

    确保所有备用服务器上都安装了新的二进制文件和支持文件。

  13. 确保新的备用数据目录不是存在

    确保新的备用数据目录不是存在或为空。如果运行了 initdb,则删除备用服务器的新数据目录。

  14. 安装扩展共享对象文件

    在新主集群中安装的新备用数据库上安装相同的扩展共享对象文件。

  15. 停止备用服务器

    如果备用服务器仍在运行,请立即使用上述说明停止它们。

  16. 保存配置文件

    保存您需要保留的旧备用配置目录中的任何配置文件,例如,postgresql.conf(以及其中包含的任何文件),postgresql.auto.conf,pg_hba.conf,因为这些将在下一步中被覆盖或删除。

  17. 运行 rsync

    使用链接模式时,可以使用 rsync 快速升级备用服务器。要完成此操作,请从位于新旧数据库集群目录之上的主服务器上的目录中,在基本的对于每个备用服务器:

    rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster new_cluster remote_dir
    

    在哪里old_cluster新集群相对于主目录上的当前目录,并且远程目录更多备用集群上的新旧集群目录。主备上指定目录下的目录结构必须匹配。有关指定远程目录的详细信息,请参阅 rsync 手册页,例如,

    rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/9.5 \
          /opt/PostgreSQL/9.6 standby.example.com:/opt/PostgreSQL
    

    您可以使用 rsync 验证命令将执行的操作--空运行选项。虽然 rsync 必须在主服务器上运行至少一个备用服务器,但只要升级后的备用服务器尚未启动,就可以在升级的备用服务器上运行 rsync 以升级其他备用服务器。

    它的作用是记录 pg 创建的链接_升级的链接模式,用于连接主服务器上新旧集群中的文件。然后它在备用的旧集群中找到匹配的文件,并在备用的新集群​​中为它们创建链接。未在主服务器上链接的文件将从主服务器复制到备用服务器。(它们通常很小。)这提供了快速的备用升级。不幸的是,rsync 不必要地复制与临时表和未记录表关联的文件,因为这些文件通常不存在于备用服务器上。

    如果您有表空间,则需要为每个表空间目录运行类似的 rsync 命令,例如:

    rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_9.5_201510051 \
          /vol1/pg_tblsp/PG_9.6_201608131 standby.example.com:/vol1/pg_tblsp
    

    如果您已搬迁pg_wal在数据目录之外,rsync 也必须在这些目录上运行。

  18. 配置流复制和日志传送备用服务器

    配置服务器以进行日志传送。(您不需要运行pg_start_backup()pg_stop_backup()或进行文件系统备份,因为备用数据库仍与主数据库同步。)

  19. 恢复pg_hba.conf

    如果你修改pg_hba.conf,恢复其原始设置。可能还需要调整新集群中的其他配置文件以匹配旧集群,例如,postgresql.conf(以及其中包含的任何文件),postgresql.auto.conf.

  20. 启动新服务器

    现在可以安全地启动新服务器,然后可以启动任何 rsync 的备用服务器。

  21. 升级后处理

    如果需要任何升级后处理,pg_升级将在完成时发出警告。它还将生成必须由管理员运行的脚本文件。脚本文件将连接到需要升级后处理的每个数据库。每个脚本都应该使用:

    psql --username=postgres --file=script.sql postgres
    

    脚本可以按任何顺序运行,并且一旦运行就可以删除。

    # 警告

    通常,在重建脚本运行完成之前访问重建脚本中引用的表是不安全的;这样做可能会产生不正确的结果或性能不佳。可以立即访问重建脚本中未引用的表。

  22. 统计数据

    因为优化器统计信息不是由pg_upgrade,您将被指示运行命令以在升级结束时重新生成该信息。您可能需要设置连接参数以匹配您的新集群。

  23. 删除旧集群

    一旦您对升级感到满意,您可以通过运行时提到的脚本来删除旧集群的数据目录pg_upgrade完成。(如果您在旧数据目录中有用户定义的表空间,则无法自动删除。)您还可以删除旧的安装目录(例如,,分享)。

  24. 恢复到旧集群

    如果,运行后pg_upgrade,您希望恢复到旧集群,有几个选项:

  • 如果- 查看使用了选项,旧集群未修改;它可以重新启动。

  • 如果- 关联选项是不是使用,旧集群未修改;它可以重新启动。

  • 如果- 关联使用选项,数据文件可能在新旧集群之间共享:

    • 如果pg_upgrade在链接开始之前中止,旧集群未修改;它可以重新启动。

    • 如果你做了不是启动新集群,旧集群没有被修改,只是在链接开始时,一个。老的后缀被附加到$PGDATA/global/pg_control.要重用旧集群,请删除。老的后缀$PGDATA/global/pg_control;然后您可以重新启动旧集群。

    • 如果您确实启动了新集群,则它已写入共享文件,使用旧集群是不安全的。在这种情况下,需要从备份中恢复旧集群。

# 笔记

皮克_upgrade 在当前工作目录中创建各种工作文件,例如模式转储。为了安全起见,请确保该目录不能被任何其他用户读取或写入。

皮克_upgrade 在新旧数据目录中启动短期邮政主管。默认情况下,用于与这些 postmaster 通信的临时 Unix 套接字文件在当前工作目录中创建。在某些情况下,当前目录的路径名可能太长而不能成为有效的套接字名称。在这种情况下,您可以使用-s将套接字文件放在具有较短路径名的某个目录中的选项。为了安全起见,请确保该目录不能被任何其他用户读取或写入。(这在 Windows 上不受支持。)

pg 将报告所有失败、重建和重新索引的情况_如果它们影响您的安装,请升级;将自动生成用于重建表和索引的升级后脚本。如果您尝试自动升级多个集群,您会发现具有相同数据库架构的集群需要对所有集群升级进行相同的升级后步骤;这是因为升级后的步骤是基于数据库模式,而不是用户数据。

对于部署测试,创建旧集群的仅模式副本,插入虚拟数据,然后升级它。

皮克_upgrade 不支持使用这些升级包含表列的数据库注册*引用 OID 的系统数据类型:

重新整理
注册配置
规范的
注册命名空间
管理员
监管者
正则程序
重新程序

(注册类,调整, 和注册类型可以升级。)

如果要升级使用仅配置文件目录的 pre-PostgreSQL 9.2 集群,则必须将真实数据目录位置传递给 pg_升级,并将配置目录位置传递给服务器,例如,-d /real-data-directory -o '-D /配置目录'.

如果使用 9.1 之前的旧服务器,该服务器使用非默认 Unix 域套接字目录或与新集群的默认值不同的默认值,请设置PGHOST指向旧服务器的套接字位置。(这与 Windows 无关。)

如果您想使用链接模式并且不希望在新集群启动时修改旧集群,请考虑使用克隆模式。如果这不可用,请制作旧集群的副本并在链接模式下升级它。要制作旧集群的有效副本,请使用rsync在服务器运行时创建旧集群的脏副本,然后关闭旧服务器并运行rsync --校验和再次使用任何更改更新副本以使其保持一致。(--校验和是必要的,因为rsync只有一秒的文件修改时间粒度。)您可能想要排除一些文件,例如,邮递员.pid,如记录在第 26.3.3 节.如果您的文件系统支持文件系统快照或写时复制文件副本,您可以使用它来备份旧集群和表空间,但必须同时创建快照和副本或在数据库服务器关闭时创建。

# 也可以看看

初始化数据库,皮克_控制,皮克_倾倒,postgres