4.7. 迁移到 RHEL 9 的 PostgreSQL 版本


Red Hat Enterprise Linux 8 在多个模块流中提供 PostgreSQLPostgreSQL 10(默认的 postgresql 流)、PostgreSQL 9.6PostgreSQL 12PostgreSQL 13PostgreSQL 15PostgreSQL 16

在 RHEL 9 中,PostgreSQL 13PostgreSQL 15PostgreSQL 16 可用。

在 RHEL 中,您可以为数据库文件使用两个 PostgreSQL 迁移路径:

快速升级方法比转储和恢复过程要快。然而,在某些情况下,快速升级无法正常工作,例如,当跨架构升级时,只能使用转储和恢复过程。

迁移到更新版本的 PostgreSQL 的先决条件是备份所有 PostgreSQL 数据库。

转储和恢复过程需要转储数据库并执行SQL文件备份,建议使用快速升级方法。

在迁移到 PostgreSQL 的更高版本前,请参阅您要迁移到的 PostgreSQL 版本的 上游兼容性备注,以及您要迁移的版本和目标版本之间所有跳过的 PostgreSQL 版本。

PostgreSQL 16 引入了以下显著变化。

postmasters 二进制文件不再提供

PostgreSQL 不再与 postmaster 二进制文件一起分发。使用提供的 systemd 单元文件启动 postgresql 服务器( systemctl start postgres.service 命令)的用户不受此更改的影响。如果您之前直接通过 postmaster 二进制文件启动了 postgresql 服务器,则您现在必须使用 postgres 二进制文件。

文档不再被打包

PostgreSQL 不再在软件包中以 PDF 格式提供文档。改为使用 在线文档

PostgreSQL 15 包括以下向后不兼容更改:

公共模式的默认权限

PostgreSQL 15 中 public 模式的默认权限已被修改。新创建的用户需要使用 GRANT ALL ON SCHEMA public TO myuser; 命令明确授予权限。

以下示例在 PostgreSQL 13 及早期版本中正常工作:

postgres=# CREATE USER mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
Copy to Clipboard Toggle word wrap

以下示例在 PostgreSQL 15 及更高版本中正常工作:

postgres=# CREATE USER mydbuser;
postgres=# GRANT ALL ON SCHEMA public TO mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
Copy to Clipboard Toggle word wrap
注意

确保 mydbuser 访问在 pg_hba.conf 文件中被正确配置了。如需更多信息,请参阅 创建 PostgreSQL 用户

pipeline 模式下不再支持 PQsendQuery ()

PostgreSQL 15 开始,管道模式中不再支持 libpqPQsendQuery () 函数。修改受影响的应用程序,以使用 PQsendQueryParams() 函数。

4.7.3. 使用 pg_upgrade 工具快速升级

作为系统管理员,您可以使用快速升级方法升级到 PostgreSQL 的最新版本。要执行快速升级,将二进制数据文件复制到 /var/lib/pgsql/data/ 目录中,并使用 pg_upgrade 工具。

您可以使用此方法迁移数据:

  • PostgreSQL 12 的 RHEL 8 版本到 PostgreSQL 13 的 RHEL 版本
  • PostgreSQL 13 的 RHEL 8 或 9 版本到 PostgreSQL 15 的 RHEL 版本
  • PostgreSQL 15 的 RHEL 8 或 9 版本到 PostgreSQL 16 的 RHEL 版本

以下流程描述了使用快速升级方法从 RHEL 8 版本的 PostgreSQL 12 迁移到 RHEL 9 版本的 PostgreSQL 13。对于从 12 以外的 postgresql 流进行迁移,请使用以下方法之一:

  • 将 RHEL 8 上的 PostgreSQL 服务器更新至版本 12,然后使用 pg_upgrade 程序执行一个到 RHEL 9 版本的 PostgreSQL 13 的快速升级。
  • 使用 dump 和 restore 在 PostgreSQL 的任何 RHEL 8 版本和 RHEL 9 中相同或更新的 PostgreSQL 版本之间进行升级。

先决条件

  • 在执行升级前,请备份存储在 PostgreSQL 数据库中的所有数据。默认情况下,所有数据都存储在 RHEL 8 和 RHEL 9 系统的 /var/lib/pgsql/data/ 目录中。

