RDS PostgreSQL大版本升级

更新时间: 2025-05-21 10:11:43

随着PostgreSQL社区对低版本(如9.4、10)实例的停止维护,继续使用低版本实例将存在风险,如果您需要将低版本的RDS PostgreSQL实例升级到更高版本,或者希望使用高版本的新特性,建议您进行大版本升级操作。

方案简介

PostgreSQL社区定期发布大版本,带来功能和性能提升。较低版本将逐渐不再受支持,存在性能和安全风险。为了让您享受新版本的提升,同时降低升级风险,RDS PostgreSQL支持大版本升级功能。

RDS PostgreSQL的大版本升级功能提供蓝绿部署(割接/不割接)、本地升级零停机等升级模式。同时,支持使用DTS通过迁移实例的方式进行升级,各个升级方案的对比如下:

升级方案

蓝绿部署(割接)

蓝绿部署(不割接)

本地升级

零停机

使用DTS迁移实例

实现原理

通过云盘技术,恢复一个新实例,并使用pg_upgrade将其升级至目标版本。同时,支持自动切换原连接地址到新实例。

通过云盘技术,恢复一个新实例,并使用pg_upgrade将其升级至目标版本。

后台创建一个新实例(虚拟实例),并使用pg_upgrade将其升级到目标版本。同时,将原实例的所有元信息完整刷新到新实例中。

后台创建一个新实例(虚拟实例),并使用pg_upgrade将其升级到目标版本。同时,通过PostgreSQL的原生逻辑复制进行增量更新。

手动创建新实例,并使用异步逻辑复制进行数据迁移。

方案优点

  • 可基于原实例进行回滚。

  • 提供验证后自动切换连接地址的能力。

提供独立的测试环境进行升级后验证。

  • 原实例配置和账单信息完全保留。

  • 升级过程中,系统会自动提升实例规格,助力升级,升级完成会回退到原规格。

  • 用pg_upgrade升级实例时,无需停机。

  • 逻辑复制进行增量更新时,使用同一个升级任务。

  • 升级过程中,系统会自动提升实例规格,助力升级,升级完成会回退到原规格。

  • 产品级解决方案。

  • 具备数据校验能力。

方案缺点

升级期间原实例将会被设置为只读,数据库对象数越多,只读时间越长。

不切换连接地址,需要业务侧自行配套。

  • 升级期间原实例将会被设置为只读,数据库对象数越多,只读时间越长。

  • 不支持基于旧实例的回滚,支持基于备份进行恢复回滚。

  • 缺乏数据校验能力和反向数据链路。

  • 逻辑复制存在多项限制,例如表必须包含主键。

  • sequence对象的数量影响切换所需的时间。

  • 一个数据库一个迁移任务。

  • 无产品化切换连接地址的方案。

适用场景

可以接受升级期间实例只读,并且期望保留原实例。

  • 测试验证。

  • 应用双跑。

可以接受升级期间实例只读,并且期望升级后的实例与原实例一致。

业务不接受长时间停机。

  • 业务不接受长时间停机。

  • 实例中数据库数量不多。

费用

新建实例按量付费。

新建实例按量付费。

无升级费用。

无升级费用。

  • 新建RDS实例的费用。

  • DTS实例费用。

功能特点

  • 支持跨版本升级:例如从PostgreSQL 10.0升级到PostgreSQL 13.0。

  • 支持升级演练:通过蓝绿部署(不割接)的方式验证升级流程,不影响原实例。

  • 支持平滑升级

    • 无需修改应用:通过蓝绿部署(割接)、本地升级零停机方式升级,无需修改应用中已配置的数据库连接地址。其中蓝绿部署(割接)结束后,系统将会自动交换原实例与新实例的连接地址,而本地升级零停机将保持原实例的连接地址不变。

    • 无需停机零停机方式升级时原实例无需停机,该方案可降低业务中断带来的风险。

    • 保留实例设置

      • 升级后保留原实例的白名单、参数设置、插件(新版本不支持的插件和参数除外)。

      • 加密实例升级大版本后仍为加密实例,加密Key保持不变。

  • 支持通过备份克隆低版本实例及数据:选择本地升级时,会在升级前后进行常规备份。如果需要获得低版本实例及数据,可以使用最新的低版本备份集克隆实例。

升级费用

  • 本地升级零停机不会造成费用的变化,也不会产生订单。

  • 蓝绿部署

    • 升级后生成的新实例的计费方式可能会发生变化。因此在升级前,请确保账户余额大于等于100元。

      原实例计费方式

      新实例计费方式

      包年包月/按量付费

      按量付费

      Serverless

      Serverless

    • 升级完成后,原实例和新实例将同时产生费用。在确保业务在新实例中稳定运行后,您可以将新实例转成包年包月,将原实例释放或退订,但需要注意以下情况:

      • 如果您的原实例计费方式为包年包月且尚未到期,新实例无法继承原实例包月剩余时长,释放原实例可能存在费用损失。具体退订规则请参见退款说明

      • 如果您的原实例购买时使用了优惠,升级后新实例将不会继承此优惠,请进入实例退订页面查看具体退款金额后,再评估是否升级。

      • 包年包月退款金额退款时间以实际退订账单为准,非实时到账。

