升级到新主版本

Databases for PostgreSQL 提供了三种不同的升级路径:

  • 就地升级到新的主要版本。
  • 从备份中恢复。
  • 从只读副本进行升级。

当数据库的主版本即将达到生命周期终止(EOL)时,建议升级到当前的主版本。

可在 IBM Cloud 目录页面 中查看 Databases for PostgreSQL 的可用版本,也可通过 Cloud Databases CLI 插件命令 ibmcloud cdb deployables-show,或通过 Cloud Databases API /deployables 端点获取xml-ph-0000@deepl.internal的可用版本。

当您升级到新实例时,还需要修改应用程序中的连接信息。

在下面的示例命令中,{id} 需要数据库实例的完整 CRN。 由于 CRN 包含特殊字符,因此必须对其进行 URL 编码,以避免出现“not_found”错误。

升级到 PostgreSQL 新主版本的要求

在开始任何主要版本升级之前,请先检查必须保留的扩展、复制对象和应用程序依赖项。

某些扩展和逻辑复制对象具有版本特异性,或者依赖于必须与 PostgreSQL 主版本相匹配的服务器端组件。 在升级前将其删除有助于避免故障,并使您能在新版本运行后仅重新创建受支持的对象。

需要审查的扩展和逻辑复制对象

升级前请检查以下事项:

扩展

  • pg_repack
  • old_snapshot
  • wal2json
  • anon
  • PostGIS

复制槽

  • Logical replication slots

应用程序依赖项 如果您删除了应用程序所依赖的扩展或复制对象,请在继续升级之前验证数据流和应用程序的行为。 此外,还应考虑依赖于 PostgreSQL 特定功能的应用程序逻辑可能出现的问题。

pg_repack

请在升级前删除 pg_repack,并在升级后重新创建该数据库。pg_repack 使用特定于版本的扩展以及客户端/服务器组件,这些组件必须与 PostgreSQL 的主版本保持一致。

DROP EXTENSION pg_repack;

只有当您的工作负载仍然需要该扩展时,才应在升级后重新创建该扩展。

CREATE EXTENSION pg_repack;

old_snapshot

在升级前请删除 old_snapshot。 升级到 PostgreSQL 18后,请勿重新创建该对象,因为它已不再受支持。

DROP EXTENSION old_snapshot;

wal2json 复制槽

如果您使用 wal2json 进行逻辑解码,则必须在升级前删除所有相关的复制槽。 pg_upgrade 实用程序严格禁止在存在复制槽的情况下进行主版本升级,并将抛出严重错误并中止升级。

升级前:

  1. 确保所有待处理的 WAL 数据均已被处理完毕。
  2. 停止使用该复制槽的应用程序。
  3. 删除复制槽:
SELECT pg_drop_replication_slot('your_slot_name');

升级完成后,您可以根据需要重新创建复制槽。 请注意,wal2json 并非通过 CREATE EXTENSION 安装,而是通过数据库参数(wal_levelmax_replication_slotsmax_wal_senders )和表权限进行配置的,这些配置不会阻碍升级。

anon

请在升级前卸载 anon 扩展,如果升级后仍需使用该扩展,请重新启用它。 在卸载 anon 之前,还需要执行一些额外步骤。

如果已安装 anon 扩展,请在执行升级之前按照以下步骤操作,并以管理员用户身份执行相关命令。

  1. 删除所有遮罩规则(如果已启用)。

    SELECT anon.remove_masks_for_all_columns();
    
  2. 禁用屏蔽角色(如果任何角色被标记为“屏蔽”,升级可能会失败)。

    SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL;
    
  3. 使用级联选项,禁用 anon 扩展。

    DROP EXTENSION anon CASCADE;
    
  4. 如果 anon 扩展已安装在同一实例内的多个数据库中,请针对每个数据库分别按照所述步骤操作。

  5. 升级完成后,请重新启用 anon 扩展,并根据需要重新应用屏蔽规则。

强烈建议在删除扩展前后均对数据进行验证,以确保在执行升级之前,数据屏蔽保持一致。

PostGIS

如果您使用的是 PostGIS,,请先升级 PostGIS,然后再升级 PostgreSQL。

SELECT postgis_extensions_upgrade();

使用以下查询来验证 PostGIS 扩展程序的升级情况。

SELECT postgis_full_version();

Logical replication slots

在升级前删除所有逻辑复制槽,并在升级后重新创建它们。 逻辑插槽与源服务器的状态相关联,应在升级后的实例上进行彻底重建。

SELECT pg_drop_replication_slot('<slot_name>');

就地进行主要版本升级

就地主要版本升级(IPU)可让您将部署升级至受支持的目标 /docs/databases-for-postgresql?topic=databases-for-postgresql-versioning-policy#version-definitions,而无需将备份恢复到新的部署中。 此次升级将保留现有的连接字符串,因此无需重新配置。

不过,如果新版本引入了兼容性差异,可能需要对应用程序进行修改。

在升级期间,您的部署将经历短暂的停机。 所需时间取决于您的部署规模和复杂程度。

如果您的应用程序在升级过程中必须继续读取数据,您可以配置一个 /docs/databases-for-postgresql?topic=databases-for-postgresql-read-only-replicas&interface=ui#read-only-replicas-provision,并更新您的应用程序以使用该副本。 如果升级未成功完成,您可以将副本提升为主节点。 如需了解更多信息,请参阅 /docs/databases-for-postgresql?topic=databases-for-postgresql-read-only-replicas&interface=ui#read-only-replicas-ipu。

Databases for PostgreSQL 在就地进行主要版本升级之前或之后,不会自动创建备份。

为了提高可恢复性,请创建:

  • 升级前请进行备份,以保护您当前的数据状态
  • 升级后立即进行备份,以建立新版本的第一个还原点

如果您在升级后未进行备份,则在新版本中将无法使用特定时间点恢复(PITR)功能,直到下一次计划备份完成为止。

升级前创建的备份和PITR还原点仍与旧版本相关联,无法还原到已升级的版本中。 不过,它们仍然可以用于将早期版本恢复到新的部署环境中。

逻辑复制槽

在升级前删除所有逻辑复制槽,升级后再重新创建它们。 逻辑复制槽与源服务器的状态相关联,必须在升级后的实例上重新创建。

SELECT pg_drop_replication_slot('<slot_name>');

准备工作

在开始升级之前,请确认以下事项:

  • 请通过 UI、API、CLI 或 Terraform 验证您的部署是否支持版本升级。

    示例(CLI):

    ibmcloud cdb capability-show versions postgresql
    
  • 查看预核查要求。 升级在源部署环境中运行, 如果检测到风险,则会暂停。 确保:

    • 部署状态正常
    • 至少有 10% 的可用磁盘空间
    • I/O 利用率低于 90%
    • 模式大小和对象数量均在支持范围内
    • 所需的扩展和逻辑复制槽清理已完成
  • 请查阅《 https://www.postgresql.org/docs/release/ 》,了解可能影响您应用程序的兼容性变更。

  • 不支持降级到较早的版本。

  • 就地升级一旦开始,就无法取消。

  • 升级前,请确保有最新的备份。

支持以下版本的原地升级路径:Gen2
来源:PostgreSQL 版本 支持的原地升级目标
18 未来的主要版本(如有)

Gen2 从 PostgreSQL 18开始。 随着对新版本的支持陆续推出,相应的升级路径也将陆续添加。 关于早期版本(14–17),请参阅 /docs/databases-for-postgresql?topic=databases-for-postgresql-upgrading。

升级完成后,您的部署将运行 PostgreSQL 的新主版本。 升级前的备份和PITR还原点属于较早版本的时间线,无法还原到已升级的版本中。

为了在新版本中保持还原和PITR功能,请在升级完成后立即进行备份。 此备份将成为未来恢复操作的基准。

如果升级失败,仍可利用升级前的备份通过 PITR 将早期版本恢复到新的部署环境中。

在用户界面中进行升级

  1. 通过从现有部署中还原同一版本的备份,创建一个测试部署。

  2. 更新您的预发布应用程序,使其使用测试部署,并验证其功能。

  3. “概览”页面上,点击 “升级主版本”以开始升级。

  4. 在升级后的测试部署环境中验证应用程序的行为。

  5. 验证完成后,请升级您的生产环境部署。

    升级开始后,无法停止或回滚。 请确保有最新的备份可用。

“升级开始时限”指升级任务必须在该时间之前开始,否则将被自动取消。 请根据您的维护窗口设置此值。 例如,如果升级需要 30 分钟,而您的时间窗口为 1 小时,则将过期时间设置为 30 分钟。 有效期可在5分钟至24小时之间。

通过 API 进行升级

使用以下请求启动就地升级:

curl -X PATCH https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/version \
  -H 'Authorization: Bearer <>' \
  -H 'Content-Type: application/json' \
  -d '{"version": "15"}'

如需了解更多信息,请参阅 Cloud Databases API

通过命令行界面(CLI)进行升级

可在 CDB 插件版本 >= 0.20.0 中使用。

要查看可用的升级路径:

ibmcloud cdb deployment-capability-show <NAME|CRN> versions

要开始升级:

ibmcloud cdb deployment-version-upgrade <NAME|CRN> <TARGET_VERSION>

有关命令的详细信息:

ibmcloud cdb deployment-version-upgrade --help

请使用 --expire-in--expire-at 来设置过期时间。

通过 Terraform 进行升级

适用于 Terraform 提供程序版本 >= 1.79.2。

若要升级,请更新配置文件中的 version 值。

如果在升级前跳过备份,一旦升级失败,可能会导致数据丢失。 请确保有最新的备份可用。

如有必要,请延长超时时间,因为 Terraform 使用的是超时设置,而非过期时间戳。

故障诊断

如果升级成功后出现问题,且您需要恢复到上一版本,请联系 IBM Cloud® 技术支持以获取指导。 请勿在无人指导的情况下执行 PITR 或恢复操作,否则可能会使恢复过程变得复杂。

只有在所有预检查均通过后,才会执行升级。 如果升级受阻,请确认:

  • 集群健康状况(Patroni状态为稳定)
  • 足够的可用磁盘空间
  • 可接受的磁盘I/O利用率
  • 模式大小和对象数量限制

大型模式和庞大的对象数量可能会延长升级所需的时间。

如果升级尝试仍失败,请通过 https://cloud.ibm.com/login?redirect=%2Funifiedsupport%2Fsupportcenter 提交支持工单。

从只读副本升级

通过 配置只读副本 进行升级。 部署一个与您的部署具有相同数据库版本的只读副本,并等待其复制所有数据。 当您的部署及其副本同步完成后,请将只读副本提升并升级为运行新版数据库的完整、独立部署。 要执行升级和提升步骤,请在请求正文中向 /deployments/{id}/remotes/promotion 该端点,并在请求正文中指定要升级到的版本。

该请求如下所示:

curl -X POST \
  https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/remotes/promotion \
  -H 'Authorization: Bearer <>'  \
 -H 'Content-Type: application/json' \
 -d '{
    "promotion": {
        "version": "14",
        "skip_initial_backup": false
    }
}' \

skip_initial_backup 是可选的。 如果设置为 true,则在升级完成后,新部署不会执行初始备份。 您的新部署将在更短的时间内上线,但代价是该部署在下次自动备份运行之前,或者您执行按需备份之前,都不会被备份。

对促销和升级进行模拟演练

要评估主要版本升级的影响,请触发一次模拟运行。 模拟运行会模拟晋升和升级过程,并将结果写入数据库日志。 通过 “日志分析”集成 访问并查看您的数据库日志。 这可确保您当前运行的版本及其扩展能够成功升级到您目标的版本。

在进行干跑时,必须将 skip_initial_backup 设置为 false,并定义 version

该命令如下所示:

curl -X POST \
  https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/remotes/promotion \
  -H 'Authorization: Bearer <>'  \
 -H 'Content-Type: application/json' \
 -d '{
    "promotion": {
        "version": "14",
        "skip_initial_backup": false,
        "dry_run": true
    }
}' \

升级的备份与还原

您可以通过将数据 备份还原到 运行新数据库版本的新部署环境中,来升级数据库版本。

在用户界面中进行升级

“部署”仪表板的 “备份” 菜单中 恢复备份 时,请升级到新版本。 点击备份中的 “还原”按钮,将在新标签页中打开配置页面,您可以在该页面上更改新部署的一些选项。 其中一个选项是数据库版本,该选项会自动填充可供您升级的可用版本。 选择一个版本,然后单击 “创建”以开始配置和还原过程。

通过命令行界面(CLI)进行升级

若要通过 IBM Cloud 命令行界面(CLI)进行升级并从备份中恢复,请使用资源控制器中的配置命令。

ibmcloud resource service-instance-create <DEPLOYMENT_NAME_OR_CRN> <SERVICE_ID> <SERVICE_PLAN_ID> <REGION>

