39. 软件升级

由于PostGIS内置于PostgreSQL中,因此每个PostGIS安装实际上包含两个软件版本:PostgreSQL版本和PostGIS版本。通常来说,每个PostGIS版本理论上可以兼容多个PostgreSQL版本运行,反之亦然。

实际可用的版本组合取决于您使用的PostgreSQL发行版的打包者。大多数Linux软件包会为每个PostgreSQL版本提供多个PostGIS版本选项,允许根据需求选择独立升级或同步升级各个组件。

组件级升级方案可按以下维度规划。

39.1. 升级PostgreSQL

PostgreSQL 升级场景分为两种类型:

  • 当软件版本在「补丁」级别更新时,即构成「次要版本升级」。例如从 8.4.3 升级到 8.4.4,或从 9.0.1 升级到 9.0.3(支持跨多个补丁版本升级)。此类升级仅修复漏洞,不引入新功能或改变系统行为。

  • 当「主版本」或「次版本」号增加时即构成「主版本升级」。例如从 8.4.5 升级到 9.0.0,或从 9.0.5 升级到 9.1.1。此类升级将引入新特性并可能改变系统行为。

39.1.1. PostgreSQL 次要版本升级

"次要版本升级",无需特殊操作流程。只需安装新版本软件并重启服务器即可。

39.1.2. PostgreSQL 主版本升级

对于"主版本升级",存在两种升级方式。

39.1.2.1. 备份/恢复

备份与恢复操作需要将全部数据转为平台无关格式(文本表示)进行转储,并在恢复时重新转换为原生格式,因此可能耗时较长且消耗CPU资源。但若需迁移至新硬件架构或操作系统,此流程必不可少。作为经过时间验证的可靠升级方案,只要数据库规模适中,该方式始终是稳妥选择。

  • 将旧数据库中的数据通过 pg_dumpall 命令进行完整转储。

  • 安装新版本 PostgreSQL 及与旧数据库完全一致的 PostGIS 版本。必须保持 PostGIS 版本匹配,以确保转储文件中的函数定义能正确关联到预期版本的 PostGIS 库。

  • 使用新版本软件中的 ``initdb``程序初始化数据存储区。

  • 在新数据存储区启动新版本PostgreSQL服务。

  • 使用 ``pg_restore``命令恢复数据库转储文件。

39.1.2.2. pg_upgrade

pg_upgrade 工具允许直接升级PostgreSQL数据目录,无需进行数据转储/恢复操作。该工具虽无法处理数据文件本身的变更,但能应对PostgreSQL主版本升级中常见的系统表结构变化。

注解

PostgreSQL 官网的 pg_upgrade 页面提供了完整的升级操作指南。

pg_upgrade 程序要求同时访问新旧两个PostgreSQL版本,因此需预先安装这两个版本。

  • 安装待使用的 PostgreSQL 新版本。

  • 在新版 PostgreSQL 中安装与旧版本完全相同的 PostGIS 版本。

  • 使用新版``initdb``初始化 PostgreSQL 数据存储区。

  • 确保新旧 PostgreSQL 服务均处于停止状态。

  • 执行 pg_upgrade 命令,并确保使用新版本软件安装目录中的二进制文件。

    pg_upgrade
      --old-datadir "/var/lib/postgres/12/data"
      --new-datadir "/var/lib/postgres/13/data"
      --old-bindir "/usr/pgsql/12/bin"
      --new-bindir "/usr/pgsql/13/bin"
    
  • 若 pg_upgrade 生成任何 ``.sql``脚本文件,请立即执行。

  • 启动新的服务。

39.2. PostGIS 升级指南

PostGIS 通过 EXTENSION 机制处理次要版本与升级。若您曾使用 ``CREATE EXTENSION postgis``命令为数据库启用空间功能,可通过相同机制进行更新。

首先安装新版 PostgreSQL 软件,确保数据库可调用新版本组件。

随后执行以下SQL命令升级PostGIS扩展。

-- If you are upgrading from PostGIS 2.5 or later
-- and want the latest installed version
SELECT postgis_extensions_upgrade();

-- If you are upgrading from an earlier version
-- you have to specifically turn on the version you want
ALTER EXTENSION postgis UPDATE TO '2.5.5';