使用限制

  • 实例版本:PostgreSQL 16或以下版本

    说明

    支持跨版本升级。PostgreSQL 9.4最高仅支持直接升级到PostgreSQL 14,如果您需要升级到PostgreSQL 15或以上版本,则请先升级到PostgreSQL 10、11、12、13或14,然后再升级到PostgreSQL 15或以上版本。

  • 实例不是只读实例专属集群实例

  • 实例ID不是以pg-cn开头。

  • 实例未启用Babelfish,即小版本号后缀不带babelfish

  • 如果原实例中创建了只读实例,则无法选择蓝绿部署(割接)升级。如果需要进行蓝绿部署(割接)升级,请参见具有只读实例的主实例如何升级大版本

  • 存储类型本地SSD盘的实例仅支持采用蓝绿部署模式进行大版本升级。在实例的基本信息页面,可以查看实例的存储类型

升级影响

  • 业务影响

    通过蓝绿部署(割接)本地升级进行升级时,在割接过程中,原实例将会被设置为只读,并会造成分钟级业务闪断,请在业务低峰期进行升级。如果选择不割接方式进行升级,则不受影响。

    • 原实例被设置只读时间的长短与数据库对象数量相关,实例数据库对象数越多,只读时间越长,当数据库对象数达到百万级别时,只读时间可能达到十分钟级甚至小时级。您可以使用SELECT count(1) FROM pg_class;命令查看数据库的对象数。

    • 客户端感知的闪断时长取决于DNS缓存刷新时间。您可以尝试切换虚拟交换机,通过业务闪断时长来评估客户端的DNS缓存刷新时间。

    • 升级过程的时间长短与实例的数据库对象数量相关,数据库对象数越多,升级时间越长。大版本升级时您可以在任务中心查看任务进度,具体请参见任务管理

    • 对于蓝绿部署,在割接后,如果不希望原实例被设置为只读,请在升级后将参数rds_force_trans_ro_non_sup设置为off,详情请参见设置实例参数

  • 参数

    如果原实例使用了新版本不支持的参数,在新版本中该参数会被自动删除,如果低版本的参数取值不在高版本对应参数取值的合法区间,在新版本中该参数会被置为高版本参数模板的默认值。

  • 只读实例

    • 对于蓝绿部署,自建的只读节点和复制槽在升级后仍然保留在原实例下,不会自动转移到高版本实例,需要在升级后进行重建。

    • 对于本地升级,自建只读节点的主备关系以及复制槽在升级后会丢失,请根据实际情况谨慎选择升级模式。

    • 当待升级的实例中创建了只读实例时,则无法直接进行升级,需要在升级前后进行以下操作:

      具有只读实例的主实例如何升级大版本

      1. 将应用程序中配置的只读实例连接地址修改为主实例连接地址。

        说明

        为保证业务稳定,建议在业务低峰期修改应用连接地址。

      2. 删除只读实例。

      3. 升级大版本

      4. 升级完成后,在高版本实例上重新创建PostgreSQL只读实例

      5. 在应用程序中,将升级前修改的实例连接地址修改为新的只读实例连接地址。

  • DTS任务

    如果待升级的实例作为数据传输服务(DTS)的源实例或目标实例,则升级后需要重建DTS任务。创建DTS任务详见DTS产品文档

  • 数据不同步问题

    当待升级的实例中存在Replication Slots的订阅端,升级可能出现复制槽抢占导致的数据不同步问题。需要执行如下操作防止出现数据不同步的情况。对于本地升级,建议升级前关闭源实例的订阅。

    如何避免在升级过程中出现复制槽抢占导致的数据不同步问题

    • 如果您需要将订阅数据保留在源端(低版本实例),那么在升级的过程中,确保源端不会因负载过大而导致宕机。否则,可能导致复制槽被目标端(高版本实例)抢占,从而出现数据不一致的情况。

      升级完成后,请使用以下SQL语句在目标端的数据库关闭订阅。

      \c your_database
      ALTER SUBSCRIPTION your_subscription_name DISABLE;
    • 如果您需要将订阅数据保存在目标端,请在升级前关闭源端的订阅,再进行大版本升级,升级完成后,请打开目标端的订阅。SQL示例如下:

      • 在源端关闭订阅。

        \c your_database
        ALTER SUBSCRIPTION your_subscription_name DISABLE;
      • 在目标端开启订阅。

        \c your_database
        ALTER SUBSCRIPTION your_subscription_name ENABLE;
    说明
  • 对于蓝绿部署(割接),升级后新实例的虚拟IP(Virtual IP Address)与原实例不同,如果您在应用程序中配置了虚拟IP,则需要修改应用,因此,建议您在应用程序中配置实例连接地址,如何获取实例连接地址,请参见查看或修改连接地址和端口。对于本地升级和零停机,不会修改虚拟IP(Virtual IP Address)。

  • 升级大版本将会使用最新的内核小版本,可能遇到插件兼容性问题,具体请参见升级内核小版本

  • 升级后暂不支持进行大版本降级操作,如需降级,请购买低版本实例后,使用DTS迁移,将实例迁移至低版本中。

  • 对于蓝绿部署,新实例不继承原实例的实例名称标签云监控报警规则以及备份数据

  • 升级过程中,系统会暂时将statement_timeout的值修改为0,并在升级完成后恢复为原值。

  • 对于本地升级和零停机,在升级前,系统将对低版本实例进行备份;在升级完成后,系统将对高版本实例进行备份,以便于后续的克隆恢复。

升级步骤

在了解了升级方案使用限制及其影响,并选定了合适的升级方式后,请参见升级大版本操作步骤进行升级。

上一篇: 升级版本 下一篇: 升级大版本操作步骤
阿里云首页 云数据库 RDS 相关技术圈
OSZAR »