升级到新主版本
截至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_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,,请在升级 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 中升级
-
创建一个新的 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小时之间。 有关更多信息,请参阅 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-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 进行升级
Complete the necessary steps to use the 资源控制器 API before you use it to upgrade from a backup. 然后,向 API 发送 POST 请求。 参数 name,target,resource_group 和 resource_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');
此函数将指定的角色(role1、role2、role3 )授予具有 ADMIN OPTION 权限的 admin 用户,从而允许 admin 用户在已升级的实例中管理(授予、撤销、修改或删除)这些角色。