升级到新主版本

截至 2025 年 12 月,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_level、max_replication_slots、max_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>');

就地进行主要版本升级

就地主版本升级可让您将部署升级至受支持的目标 主版本,从而无需 将备份恢复 到新的部署中。 这种方法保留了相同的连接字符串,无需重新配置部署。 不过,如果新主版本需要对应用程序进行调整,则必须解决这些问题。

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

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小时之间。 如需了解更多信息,请参阅 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

通过 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 该端点,并在请求正文中指定您希望升级到的版本。

该请求如下所示:

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 中升级

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

通过 CLI 进行升级

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

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

参数 service-name、service-id、service-plan-id、region 和 service-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 进行升级

在使用“资源控制器 API”从备份进行升级之前,请先完成必要的准备步骤。 然后,向 API 发送一个 POST 请求。 参数 name、target、resource_group 和 resource_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版。

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

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

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

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

从 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 用户执行。
  • 可以安全地多次执行(幂等)。

样本用法:

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

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

主要 PostgreSQL 版本的更改日志