流程

  1. 在 RHEL 9 系统中,安装 postgresql-serverpostgresql-upgrade 软件包:

    # dnf install postgresql-server postgresql-upgrade
    Copy to Clipboard Toggle word wrap

    另外,如果您在 RHEL 8 上使用了任何 PostgreSQL 服务器模块,那么也可以在 RHEL 9 系统上安装该模块的两个版本,分别针对 PostgreSQL 12 (作为 postgresql-upgrade 软件包安装)和 PostgreSQL 13 的目标版本(作为 postgresql-server 软件包安装)进行编译。如果您需要编译第三方PostgreSQL服务器模块,请根据postgresql-develpostgresql-upgrade-devel软件包来构建它。

  2. 检查以下项:

    • 基本配置:在 RHEL 9 系统中,检查您的服务器是否使用默认 /var/lib/pgsql/data 目录,且数据库已正确初始化并启用。此外,数据文件必须存储在 /usr/lib/systemd/system/postgresql.service 文件中提及的相同路径。
    • PostgreSQL 服务器:您的系统可以运行多个 PostgreSQL 服务器。确保所有这些服务器的数据目录都是独立处理的。
    • PostgreSQL 服务器模块:确保在 RHEL 8 中使用的 PostgreSQL 服务器模块也安装在 RHEL 9 系统中。请注意,插件安装在 /usr/lib64/pgsql/ 目录中。
  3. 确保 postgresql 服务在复制数据时未在源和目标系统上运行。

    # systemctl stop postgresql.service
    Copy to Clipboard Toggle word wrap
  4. 将源位置中的数据库文件复制到 RHEL 9 系统上的 /var/lib/pgsql/data/ 目录中。
  5. PostgreSQL 用户身份运行以下命令来执行升级过程:

    # postgresql-setup --upgrade
    Copy to Clipboard Toggle word wrap

    这会在后台启动 pg_upgrade 进程。

    在出现故障时,postgresql-setup 会提供一条说明性的错误消息。

  6. 将之前的配置从 /var/lib/pgsql/data-old 复制到新集群。

    请注意,快速升级不会在较新的数据栈中重用之前的配置,配置是从零开始生成的。如果要手动组合旧配置和新配置,请使用数据目录中的 *.conf 文件。

  7. 启动新的 PostgreSQL 服务器:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  8. 分析新的数据库集群。

    • 对于 PostgreSQL 13

      su postgres -c '~/analyze_new_cluster.sh'
      Copy to Clipboard Toggle word wrap
    • 对于 PostgreSQL 15 或更高版本:

      su postgres -c 'vacuumdb --all --analyze-in-stages'
      Copy to Clipboard Toggle word wrap
      注意

      您可能需要使用 ALTER COLLATION name REFRESH VERSION,请查看 上游文档 以了解详细信息。

  9. 如果您希望新 PostgreSQL 服务器在引导时自动启动,请运行:

    # systemctl enable postgresql.service
    Copy to Clipboard Toggle word wrap

4.7.4. 转储和恢复升级

使用转储和恢复升级时,您必须将所有的数据库内容转储到 SQL 文件转储文件中。请注意,转储和恢复升级比快速升级方法慢,可能需要在生成的 SQL 文件中进行一些手动修复。

您可以使用此方法将数据从 PostgreSQL 的任何 RHEL 8 版本迁移到 RHEL 9 中 PostgreSQL 的任何相等或更新版本。

在 RHEL 8 和 RHEL 9 系统中,PostgreSQL 数据默认存储在 /var/lib/pgsql/data/ 目录中。

要执行转储和恢复升级,请将用户改为 root

以下流程描述了从 PostgreSQL 10 的 RHEL 8 的默认版本迁移到 PostgreSQL 13 的 RHEL 9 版本。

流程

  1. 在 RHEL 8 系统中,启动 PostgreSQL 10 服务器:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  2. 在 RHEL 8 系统中,将所有数据库内容转储到 pgdump_file.sql 文件中:

    su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
    Copy to Clipboard Toggle word wrap
  3. 确保正确转储数据库:

    su - postgres -c 'less "$HOME/pgdump_file.sql"'
    Copy to Clipboard Toggle word wrap

    结果显示的转储的 sql 文件的路径为:/var/lib/pgsql/pgdump_file.sql

  4. 在 RHEL 9 系统中,安装 postgresql-server 软件包:

    # dnf install postgresql-server
    Copy to Clipboard Toggle word wrap

    另外,如果您在 RHEL 8 中使用了任何 PostgreSQL 服务器模块,也需要在 RHEL 9 系统中安装它们。如果您需要编译第三方 PostgreSQL 服务器模块,请根据 postgresql-devel 软件包进行构建。

  5. 在 RHEL 9 系统中,初始化新 PostgreSQL 服务器的数据目录:

    # postgresql-setup --initdb
    Copy to Clipboard Toggle word wrap
  6. 在 RHEL 9 系统中,将 pgdump_file.sql 复制到 PostgreSQL 主目录中,并检查是否已正确复制该文件:

    su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
    Copy to Clipboard Toggle word wrap
  7. 复制 RHEL 8 系统中的配置文件:

    su - postgres -c 'ls -1 $PGDATA/*.conf'
    Copy to Clipboard Toggle word wrap

    要复制的配置文件包括:

    • /var/lib/pgsql/data/pg_hba.conf
    • /var/lib/pgsql/data/pg_ident.conf
    • /var/lib/pgsql/data/postgresql.conf
  8. 在 RHEL 9 系统中,启动新的 PostgreSQL 服务器:

    # systemctl start postgresql.service
    Copy to Clipboard Toggle word wrap
  9. 在 RHEL 9 系统中,从转储的 sql 文件中导入数据:

    su - postgres -c 'psql -f ~/pgdump_file.sql postgres'
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat