升级到新主版本
截至 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_repackold_snapshotwal2jsonanonPostGIS
复制槽
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 实用程序严格禁止在存在复制槽的情况下进行主版本升级,并将抛出一个严重错误并中止升级。
升级前:
- 确保所有待处理的 WAL 数据均已被处理完毕。
- 停止使用该复制槽的应用程序。
- 删除复制槽:
SELECT pg_drop_replication_slot('your_slot_name');
升级完成后,您可以根据需要重新创建复制槽。 请注意,wal2json 并非通过 CREATE EXTENSION 安装,而是通过数据库参数(wal_level、max_replication_slots、max_wal_senders )和表权限进行配置的,这些配置不会阻碍升级。
anon
请在升级前卸载 anon 扩展,如果升级后仍需使用该扩展,请重新启用它。 在卸载 anon 之前,还需要执行一些额外步骤。
如果已安装 anon 扩展,请在执行升级之前完成以下步骤,并以管理员用户身份执行相关命令。
-
删除所有屏蔽规则(如果已启用)。
SELECT anon.remove_masks_for_all_columns(); -
禁用角色屏蔽(如果任何角色被标记为屏蔽,升级可能会失败)。
SECURITY LABEL FOR anon ON ROLE <role_name> IS NULL; -
使用级联选项删除
anon扩展名。DROP EXTENSION anon CASCADE; -
如果某个实例中的多个数据库都安装了
anon扩展,请针对每个数据库完成所述步骤。 -
升级完成后,请重新启用
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 中升级
-
创建一个新的 Databases for PostgreSQL 来测试升级过程。
通过 还原备份,基于您现有的同版本部署创建新的部署。 -
将您的预发布应用程序指向测试部署环境。
更新您的预发布应用程序,使其指向测试部署环境。 请确认您的测试应用程序能够成功连接到预发布环境,并且应用程序运行符合预期。 完成对预发布环境的所有必要性能和运行测试。 -
点击 “概览”页面上的 “升级主版本”按钮,即可升级测试部署的主版本。
请记录升级完成所需的时间,以便您利用升级有效期设置,将升级操作控制在维护窗口内。 -
请确认您的预发布应用程序可在新版数据库上正常运行。
如果您的应用程序运行正常,此步骤可确认升级生产环境数据库是安全的。 -
将您的生产数据库部署升级到新版本。
在确认应用程序使用新版数据库运行正常后,您可以返回管理控制台,开始升级生产环境的部署。 在 “概览”页面的 “部署详细信息”部分,单击 “升级主版本”按钮,然后按照步骤操作。就地升级过程一旦开始,就无法停止或回滚。 因此,万一发生错误(虽然这种情况不太可能),您的数据库部署可能会变得无法恢复。 因此,请创建一份备份,以便随后将其恢复到新的部署环境中。
通过 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 用户在已升级的实例中管理(授予、撤销、修改或删除)这些角色。