暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用pg_upgrade在Yum上升级PostgreSQL 9.6 PostGIS 2.4到PostgreSQL 15 3.3

原创 上善若水 2022-10-19
943

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

  1. 找出您拥有的 CentOS/Red Hat OS 版本:

    cat /etc/redhat-release
    复制

    我的返回:CentOS Linux release 7.9.2009 (Core)

  2. 您需要 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
  3. 转到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)。

  4. 运行:sudo yum update
  5. 现在确认有来自 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
    
    :
            
    复制
  6. 安装 PostgreSQL 15

    yum install postgresql15 postgresql15-server postgresql15-libs postgresql15-contrib
  7. 为 PostgreSQL 15 安装 PostGIS 3.3

    yum install postgis33_15

    它将安装很多东西(48+ 依赖项)

  8. 初始化您的 PostgreSQL 15 数据集群。如果您使用的是 CentOS 7 或更高版本,则需要使用 system V systemctl 方式:

    /usr/pgsql-15/bin/postgresql-15-setup initdb

    旧系统,获得更好的方法

    service postgresql-15 initdb
  9. 假设我们在 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 库,因此不需要任何特殊处理。

进行升级

  1. 现在我们进行升级。您需要作为 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
    
    复制
  2. 现在启动 PostgreSQL 15 服务:

    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;
    复制
    您会收到如下通知,我们将按照通知执行。 警告:解包栅格警告:PostGIS 栅格功能已解包提示:键入`SELECT postgis_extensions_upgrade();` 以完成升级。升级后,如果要删除光栅,运行:DROP EXTENSION postgis_raster;
    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)
    复制
  3. 此时您可以安全地删除 postgis_raster,请注意,如果您有栅格数据,以下操作将失败,因此可以安全运行。
    DROP EXTENSION postgis_raster;
    复制
  4. 如果您使用的是 postgis_sfcgal,您可以按如下方式重新安装它:
    CREATE EXTENSION postgis_sfcgal;
    复制
  5. 您应该运行由 pg_upgrade 生成的。这将负责升级您可能拥有的其他扩展,如果您从 PostGIS 3.* 升级到 PostGIS 3.* 安装,这也是您真正需要的
    psql -f update_extensions.sql
    复制
  6. 退出 psql 控制台

    \quit
    复制
  7. 分析所有数据库:

    /usr/pgsql-15/bin/vacuumdb --all --analyze-in-stages
  8. 删除旧集群:

    ./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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论