方案概述

更新时间:
复制为 MD 格式

PolarDB PostgreSQL支持不同内核版本之间以及不同产品系列之间的大版本升级,整个过程中将自动为您创建目标版本的PolarDB集群,并从源集群同步数据。升级后的PolarDB PostgreSQL集群包含源PolarDB PostgreSQL集群的账号信息、数据库信息、IP白名单和必要的参数。

  • 内核版本升级,例如:

    • PolarDB PostgreSQL11升级至PolarDB PostgreSQL14、15、1617。

    • PolarDB PostgreSQL14升级至PolarDB PostgreSQL15、1617。

  • 产品系列升级:

    • 标准版升级至企业版

具体的升级操作请参见升级步骤

迁移方式

大版本升级采用逻辑迁移(DTS数据同步)的方式进行迁移,通过数据传输服务DTS,创建数据同步任务,将源PolarDB PostgreSQL的库表结构和全量数据同步至创建的PolarDB PostgreSQL集群中,然后保持增量数据同步。

方案优势

  • 可保留数据库原来的连接地址,无需修改应用程序的任何连接配置即可切换至目标版本。

  • 迁移完全免费,仅收取目标PolarDB集群的费用。

  • 迁移过程数据0丢失。

  • 支持增量迁移,停机时间小于10分钟。

  • 支持在线热升级,升级过程仅闪断一次(即当业务从源端切换至目标端时)。

  • 支持回滚操作,升级失败可以在10分钟内恢复。

适用范围

  • 如果源PolarDB PostgreSQL创建了触发器,请先删除触发器,再继续迁移。

  • 如果源PolarDB PostgreSQL开启了SSL链路加密设置透明数据加密TDE,则不支持大版本升级。

使用须知

为确保升级过程顺利,请您仔细阅读并遵循以下说明。

源集群影响

  • 性能开销:数据同步会增加源集群的读负载,建议在业务低峰期执行升级操作。

  • WAL日志要求

    • 源集群的wal_level参数值需为logical

    • 为确保数据同步任务的稳定,建议在全量同步阶段将WAL日志保留时间设置为7天以上,增量同步阶段设置为24小时以上。WAL日志保留时间不足可能导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。

    • 长时间未提交的事务(长事务)可能会导致WAL日志堆积,占用大量存储空间。请在升级前关注并处理源集群的长事务。

  • 临时对象创建

    • DTS会在源集群的public schema下创建若干临时表(如public.dts_pg_classpublic.dts_pg_attributepublic.dts_pg_typepublic.dts_pg_enumpublic.dts_postgres_heartbeatpublic.dts_ddl_commandpublic.dts_args_session等),用于同步数据和记录心跳信息。在同步期间,请勿删除源库中的临时表,否则会导致DTS任务异常。临时表会在DTS实例释放后自动删除。

    • DTS会在源集群创建名前缀为dts_sync_的复制槽(Replication Slot)。DTS会每隔120分钟自动清理一次历史复制槽,避免其持续累积占用磁盘空间。

      说明
      • DTS释放实例后会主动删除该复制槽,如果您在同步期间修改了数据库密码,或者删除了DTS的访问IP白名单,则会导致该复制槽无法自动删除,此时需要您在源库中手动删除,避免其持续累积占用磁盘空间导致源集群不可用。

      • 当释放同步任务或同步失败时,DTS会主动清理该复制槽。如果源集群发生了主备切换,则需要您登录备库来手动清理,以防WAL日志持续堆积。

    • 请勿手动删除这些临时表和复制槽,否则将导致升级任务失败。任务结束后,系统会自动清理这些对象。

使用限制

  • 升级期间的禁止操作

    • 禁止对源集群执行参数设置操作。

    • 禁止变更源集群的可用区或连接地址。

    • 大版本升级期间,系统将在目标PolarDB集群自动创建一个格式为dts_clone%的迁移账号,密码随机生成。升级期间,请勿修改账号密码或删除账号,否则将导致DTS同步失败。完成迁移后您可以按需修改账号密码或者删除账号。

    • 禁止通过DTS以外的任何方式向目标集群写入数据,否则将导致数据不一致。

      说明

      如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见通过无锁变更工单实现无锁结构变更

  • 功能与对象限制

    • 不支持跨地域升级。

    • 待同步的表需具有主键或唯一约束,否则可能导致数据重复。

    • DTS仅校验数据内容,不校验Sequence等数据库对象的元数据。

    • 暂不支持全球数据库网络(GDN)中的集群进行大版本升级。

    • 如果在待同步的Schema中创建了新的表或使用RENAME命令重建了待同步的表,您需要在对该表写入数据前执行ALTER TABLE schema.table REPLICA IDENTITY FULL;命令,以保障该表数据同步的一致性。执行该命令期间,建议您不要有锁表操作,否则会导致表锁死。建议您在业务低峰期进行操作。

  • DDL操作限制:仅支持同步部分DDL操作:

    操作类型

    SQL语句

    DML

    INSERTUPDATEDELETE

    DDL

    • CREATE TABLE、DROP TABLE

    • ALTER TABLE(包括RENAME TABLE、ADD COLUMN、ADD COLUMN DEFAULT、ALTER COLUMN TYPE、DROP COLUMN、ADD CONSTRAINT、ADD CONSTRAINT CHECK、ALTER COLUMN DROP DEFAULT)

    • TRUNCATE TABLE(源库PostgreSQLPostgreSQL 11及以上版本)

    • CREATE INDEX ON TABLE

    重要
    • 不支持同步DDL中包含的附加信息,如CASCADERESTRICT等。

    • 不支持同步使用SET session_replication_role = replica命令的会话中的DDL。

    • 若源库单次提交的多条SQL中同时包含DMLDDL,则该DDL不会被同步。

    • 若源库单次提交的多条SQL中包含非同步对象的DDL,则该DDL不会被同步。

