升级到新主版本
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>');
就地进行主要版本升级
就地主要版本升级(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/ 》,了解可能影响您应用程序的兼容性变更。
-
不支持降级到较早的版本。
-
就地升级一旦开始,就无法取消。
-
升级前,请确保有最新的备份。
| 来源:PostgreSQL 版本 | 支持的原地升级目标 |
|---|---|
| 18 | 未来的主要版本(如有) |
Gen2 从 PostgreSQL 18开始。 随着对新版本的支持陆续推出,相应的升级路径也将陆续添加。 关于早期版本(14–17),请参阅 /docs/databases-for-postgresql?topic=databases-for-postgresql-upgrading。
升级完成后,您的部署将运行 PostgreSQL 的新主版本。 升级前的备份和PITR还原点属于较早版本的时间线,无法还原到已升级的版本中。
为了在新版本中保持还原和PITR功能,请在升级完成后立即进行备份。 此备份将成为未来恢复操作的基准。
如果升级失败,仍可利用升级前的备份通过 PITR 将早期版本恢复到新的部署环境中。
在用户界面中进行升级
-
通过从现有部署中还原同一版本的备份,创建一个测试部署。
-
更新您的预发布应用程序,使其使用测试部署,并验证其功能。
-
在 “概览”页面上,点击 “升级主版本”以开始升级。
-
在升级后的测试部署环境中验证应用程序的行为。
-
验证完成后,请升级您的生产环境部署。
升级开始后,无法停止或回滚。 请确保有最新的备份可用。
“升级开始时限”指升级任务必须在该时间之前开始,否则将被自动取消。 请根据您的维护窗口设置此值。 例如,如果升级需要 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-name、service-id、service-plan-id 和 region 均为必填项。 您还需要将版本和备份 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 请求。 参数 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 版。
请在产品生命周期结束日期之前进行升级,以避免以下风险:
- 此类强制升级不提供任何服务水平协议(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');
此函数将指定的角色(role1、role2、role3 )授予具有 ADMIN OPTION 权限的 admin 用户,从而允许 admin 用户在已升级的实例中管理(授予、撤销、修改或删除)这些角色。
PostgreSQL 主要版本的更新日志
有关 PostgreSQL 早期版本(14-17)的信息,请参阅 Gen1 的变更日志。