参数 service-nameservice-idservice-plan-idregion 均为必填项。 您还需要将版本和备份 ID 参数作为 JSON 对象提供给 -p。 新部署的配置会自动调整为与备份时源部署相同的磁盘和内存规格。

该命令如下所示:

ibmcloud resource service-instance-create example-upgrade databases-for-postgresql standard us-south \
-p \ '{
  "backup_id": "crn:v1:bluemix:public:databases-for-postgresql:us-south:a/54e8ffe85dcedf470db5b5ee6ac4a8d8:1b8f53db-fc2d-4e24-8470-f82b15c71717:backup:06392e97-df90-46d8-98e8-cb67e9e0a8e6",
  "version":14
}'

通过 API 进行升级

在使用 资源控制器 API 从备份中升级系统之前,请先完成必要的准备步骤。 然后,向 API 发送一个 POST 请求。 参数 nametargetresource_groupresource_plan_id 均为必填项。 您还需提供版本号和备份 ID。 新部署的内存和磁盘分配与备份时源部署的分配相同。

该命令如下所示:

curl -X POST \
  https://resource-controller.cloud.ibm.com/v2/resource_instances \
  -H 'Authorization: Bearer <>' \
  -H 'Content-Type: application/json' \
    -d '{
    "name": "my-instance",
    "target": "bluemix-us-south",
    "resource_group": "5g9f447903254bb58972a2f3f5a4c711",
    "resource_plan_id": "databases-for-postgresql-standard",
    "backup_id": "crn:v1:bluemix:public:databases-for-postgresql:us-south:a/54e8ffe85dcedf470db5b5ee6ac4a8d8:1b8f53db-fc2d-4e24-8470-f82b15c71717:backup:06392e97-df90-46d8-98e8-cb67e9e0a8e6",
    "version":14
  }'

强制升级

在支持终止日期之后,所有运行已弃用版本的活跃 Databases for PostgreSQL 部署都将自动升级到下一个受支持的版本。 例如,PostgreSQL 13(已弃用)已升级至 14 版。

请在产品生命周期结束日期之前进行升级,以避免以下风险:

  • 此类强制升级不提供任何服务水平协议(SLA)。
  • 您可能会遇到一些数据丢失的情况。
  • 您的应用程序可能会出现长时间停机的情况。
  • 如果您的应用程序与新版本不兼容,可能会停止运行。
  • 您无法控制此次升级在您的部署中何时进行。
  • 此次强制升级没有回滚流程。

有关支持终止日期,请参阅 版本政策页面

版本升级过程中的_角色权限_问题

从 PostgreSQL 16开始,角色权限的强制执行更加严格。 这是一项上游的 PostgreSQL 架构变更,并非 IBM® 特有的行为变更。 在早期版本中,具有 CREATEROLE 属性的角色可以更广泛地管理其他角色。 在 PostgreSQL 16及更高版本中,若要授予或撤销某个角色,该角色必须拥有对另一个角色的“ADMIN OPTION”。 如需了解更多信息,请参阅《 PostgreSQL 16 发行说明 》、角色属性以及 关于角色的文档 GRANT

如果您要从 PostgreSQL 15或更早版本升级到 PostgreSQL 16或更高版本,请在开始就地升级(IPU)之前检查您的角色授权。 如果升级后必须继续进行角色管理,请在开始升级之前,确保已为所需角色授予 WITH ADMIN OPTION 权限。

如果升级后遇到与权限相关的错误,例如:

ERROR: only roles with the ADMIN OPTION on role "some_role" may grant this role
DETAIL: role "admin" is not permitted to grant role "some_role"

使用内置辅助函数 grant_admin_option_to_roles 来为特定角色恢复 ADMIN OPTION

  • 仅适用于从 PostgreSQL、v15 及更早版本升级到 PostgreSQL 16及更高版本的数据库(如果您遇到了上述错误)。
  • 接受一个任意的角色列表,以对这些角色应用修复。
  • 只能由 admin user 执行。
  • 可以安全地多次执行(幂等)。

样本用法:

SELECT grant_admin_option_to_roles('role1', 'role2', 'role3');

此函数将指定的角色(role1role2role3 )授予具有 ADMIN OPTION 权限的 admin 用户,从而允许 admin 用户在已升级的实例中管理(授予、撤销、修改或删除)这些角色。

PostgreSQL 主要版本的更新日志

有关 PostgreSQL 早期版本(14-17)的信息,请参阅 Gen1 的变更日志