升级后的检查与操作

  • 手动更新Sequence:DTS不会同步Sequence的当前值。您需要在业务切换前,在源集群执行以下查询,获取所有Sequence的更新命令,然后在业务切换后,在目标集群上执行这些命令,以避免主键冲突。

    DO LANGUAGE plpgsql $$
    DECLARE
      nsp NAME;
      rel NAME;
      val INT8;
    BEGIN
      FOR nsp, rel IN SELECT nspname, relname FROM pg_class t2, pg_namespace t3 WHERE t2.relnamespace = t3.oid AND t2.relkind = 'S' LOOP
        EXECUTE format($_$SELECT last_value FROM %I.%I$_$, nsp, rel) INTO val;
        RAISE NOTICE '%', format($_$SELECT setval('%I.%I'::regclass, %s);$_$, nsp, rel, val + 1);
      END LOOP;
    END;
    $$;
  • 目标集群空间:由于全量数据写入时会产生表碎片,升级后目标集群的表空间占用会比源集群更大,这属于正常现象。

收费规则

您除了需承担购买PolarDB集群的费用之外,还需承担DTS所创建的同步任务产生的费用。但现阶段该功能处于试用阶段,创建的同步任务30天内不收取任何费用。具体如下:

迁移对象

费用

库表结构同步和全量数据同步

创建同步任务后,30天内不收取任何费用。

超过30天后,将会取消创建的同步任务,因此也不会产生费用。

说明

您可以登录PolarDB控制台,在基本信息页面的PolarDB升级功能区域查看任务的剩余时间。

增量数据同步

带地址切换

PolarDB集群之间的升级支持带地址切换,系统会自动交换源集群和目标集群上的连接地址。连接地址对应关系图如下所示:

image

使用带地址切换功能时,需注意以下几点:

  • 带地址切换只会切换源集群和目标集群的域名,VswitchVip等配置不会切换。

  • 仅当源集群和目标集群同时存在连接地址才支持相互切换,默认情况下仅私网地址支持带地址切换。

    说明

    若源集群的连接地址申请了公网地址,则您需要在目标集群的相应连接地址上申请公网地址,以确保在地址切换功能中能够成功切换相关连接地址上的公网地址。

  • 选择带地址切换时,源集群和目标集群的主地址一定会切换,可以选择不切换或切换多组。

  • 如需切换其他连接地址,您需在切换前创建好对应的连接地址,否则不会切换。关于如何为PolarDB集群创建连接地址,请参见。

  • 带地址切换不会切换端口,请确保源集群和目标集群的连接端口一致(PolarDB默认使用的端口号为5432)。

  • 切换域名后,可能会存在DNS解析缓存问题,在缓存过期时间内可能会出现连接不上数据库或数据库只支持读操作而无法执行写入操作等情况,建议您刷新一下服务器的DNS缓存。

常见问题

升级前是否需要先购买PolarDB PostgreSQL集群?

不需要。升级过程中会购买并创建一个与源集群数据相同的PolarDB集群。

大版本升级会影响源集群吗?

不会影响源集群的正常运行。仅有部分性能、参数需要修改以及操作限制,详见源集群影响

大版本升级会对源集群性能有影响吗?

迁移不会影响源集群上的使用操作,但数据迁移涉及查询操作,会消耗源集群一部分的查询性能。

大版本升级会对业务有影响吗?

大版本升级能够保证迁移过程不丢失数据,停机(即暂停业务,不产生增量数据,而非停用数据库)时间小于10分钟,如果有需要还可以进行回滚。

大版本升级是否支持跨版本升级?如将PostgreSQL 11升级至PostgreSQL 16版本?

支持跨版本升级。

若在大版本升级至目标集群前,源集群已开启了DTS数据同步任务,升级时是否会影响该任务?

不会。通过大版本升级时,会先从源集群复制一份全量数据至一个新的PolarDB集群,然后将增量数据保持同步至该PolarDB集群。源集群上DTS数据同步任务的数据源仍然是源集群,数据迁移至目标集群并不会影响源集群上的运行和操作。

但迁移完成后,如果您将业务切换到新的PolarDB,且源集群停止使用了,DTS的数据源是不会自动改到新PolarDB集群的,此时,您需要重新创建DTS同步任务,将数据源改为PolarDB集群。