升级到新主版本

截至2025年 Databases for PostgreSQL 12月,提供三种不同的升级路径:

  • 就地升级至新主要版本。
  • 从备份恢复。
  • 从只读副本升级。

当数据库的主要版本接近生命周期终点(EOL)时,建议升级到当前的主要版本。

IBM Cloud 目录 页面中,从 Cloud Databases CLI 插件命令 ibmcloud cdb deployables-show或从 Cloud Databases API /deployables 端点查找 Databases for PostgreSQL 的可用版本。

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

在以下示例命令中,{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,,请在升级 PostgreSQL 之前,先升级 PostGIS。

SELECT postgis_extensions_upgrade();

使用以下查询验证 PostGIS 扩展升级。

SELECT postgis_full_version();

Logical replication slots

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

SELECT pg_drop_replication_slot('<slot_name>');

就地进行主要版本升级

就地主版本升级可让您将部署升级至受支持的目标 主版本,从而无需 将备份恢复 到新的部署环境中。 此方法保持相同的连接字符串,无需重新配置部署。 然而,如果新的大版本需要应用程序调整,则必须进行处理。

在就地进行主要版本升级期间,您的部署将经历短暂的停机时间。 这是意料之中的,因为该过程遵循了供应商推荐的升级方法。 具体持续时间可能因部署模式的规模和复杂程度而异。 如果您的服务需要在此期间从升级的实例中读取数据,您可以通过 创建备用实例 更新应用程序的连接详情,以指向备用实例。 这样就能确保在开始升级前拥有最新的数据库副本。 若就地升级未能成功完成,备用实例也可被提升并用作主实例。 有关其他信息,请参阅就 地主要版本升级时的只读副本状态

Databases for PostgreSQL 为客户提供灵活管理自身备份的自由。 就地执行主要版本升级过程不会在任务前后自动创建备份。 如果升级不成功,您可能需要从最近的有效备份中恢复部署,并将其部署到一个新的实例上。

为了确保最佳的恢复状态,强烈建议在执行 IPU 之前创建一份新的备份,并在 IPU 完成后立即再创建一份备份。

  • 在执行 IPU 之前进行备份,有助于保护数据完整性,并在升级失败时为您提供恢复数据库最新状态的来源。
  • 在IPU之后立即进行备份,将为新的 PostgreSQL 主要版本时间线创建第一个还原点。
  • 如果在 IPU 成功完成后等待下一次计划备份,那么在新版本方面,PITR 和还原操作将无法使用,直到该备份完成为止。 您仍然可以识别出在尝试使用 IPU 之前生成的 PITR 时间戳。 这样,您就可以将IPU实施前最后一次可用的备份与PITR结合使用,将IPU实施前的 PostgreSQL 版本恢复到新的部署环境中。 当您使用 “备份和还原升级”功能时,同样需要进行此类规划。 如需了解更多信息,请参阅“特定时间点恢复(PITR)”。

亲自执行这两次备份,而不是等待自动备份计划,这样可以在升级前后获得更可预测的恢复点。

准备工作

在开始升级程序之前,请考虑以下方面。

  • 请通过 UI、API、CLI 或 Terraform 查看部署功能信息,以确认您的部署版本是否支持版本升级。

    示例:使用命令行界面(CLI)查询版本升级信息:

    ibmcloud cdb capability-show versions postgresql
    
  • 在触发 IPU 之前,请务必查阅本主题中与预检查相关的要求。 IPU 直接在源部署上运行,不会创建新的实例。 为了保障客户的安全,该服务会在升级开始前进行预检查,若检测到风险,将阻止该操作。 请特别核对以下项目:

    • 您的部署最多包含 3 个成员。
    • 您的部署处于正常状态。
    • 您的部署环境至少有 10% 的可用磁盘空间。 IPU 预检查的默认最大允许磁盘使用率为 90%。
    • 您的部署未面临巨大的I/O压力。 IPU 预检查的默认最大允许 I/O 利用率为 90%。
    • 您的模式大小和对象数量均在默认预检查阈值范围内。 默认情况下,单个模式的大小不得超过 100 GB,且索引和序列的总数必须少于 50,000 个。
    • 您已在升级前完成了所有必要的扩展和逻辑复制槽清理工作。
  • 每个主要版本都包含一些可能与旧版本不向后兼容的功能。 请查阅数据库供应商的 发布说明,了解可能影响您应用程序的任何变更。

  • 不支持将部署降级到先前版本。

  • 就地主版本升级一旦开始,便无法取消。

  • 如果您没有最新的备份,请考虑在升级前进行备份。

支持的原地升级路径
来源:PostgreSQL 版本 支持的原地升级目标
14 15、18
所有其他受支持的源代码版本 18

此外,请注意,升级完成后,您的数据库将运行 PostgreSQL 的新主版本。 由于 PostgreSQL 将数据存储在特定版本的格式中,因此升级前的备份和PITR还原点属于较早版本的时间线,无法还原到已升级的版本中。 为确保新版本具备完整的还原和 PITR(特定时间点恢复)功能,请在升级完成后立即执行一次新的备份。 该备份将成为新版本时间轴上未来恢复操作的基础。

如果 IPU 操作失败,仍可使用升级前的有效备份配合 PITR 功能,将较早版本的 PostgreSQL 恢复到新实例中。

在 UI 中升级

  1. 创建一个新的 Databases for PostgreSQL 来测试升级过程。
    通过 还原备份,基于您现有且版本相同的部署创建新部署。

  2. 将您的预发布应用程序指向测试部署环境。
    更新您的预发布应用程序,使其指向测试部署环境。 请确认您的测试应用程序能够成功连接到预发布环境部署,且应用程序运行符合预期。 完成对预发布环境的所有必要性能和运行测试。

  3. 请点击 “概览”页面上的 “升级主版本”按钮,以升级您的测试部署的主版本。
    请记录升级完成所需的时间,以便您利用升级有效期设置,将升级操作控制在维护窗口内。

  4. 请确认您的预发布应用程序可在新数据库版本上正常运行。
    如果您的应用程序能够正常运行,则此步骤可确认升级生产环境数据库是安全的。

  5. 将您的生产数据库部署升级到新版本。
    在使用新版数据库确认应用程序运行正常后,您可以返回管理控制台,开始升级生产环境的部署。 在概述页面的部署详情部分,点击 “升级主版本”按钮并按照步骤操作。

    就地升级过程一旦开始,便无法停止或回滚。 因此,在极少数错误发生的情况下,您的数据库部署可能会变得无法恢复。 因此,请创建一个备份,以便后续可用于恢复至新的部署环境。

该选项 expiration for starting upgrade 允许您配置一个“超时”期限,升级任务必须在此期限内启动,否则将被自动取消。 此外,请在预发布环境中提前测试升级操作,以确保升级能在预期的时间窗口内完成。 例如,如果您希望在 1 小时内完成升级,并且您已测试过升级过程并确认需要 30 分钟,那么您的升级任务必须在您确认要进行升级后的 30 分钟内启动。 因此,请将超时设置为30分钟,这样如果操作未能在此时间内启动,就不会超出您的时间窗口。

通过 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"}'

该选项 expiration for starting upgrade 允许您配置一个“超时”期限,升级任务必须在此期限内启动,否则将被自动取消。 此外,请在预发布环境中提前测试升级操作,以确保升级能在预期的时间窗口内完成。 例如,如果您希望在 1 小时内完成升级,并且您已测试过升级过程并确认需要 30 分钟,那么您的升级任务必须在您确认要进行升级后的 30 分钟内启动。 因此,请将过期时间设置为当前时间起30分钟后,这样如果在此期间内未启动,就不会超出您的时间窗口。 过期时间必须在5分钟(默认值)至24小时之间。 有关更多信息,请参阅 API Cloud Databases

通过 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

该选项 expiration for starting upgrade 允许您配置一个“超时”期限,升级任务必须在此期限内启动,否则将被自动取消。 此外,请在预发布环境中提前测试升级操作,以确保升级能在预期的时间窗口内完成。 例如,如果您希望在 1 小时内完成升级,并且您已测试过升级过程并确认需要 30 分钟,那么您的升级任务必须在您确认要进行升级后的 30 分钟内启动。 因此,请将超时设置为30分钟,这样如果操作未能在此时间内启动,就不会超出您的时间窗口。 有效期必须在5分钟(默认)至24小时之间。 通过命令行界面(CLI)设置过期时间 --expire-in``--expire-at 有两种方式: 如需了解更多信息,请参阅该命令的帮助文档。

通过Terraform进行升级

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

要升级,只需在配置中添加或修改 version 该值即可。

在版本升级前跳过备份是危险的,如果升级在任何阶段失败,可能会导致数据丢失:届时将没有可立即用于恢复的备份。 因此,在开始就地进行主要版本升级任务之前,请考虑先创建一份新的备份。

升级可能需要的时间会超过默认超时时间。 可通过设置timeouts属性来延长超时值。

Terraform 使用超时机制而非过期时间戳。 因此,请延长超时时间,因为超时更新值会被用作过期时间。 例如,若设置20分钟超时,则过期时间将设为20分钟。若在此时间段内升级未启动,则升级任务将过期且不会启动。 请注意,最长有效期为 24 小时,因此即使您将超时时间设置为 36 小时,如果升级在前 24 小时内未开始,该升级仍会过期。

如果正在进行版本升级,请注意,某些任务可能会被放入队列,并将在版本升级完成后才会继续执行。

故障诊断

若应用程序在成功就地升级主版本后出现意外问题,且您需要回退至先前 PostgreSQL 版本,请联系我们的支持团队获取指导。 请勿自行启动 PITR 或恢复备份,否则可能会使恢复工作变得复杂。

就地重大升级将在所有预检通过后才会执行。 设置这些安全措施是为了保护您的部署,因为升级操作会直接作用于源实例。 如果升级被阻止,请检查以下方面:

  • 成员数量:就地主版本升级支持最多包含 3 个成员的部署。 如果您的部署包含超过 3 个成员,则预检查会阻止升级。 无法通过 水平扩展 移除成员,因此请向 IBM Cloud 支持团队 提交支持工单,以减少成员数量,然后重试升级。
  • 集群状态:确保 Patroni 集群运行正常,并且存在明确的领导者/副本状态。 若Patroni报告系统不稳定或故障转移状态,则无法进行升级操作。
  • 磁盘空间:请确认是否有足够的可用空间。 该过程采用 pg_upgrade 链接模式,需要足够的余量。 若磁盘使用率超过配置的限制(默认:90%),请在重试前释放空间。
  • 磁盘 I/O 负载:检查当前的 I/O 使用率和 IOPS。 当系统处于高负载状态时,升级操作将暂停,以防止性能下降或升级失败。
  • 模式大小与对象数量:如前所述,模式大小直接影响就地主版本升级的持续时间。 确保任何单个模式都不超过最大大小(默认值:100 GB),且索引和序列对象的总数保持在限制范围内(默认值:50,000)。 大型架构或异常高的对象数量可能需要在升级前进行清理或优化。 pg_upgrade 通过创建新的系统表并直接复用旧的用户数据文件,实现快速升级。 创建这些系统表所需的时间与数据库对象的数量成正比。 资源消耗可通过 监控集成 进行评估。 如果并非所有数据库组件都可供升级,则升级任务将失败。 这可能是由于维护造成的。 因健康检查失败而失败的任务可稍后重试。 如果任务持续失败,请向 IBM Cloud 支持团队 提交支持工单。 如果某些检查与您的环境无关,但升级仍被阻止,请创建支持工单以获取进一步协助。

从只读副本升级

通过 配置只读副本 进行升级。 使用与部署相同的数据库版本供应只读副本,并在复制所有数据时等待。 当您的部署及其副本已同步时,请将只读副本提升并升级到运行新版本数据库的完整独立部署。 要执行升级和提升步骤,请在请求主体中使用要升级到的版本的对 /deployments/{id}/remotes/promotion 端点的 POST 请求。

此请求类似于:

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
    }
}' \

