37. 软件升级

由于 PostGIS 位于 PostgreSQL 中,因此每个 PostGIS 安装实际上都包含两个版本的软件:PostgreSQL 版本和 PostGIS 版本。一般来说,每个版本的 PostGIS 理论上可以在多个版本的 PostgreSQL 中运行,反之亦然。

实际上,可用的确切版本对将由构建 PostgreSQL 发行版的打包程序决定。大多数 Linux 包为每个 PostgreSQL 版本发布包含几个 PostGIS 版本,允许根据您的偏好独立或同时升级这些部分。

升级可以从升级每个组件的角度来考虑。

37.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。大版本升级添加了新功能并更改了行为。

37.1.1. 小版本 PostgreSQL 升级

对于“小版本升级”,不需要任何特殊流程。只需安装新软件并重新启动服务器即可。

37.1.2. 大版本 PostgreSQL 升级

对于“大版本升级”,有两种方法可以进行升级。

37.1.2.1. 转储/恢复

转储和恢复涉及将所有数据转换为平台无关格式(文本表示)进行转储,并在恢复时转换回本机表示,因此可能非常耗时且占用大量 CPU 资源。但是,如果您要迁移到新的架构或操作系统,则这是必需的过程。它也是一个经过时间考验且广为人知的升级路径,因此,如果您的数据库不太大,就没有理由不坚持使用它。

  • 从旧数据库中转储您的数据 pg_dumpall

  • 安装新版本的 PostgreSQL 和与旧数据库中使用的相同版本的 PostGIS。您需要匹配 PostGIS 版本,以便转储文件函数定义引用预期版本的 PostGIS 库。

  • 使用新软件中的 initdb 程序初始化新的数据区域。

  • 在新数据区域上启动新服务器。

  • 使用 pg_restore 恢复转储文件。

37.1.2.2. pg_upgrade

pg_upgrade 实用程序允许升级 PostgreSQL 数据目录,而无需转储/恢复步骤。该实用程序无法处理数据文件本身的更改,但处理 PostgreSQL 主要升级中系统表中更常见和更频繁的更改。

注意

运行升级过程的完整说明在 PostgreSQL 网站上的 pg_upgrade 网页中。

pg_upgrade 程序需要访问它正在使用的两个版本的 PostgreSQL,即旧版本和新版本,因此您必须安装这两个版本。

  • 安装您将要使用的 PostgreSQL 的新版本。

  • 将旧 PostgreSQL 中使用的相同版本的 PostGIS 安装到新的 PostgreSQL 中。

  • 使用新的 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 文件,请立即运行它们。

  • 启动新服务器。

37.2. 升级 PostGIS

PostGIS 通过 EXTENSION 机制处理次要和主要升级。如果您使用 CREATE EXTENSION postgis 启用了数据库的空间功能,则可以使用相同的机制更新数据库。

首先,安装新软件,使其可供数据库使用。

然后,运行 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';