4.7. 迁移到 RHEL 9 的 PostgreSQL 版本
Red Hat Enterprise Linux 8 在多个模块流中提供 PostgreSQL :PostgreSQL 10(默认的 postgresql 流)、PostgreSQL 9.6、PostgreSQL 12、PostgreSQL 13、PostgreSQL 15 和 PostgreSQL 16。
在 RHEL 9 中,PostgreSQL 13、PostgreSQL 15 和 PostgreSQL 16 可用。
在 RHEL 中,您可以为数据库文件使用两个 PostgreSQL 迁移路径:
快速升级方法比转储和恢复过程要快。然而,在某些情况下,快速升级无法正常工作,例如,当跨架构升级时,只能使用转储和恢复过程。
迁移到更新版本的 PostgreSQL 的先决条件是备份所有 PostgreSQL 数据库。
转储和恢复过程需要转储数据库并执行SQL文件备份,建议使用快速升级方法。
在迁移到 PostgreSQL 的更高版本前,请参阅您要迁移到的 PostgreSQL 版本的 上游兼容性备注,以及您要迁移的版本和目标版本之间所有跳过的 PostgreSQL 版本。
4.7.1. PostgreSQL 15 和 PostgreSQL 16 之间的显著区别 复制链接链接已复制到粘贴板!
PostgreSQL 16 引入了以下显著变化。
postmasters 二进制文件不再提供
PostgreSQL 不再与 postmaster 二进制文件一起分发。使用提供的 systemd 单元文件启动 postgresql 服务器( systemctl start postgres.service 命令)的用户不受此更改的影响。如果您之前直接通过 postmaster 二进制文件启动了 postgresql 服务器,则您现在必须使用 postgres 二进制文件。
文档不再被打包
PostgreSQL 不再在软件包中以 PDF 格式提供文档。改为使用 在线文档。
4.7.2. PostgreSQL 13 和 PostgreSQL 15 之间的显著区别 复制链接链接已复制到粘贴板!
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);
postgres=# CREATE USER mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
以下示例在 PostgreSQL 15 及更高版本中正常工作:
postgres=# CREATE USER mydbuser; postgres=# GRANT ALL ON SCHEMA public TO mydbuser; postgres=# \c postgres mydbuser postgres=$ CREATE TABLE mytable (id int);
postgres=# CREATE USER mydbuser;
postgres=# GRANT ALL ON SCHEMA public TO mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
确保 mydbuser 访问在 pg_hba.conf 文件中被正确配置了。如需更多信息,请参阅 创建 PostgreSQL 用户。
pipeline 模式下不再支持 PQsendQuery ()
从 PostgreSQL 15 开始,管道模式中不再支持 libpq 库 PQsendQuery () 函数。修改受影响的应用程序,以使用 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/目录中。
流程
在 RHEL 9 系统中,安装
postgresql-server和postgresql-upgrade软件包:dnf install postgresql-server postgresql-upgrade
# dnf install postgresql-server postgresql-upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您在 RHEL 8 上使用了任何 PostgreSQL 服务器模块,那么也可以在 RHEL 9 系统上安装该模块的两个版本,分别针对 PostgreSQL 12 (作为
postgresql-upgrade软件包安装)和 PostgreSQL 13 的目标版本(作为postgresql-server软件包安装)进行编译。如果您需要编译第三方PostgreSQL服务器模块,请根据postgresql-devel和postgresql-upgrade-devel软件包来构建它。检查以下项:
-
基本配置:在 RHEL 9 系统中,检查您的服务器是否使用默认
/var/lib/pgsql/data目录,且数据库已正确初始化并启用。此外,数据文件必须存储在/usr/lib/systemd/system/postgresql.service文件中提及的相同路径。 - PostgreSQL 服务器:您的系统可以运行多个 PostgreSQL 服务器。确保所有这些服务器的数据目录都是独立处理的。
-
PostgreSQL 服务器模块:确保在 RHEL 8 中使用的 PostgreSQL 服务器模块也安装在 RHEL 9 系统中。请注意,插件安装在
/usr/lib64/pgsql/目录中。
-
基本配置:在 RHEL 9 系统中,检查您的服务器是否使用默认
确保
postgresql服务在复制数据时未在源和目标系统上运行。systemctl stop postgresql.service
# systemctl stop postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
将源位置中的数据库文件复制到 RHEL 9 系统上的
/var/lib/pgsql/data/目录中。 以 PostgreSQL 用户身份运行以下命令来执行升级过程:
postgresql-setup --upgrade
# postgresql-setup --upgradeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在后台启动
pg_upgrade进程。在出现故障时,
postgresql-setup会提供一条说明性的错误消息。将之前的配置从
/var/lib/pgsql/data-old复制到新集群。请注意,快速升级不会在较新的数据栈中重用之前的配置,配置是从零开始生成的。如果要手动组合旧配置和新配置,请使用数据目录中的 *.conf 文件。
启动新的 PostgreSQL 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 分析新的数据库集群。
对于 PostgreSQL 13 :
su postgres -c '~/analyze_new_cluster.sh'
su postgres -c '~/analyze_new_cluster.sh'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 对于 PostgreSQL 15 或更高版本:
su postgres -c 'vacuumdb --all --analyze-in-stages'
su postgres -c 'vacuumdb --all --analyze-in-stages'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意您可能需要使用
ALTER COLLATION name REFRESH VERSION,请查看 上游文档 以了解详细信息。
如果您希望新 PostgreSQL 服务器在引导时自动启动,请运行:
systemctl enable postgresql.service
# systemctl enable postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 版本。
流程
在 RHEL 8 系统中,启动 PostgreSQL 10 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 8 系统中,将所有数据库内容转储到
pgdump_file.sql文件中:su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
su - postgres -c "pg_dumpall > ~/pgdump_file.sql"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保正确转储数据库:
su - postgres -c 'less "$HOME/pgdump_file.sql"'
su - postgres -c 'less "$HOME/pgdump_file.sql"'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 结果显示的转储的 sql 文件的路径为:
/var/lib/pgsql/pgdump_file.sql。在 RHEL 9 系统中,安装
postgresql-server软件包:dnf install postgresql-server
# dnf install postgresql-serverCopy to Clipboard Copied! Toggle word wrap Toggle overflow 另外,如果您在 RHEL 8 中使用了任何 PostgreSQL 服务器模块,也需要在 RHEL 9 系统中安装它们。如果您需要编译第三方 PostgreSQL 服务器模块,请根据
postgresql-devel软件包进行构建。在 RHEL 9 系统中,初始化新 PostgreSQL 服务器的数据目录:
postgresql-setup --initdb
# postgresql-setup --initdbCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 9 系统中,将
pgdump_file.sql复制到 PostgreSQL 主目录中,并检查是否已正确复制该文件:su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 复制 RHEL 8 系统中的配置文件:
su - postgres -c 'ls -1 $PGDATA/*.conf'
su - postgres -c 'ls -1 $PGDATA/*.conf'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要复制的配置文件包括:
-
/var/lib/pgsql/data/pg_hba.conf -
/var/lib/pgsql/data/pg_ident.conf -
/var/lib/pgsql/data/postgresql.conf
-
在 RHEL 9 系统中,启动新的 PostgreSQL 服务器:
systemctl start postgresql.service
# systemctl start postgresql.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在 RHEL 9 系统中,从转储的 sql 文件中导入数据:
su - postgres -c 'psql -f ~/pgdump_file.sql postgres'
su - postgres -c 'psql -f ~/pgdump_file.sql postgres'Copy to Clipboard Copied! Toggle word wrap Toggle overflow