PostgreSQL 15 上周刚刚发布。为了庆祝 PostgreSQL 15 的到来,我将重新讨论大家在使用 PostGIS 时遇到的第一个问题,即如何在不安装旧 PostGIS 版本的情况下升级启用 PostGIS 的集群。
在上一篇文章中,使用 pg upgrade 升级 PostGIS 而无需安装旧版本,我演示了从 PostGIS 2.2 - 2.whatever 升级到新 PostgreSQL 实例的技巧,而无需在新的 PostgreSQL 服务中安装旧版本的 PostGIS。这是对那篇文章的重温,但考虑到从 2 系列升级到 3 系列。
别担心,从 PostGIS 2+ 升级到 PostGIS 3+ 仍然可以在没有在新集群中安装旧 PostGIS 2+ 的情况下完成。此外,一旦您使用 PostGIS 3.1+,您永远不必进行符号链接或复制黑客操作来将 PostGIS 3.1 升级到 PostGIS 3.4。至少对于同一个主要版本不是。
如果您有机会使用 PostGIS 1 并尝试一直跳到 PostGIS 3+,那么遗憾的是您需要将旧数据库/集群和 pg_restore 进行 pg_dump 到新集群中。
首先,如果您使用 PostGIS < 2.4,请参阅文章Using pg_upgrade to upgrade PostgreSQL 9.3 PostGIS 2.4 to PostgreSQL 11 (Drop functions that won't migrate)
对于这个练习,我将在 CentOS 7 Box 上进行,我按照类似于我在一个几乎白痴的指南中详细介绍的说明创建并安装了 PostGIS 2.4,使用 Yum 安装 PostgreSQL 9.3、PostGIS 2.1 和 pgRouting
这些步骤是特定于 CentOS/RHEL 的,但是无论您使用的是 Windows、FreeBSD/Unix、Linux 还是其他一些操作系统,您需要做的一般原则都是相同的。
对于其余部分,我假设您已经安装了 PostgreSQL 9.6 和 PostGIS 2.4,并且您想在同一台服务器上将其升级到 PostgreSQL 11 或更高版本。我在 PostgreSQL 9.6 上有一个数据库,其中安装了 postgis 2.4,名为gisdb
.
对于那些有依赖应用程序的人。从 PostgreSQL 11 到 15 的目录发生了很大变化。我发现对于大多数应用程序,您可以安全地将 PostgreSQL 9.6 升级到 11。从 PostgreSQL 12 开始,您可能需要升级数据库驱动程序,例如 JDBC、.NET、PHP ,甚至可能重写一些代码。因此,如果您的版本低于 PostgreSQL 11,请在尝试升级 PostgreSQL 12 或更高版本之前使用较新的 PostgreSQL 对您的应用程序进行大量测试。如果您使用 pgAdmin,那么如果您打算升级到 PostgreSQL 15,那么您肯定希望高于 6.10。只需安装最新版本的 pgAdmin,在撰写本文时它是 6.14。
补丁更新
在尝试 PostgreSQL 主要升级之前更新补丁总是好的。
sudo yum update sudo yum upgrade
复制
确认您的 PostgreSQL 和 PostGIS 版本
在您开始升级之旅之前,请登录您的旧集群并确认您正在运行什么。对于这个例子,我将连接到已经安装了 PostGIS的gisdb数据库。您可以使用 psql 或 pgAdmin 执行此操作。我正在服务器上使用 psql
su postgres psql -d gisdb -p 5432
复制
在 psql 控制台中
-- repeat for each postgisy extension you have ALTER EXTENSION postgis UPDATE; SELECT version(), postgis_full_version();
复制
您的输出应该如下所示(它显示需要升级的事实是 2.4 中的一个错误,您可以忽略)
version | postgis_full_version
-------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.24 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
| POSTGIS="2.4.9" PGSQL="96" GEOS="3.9.2-CAPI-1.14.3" SFCGAL="1.3.1" PROJ="Rel. 7.2.1, January 1st, 2021" GDAL="GDAL 3.2.3, released 202
1/04/27" LIBXML="2.9.1" LIBJSON="0.11"
LIBPROTOBUF="1.0.2" (core procs from "2.4.9" need upgrade)
TOPOLOGY (topology procs from "2.4.9" need upgrade)
RASTER (raster procs from "2.4.9" need upgrade) (sfcgal procs from "2.4.9" need upgrade)
(1 row)
复制
升级前删除 postgis_sfcgal 扩展
如果您在输出中看到SFCGAL,则表示您安装了postgis_sfcgal扩展。来自 PostGIS < 3.1,您需要在升级之前将其删除并在升级后重新安装。原因是postgis_sfcgal库文件(.so、.dll、.whatever)曾经是 postgis 库文件的一部分。这些在 PostGIS 3.1 中被拆分。所以我们稍后将展示的符号链接技巧在这里不起作用,因为新的 postgis 库文件缺少 sfcgal 函数。幸运的是postgis_sfcgal很少与数据相关联,因为它是一个仅限函数的库。
虽然仍在 psql 控制台中,但请执行以下操作。如果由于某种原因您有视图、索引等与此扩展相关联,则 drop 命令将失败。如果它成功了,你的状态就很好。
DROP EXTENSION postgis_sfcgal;
复制
停止旧集群
如果您仍在 psql 中,则按如下方式退出
\quit
复制
也退出 postgres 用户帐户
exit
复制
然后停止您的 9.6 服务并禁用它启动
sudo systemctl stop postgresql-9.6 sudo systemctl disable postgresql-9.6
复制
安装 PostgreSQL 15 和 PostGIS 3.3
下一步是安装新版本的 PostgreSQL。按着这些次序:
对于其余这些,我将假设您以 root 身份登录。如果您是具有 sudo 权限的非特权用户,要进入 root shell,请执行以下操作:
sudo -i
找出您拥有的 CentOS/Red Hat OS 版本:
cat /etc/redhat-release
复制我的返回:
CentOS Linux release 7.9.2009 (Core)
您需要 Enterprise Linux Extra Packages (epel) 存储库,因为 yum.postgresql.org 从那里获取依赖项。当您安装较旧的 PostgreSQL 时,您可能已经安装了它。如果没有,你可以这样做:
yum install epel-release
对于较旧的 CentOS/RedHat,您可能需要从主镜像 http://dl.fedoraproject.org/pub/epel 手动添加:
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
转到https://yum.postgresql.org/repopackages.php并复制与您的操作系统版本和 PostgreSQL 15 对应的链接
检查您是否有文件 /etc/yum.repos.d/pgdg.repo,如果没有或没有类似的文件,您可以使用以下命令创建这样的文件:
sudo tee /etc/yum.repos.d/pgdg.repo<<EOF [pgdg-15] name=PostgreSQL for 15 RHEL/CentOS 7 - x86_64 baseurl=https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7-x86_64/ enabled=1 gpgcheck=0 [pgdg-depends] name=PostgreSQL RHEL/CentOS 7 - x86_64 common baseurl=https://download.postgresql.org/pub/repos/yum/common/redhat/rhel-7-x86_64/ enabled=1 gpgcheck=0 EOF
复制如果您已经有一个 pgdg 文件,只需验证您是否已经有类似上述命令的内容(减去 EOF)。
- 运行:
sudo yum update
现在确认有来自 pgdg15 的 postgis 及其 postgis33
yum list | grep postgis
postgis24_96.x86_64 2.4.9-3.rhel7 @pgdg-9.6 postgis.x86_64 2.0.7-2.el7 epel postgis-docs.x86_64 2.0.7-2.el7 epel postgis-utils.x86_64 2.0.7-2.el7 epel postgis33_15.x86_64 3.3.1-2.rhel7 pgdg-15 postgis33_15-client.x86_64 3.3.1-2.rhel7 pgdg-15 postgis33_15-devel.x86_64 3.3.1-2.rhel7 pgdg-15 postgis33_15-docs.x86_64 3.3.1-2.rhel7 pgdg-15 postgis33_15-gui.x86_64 3.3.1-2.rhel7 pgdg-15 postgis33_15-utils.x86_64 3.3.1-2.rhel7 pgdg-15 :
复制安装 PostgreSQL 15
yum install postgresql15 postgresql15-server postgresql15-libs postgresql15-contrib
为 PostgreSQL 15 安装 PostGIS 3.3
yum install postgis33_15
它将安装很多东西(48+ 依赖项)
初始化您的 PostgreSQL 15 数据集群。如果您使用的是 CentOS 7 或更高版本,则需要使用 system V systemctl 方式:
/usr/pgsql-15/bin/postgresql-15-setup initdb
旧系统,获得更好的方法
service postgresql-15 initdb
假设我们在 PostgreSQL 15 中安装了 postgis-2.4。在 PostGIS 3.0 之前,lib 文件包含次要版本,因此需要我将要解释的这个烦人的链接黑客。如果您使用的是 PostGIS 3+,则 lib 文件应全部以 -3 结尾(没有次要版本)。所有 PostgreSQL 扩展都绑定到为其编译的 PostgreSQL 版本。这意味着我们不能从 PostgreSQL 9.6 中复制 postgis-2.4,但是我们可以复制我们的 postgis*-3 并将其命名为 postgis*-2.4。我们已经删除了 postgis-3 库中不存在的函数,这样 pg_upgrade 就不会抱怨了。
cp /usr/pgsql-15/lib/postgis-3.so /usr/pgsql-15/lib/postgis-2.4.so
复制PostGIS 3.0 中改变的另一件事是 lib 文件的标准化以匹配 postgis_raster 扩展名,所以这里的链接有点让人吃惊。
cp /usr/pgsql-15/lib/postgis_raster-3.so /usr/pgsql-15/lib/rtpostgis-2.4.so
复制如果您的数据库中安装了 postgis_topology 或 address_standardizer 扩展,则需要重复这些扩展,如下所示:
cp /usr/pgsql-15/lib/postgis_topology-3.so /usr/pgsql-15/lib/postgis_topology-2.4.so -- in older versions address_standardizer did not have a version as part of lib, it now does cp /usr/pgsql-15/lib/address_standardizer-3.so /usr/pgsql-15/lib/address_standardizer.so
复制postgis_tiger_geocoder 扩展是一个纯 plpgsql/no c 库,因此不需要任何特殊处理。
进行升级
现在我们进行升级。您需要作为 postgres 用户执行此操作。因此,在转向 postgres 用户之前,我将为 postgres 创建一个空间来进行升级。
su postgres cd ~/
复制然后升级,这里我使用--link模式来减少停机时间。如果您出于某种原因需要能够运行旧的 PostgreSQL 服务来检查事物,请删除该
--link
模式/usr/pgsql-15/bin/pg_upgrade \ -b /usr/pgsql-9.6/bin/ -B /usr/pgsql-15/bin/ \ -d /var/lib/pgsql/9.6/data -D /var/lib/pgsql/15/data \ --link
复制输出应如下所示:
Performing Consistency Checks ----------------------------- Checking cluster versions ok Checking database user is the install user ok Checking database connection settings ok Checking for prepared transactions ok Checking for system-defined composite types in user tables ok Checking for reg* data types in user tables ok Checking for contrib/isn with bigint-passing mismatch ok Checking for user-defined encoding conversions ok Checking for user-defined postfix operators ok Checking for incompatible polymorphic functions ok Checking for tables WITH OIDS ok Checking for invalid "sql_identifier" user columns ok Checking for invalid "unknown" user columns ok Creating dump of global objects ok Creating dump of database schemas ok Checking for presence of required libraries ok Checking database user is the install user ok Checking for prepared transactions ok Checking for new cluster tablespace directories ok If pg_upgrade fails after this point, you must re-initdb the new cluster before continuing. Performing Upgrade ------------------ Analyzing all rows in the new cluster ok Freezing all rows in the new cluster ok Deleting files from new pg_xact ok Copying old pg_clog to new server ok Setting oldest XID for new cluster ok Setting next transaction ID and epoch for new cluster ok Deleting files from new pg_multixact/offsets ok Copying old pg_multixact/offsets to new server ok Deleting files from new pg_multixact/members ok Copying old pg_multixact/members to new server ok Setting next multixact ID and offset for new cluster ok Resetting WAL archives ok Setting frozenxid and minmxid counters in new cluster ok Restoring global objects in the new cluster ok Restoring database schemas in the new cluster ok Adding ".old" suffix to old global/pg_control ok If you want to start the old cluster, you will need to remove the ".old" suffix from /var/lib/pgsql/9.6/data/global/pg_control.old. Because "link" mode was used, the old cluster cannot be safely started once the new cluster has been started. Linking user relation files ok Setting next OID for new cluster ok Sync data directory to disk ok Creating script to delete old cluster ok Checking for hash indexes ok Checking for extension updates notice Your installation contains extensions that should be updated with the ALTER EXTENSION command. The file update_extensions.sql when executed by psql by the database superuser will update these extensions. Upgrade Complete ----------------
升级完成 ---------------- pg_upgrade 不会传输优化器统计信息。 启动新服务器后,请考虑运行: /usr/pgsql-15/bin/vacuumdb --all --analyze-in-stages 运行此脚本将删除旧集群的数据文件: ./delete_old_cluster.sh复制如果您看到类似“您的安装引用了新安装中缺少的可加载库”之类的错误。您可以将这些库添加到新安装中,或从旧安装中删除使用它们的功能。问题库列表在文件中:/var/lib/pgsql/15/data/pg_upgrade_output.d/20221017T053014.835/loadable_libraries.txt
不要恐慌。阅读列出缺失库的文件。常见问题是,例如您安装了 pgrouting 扩展,并且是次要版本。查看旧集群和新集群,看看应该调用什么文件,然后执行相同操作:
如果缺少扩展,请安装:exit sudo yum install pgrouting_15
ls /usr/pgsql-15/lib/*pgrouting* ls /usr/pgsql-9.6/lib/*pgrouting*
复制就我而言,我在 9.6 中有 pgrouting-3.0,但在 PG 15 中有 pgrouting-3.2。要修复我做了:
cp /usr/pgsql-15/lib/libpgrouting-3.2.so /usr/pgsql-15/lib/libpgrouting-3.0.so
复制PostgreSQL 中的大多数扩展都没有版本控制,因此通常只需在新集群中安装缺少的扩展即可。
如果上述任何一项失败并且您到达它所说的部分
you must re-initdb
销毁新集群并使用以下方法重新创建
exit rm -rf /var/lib/pgsql/15/data /usr/pgsql-15/bin/postgresql-15-setup initdb
复制现在启动 PostgreSQL 15 服务:
您会收到如下通知,我们将按照通知执行。 警告:解包栅格警告:PostGIS 栅格功能已解包提示:键入`SELECT postgis_extensions_upgrade();` 以完成升级。升级后,如果要删除光栅,运行:DROP EXTENSION postgis_raster;exit #get back in as root systemctl start postgresql-15 systemctl enable postgresql-15 su postgres psql -- repeat this for each database with PostGIS installed \connect gisdb ALTER EXTENSION postgis UPDATE;
复制
-- 应该输出SELECT postgis_extensions_upgrade(); -- you'll get some NOTICES about backend which you can ignore SELECT postgis_full_version();
复制postgis_full_version -------------------------------------------------- -------------------------------------------------- ------------------------------------------
POSTGIS="3.3.1 3786b21" [EXTENSION] PGSQL="150" GEOS="3.11.0-CAPI-1.17.0" PROJ="7.2.1" GDAL="GDAL 3.4.3, released 2022/04/22" LIBXML="2.9.1" LIBJSON="0.11" TOPOLOGY RASTER (1 row)
复制- 此时您可以安全地删除 postgis_raster,请注意,如果您有栅格数据,以下操作将失败,因此可以安全运行。
DROP EXTENSION postgis_raster;
复制 - 如果您使用的是 postgis_sfcgal,您可以按如下方式重新安装它:
CREATE EXTENSION postgis_sfcgal;
复制 - 您应该运行由 pg_upgrade 生成的。这将负责升级您可能拥有的其他扩展,如果您从 PostGIS 3.* 升级到 PostGIS 3.* 安装,这也是您真正需要的
psql -f update_extensions.sql
复制 退出 psql 控制台
\quit
复制分析所有数据库:
/usr/pgsql-15/bin/vacuumdb --all --analyze-in-stages
删除旧集群:
./delete_old_cluster.sh
升级所有数据库后,您可以删除您创建的 *2.4.sos
sudo rm /usr/pgsql-15/lib/postgis*-2.4.so sudo rm /usr/pgsql-15/lib/rtpostgis-2.4.so
复制
删除旧的 postgresql 安装
如果您确信一切都很好,您可以安全地卸载旧的 PostgreSQL,如下所示:
yum remove postgresql96
复制
这应该级联并删除所有 postgresql96 扩展、服务器和贡献。您将收到如下所示的确认消息:
依赖关系已解决 =================================================================================================================================================================================================================================================== Package Arch Version Repository Size =================================================================================================================================================================================================================================================== Removing: postgresql96 x86_64 9.6.24-1PGDG.rhel7 @pgdg-9.6 7.5 M Removing for dependencies: pgrouting_96 x86_64 3.0.4-1.rhel7 @pgdg-9.6 5.3 M postgis24_96 x86_64 2.4.9-3.rhel7 @pgdg-9.6 118 M postgresql96-contrib x86_64 9.6.24-1PGDG.rhel7 @pgdg-9.6 2.0 M postgresql96-server x86_64 9.6.24-1PGDG.rhel7 @pgdg-9.6 19 M Transaction Summary =================================================================================================================================================================================================================================================== Remove 1 Package (+4 Dependent packages) Installed size: 152 M Is this ok [y/N]: y复制
复制
原文标题:Using pg_upgrade to upgrade PostgreSQL 9.6 PostGIS 2.4 to PostgreSQL 15 3.3 on Yum复制原文作者:Regina
原文地址:https://www.bostongis.com/blog/index.php?/archives/278-Using-pg_upgrade-to-upgrade-PostgreSQL-9.6-PostGIS-2.4-to-PostgreSQL-15-3.3-on-Yum.html