升级的备份与还原

您可以通过将数据的备份 复原 到正在运行新数据库版本的新部署来升级数据库版本。

在 UI 中升级

从 _部署仪表板_的 备份 菜单 复原备份 时升级到新版本。 单击备份上的 Restore 进入新选项卡上的调配页面,在此可更改新部署的某些选项。 其中一个选项是数据库版本,将自动填充可供您升级到的版本。 选择一个版本,然后单击 Create 启动供应和还原过程。

通过 CLI 进行升级

要通过 IBM Cloud CLI 从备份升级和复原,请使用资源控制器中的供应命令。

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

参数 service-nameservice-idservice-plan-idregionservice-endpoints 均为必填项。 您还需要将版本和备份 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
}'--service-endpoints "public"

通过 API 进行升级

Complete the necessary steps to use the 资源控制器 API before you use it to upgrade from a backup. 然后,向 API 发送 POST 请求。 参数 nametargetresource_groupresource_plan_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。

在报废日期前进行升级,以避免以下风险:

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

有关报废日期,请参阅 版本政策页面

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

从 PostgreSQL 16开始,角色权限的强制执行更加严格。 这是一项上游的 PostgreSQL 架构变更,并非 {{site.data.keyword.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 用户执行。
  • 可以安全地多次运行(idempotent)。

样本用法:

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

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

主要 PostgreSQL 版本的更改日志