本章节介绍了一键升级RDS PostgreSQL至PolarDB PostgreSQL版的方案简介、升级方式及其优势、升级前提条件、使用限制、收费规则等。
升级方案概述
PolarDB支持将RDS PostgreSQL一键升级至PolarDB PostgreSQL版,升级后的PolarDB集群包含源RDS实例的账号信息、数据库、IP白名单。
您可以将RDS PostgreSQL迁移至相同或不同版本的PolarDB PostgreSQL版。如RDS PostgreSQL 11一键升级至PolarDB PostgreSQL版 14。
RDS PostgreSQL一键升级至PolarDB PostgreSQL版通过逻辑迁移(DTS数据同步)方式实现。
逻辑迁移(DTS数据同步)
通过数据传输服务DTS,创建数据同步任务,将源RDS PostgreSQL实例的库表结构和全量数据同步至创建的PolarDB PostgreSQL版集群中,然后保持增量数据同步。
升级方案优势
一键升级功能具有如下优势:
可保留数据库原连接地址,无需应用程序修改任何连接配置即可切换至PolarDB。
迁移完全免费,仅收取目标PolarDB集群的费用。
迁移过程数据0丢失。
支持增量迁移,停机时间小于10分钟。
支持在线热迁移,迁移过程仅闪断一次(即当业务从RDS切换至PolarDB时)。
支持回滚,迁移失败可以在10分钟内恢复。
前提条件
一键升级仅支持源RDS PostgreSQL小于或等于目标PolarDB集群版本。
如果源RDS创建了触发器,请先删除RDS的触发器,再继续迁移,或者手动去DTS控制台页面创建迁移任务。具体可参见RDS PostgreSQL同步至PolarDB PostgreSQL版。
如果源RDS的连接地址开启了SSL或TDE,则不允许一键升级到PolarDB。
若您的源RDS实例有其他不符合一键升级条件的问题,将会展示在PolarDB一键升级的售卖页面上。示例如下:
RDS PostgreSQL实例不可以为空库。
RDS PostgreSQL实例中不允许有账号名为PolarDB PostgreSQL版不支持的格式。
必须存在名为AliyunServiceRoleForPolarDB的服务关联角色。
max_replication_slots
参数必须大于数据库数量,即需要搭建的DTS双向链路数量。max_wal_senders
参数必须大于数据库数量,即需要搭建的DTS双向链路数量。数据库数量必须小于等于30,即最多创建30条DTS双向同步链路。
内核参数
wal_level
必须为logical。
使用限制
仅支持将RDS PostgreSQL一键升级至相同版本或更高版本的PolarDB PostgreSQL版,不支持降版本升级。例如,不支持从RDS PostgreSQL 14版本一键升级至PolarDB PostgreSQL 11版本。
一键迁移任务将在目标PolarDB集群自动创建一个格式为
dts_clone%
的迁移账号,密码随机生成。迁移期间,请勿修改账号密码或删除账号,否则将导致DTS同步失败。完成迁移后您可以按需修改账号密码或者删除账号。一键升级的使用限制如下:
暂不支持跨地域迁移。
迁移期间不允许对源RDS实例执行参数设置的操作。
对源库有如下限制:
类型
说明
源库限制
待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置
wal_level
参数的值为logical
。如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。
若源库有长事务,且实例包含增量同步任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
SQL语句限制:
操作类型
SQL语句
DML
INSERT、UPDATE、DELETE
DDL
同步任务支持如下DDL,且源数据库账号需为高权限账号,RDS PostgreSQL的内核小版本需大于或等于20210228,小版本的升级方式,请参见升级内核小版本。
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(源库PostgreSQL为PostgreSQL 11及以上版本)
CREATE INDEX ON TABLE
重要不支持同步DDL中包含的附加信息,如CASCADE或RESTRICT等。
不支持同步使用
SET session_replication_role = replica
命令的会话中的DDL。若源库单次提交的多条SQL中同时包含DML和DDL,则该DDL不会被同步。
若源库单次提交的多条SQL中包含非同步对象的DDL,则该DDL不会被同步。
其他限制:
类型
说明
其他限制
单个数据同步任务只能同步一个数据库,如需同步多个数据库,一键迁移会为每个数据库配置数据同步任务。
同步期间,如果同步对象的选择粒度为Schema,在待同步的Schema中创建了新的表或使用
RENAME
命令重建了待同步的表,您需要在对该表写入数据前执行ALTER TABLE schema.table REPLICA IDENTITY FULL;
命令,以保障该表数据同步的一致性。执行该命令期间,建议您不要有锁表操作,否则会导致表锁死。说明实际操作时,请将上述命令中的schema和table替换成真实的Schema名和表名。
建议您在业务低峰期进行操作。
DTS会在源库中创建以下临时表,用于获取增量数据的DDL、增量表的结构、心跳信息等。在同步期间,请勿删除源库中的临时表,否则会导致DTS任务异常。临时表会在DTS实例释放后自动删除。
public.dts_pg_class
、public.dts_pg_attribute
、public.dts_pg_type
、public.dts_pg_enum
、public.dts_postgres_heartbeat
、public.dts_ddl_command
、public.dts_args_session
为保障同步延迟时间展示的准确性,DTS会在源库中新增一个名为
dts_postgres_heartbeat
的心跳表。同步期间,DTS会在源库中创建前缀为
dts_sync_
的replication slot用于复制数据。DTS会每隔120分钟自动清理一次历史replication slot,避免其持续累积占用磁盘空间。说明DTS释放实例后会主动删除该replication slot,如果您在同步期间修改了数据库密码,或者删除了DTS的访问IP白名单,则会导致该replication slot无法自动删除,此时需要您在源库中手动删除,避免其持续累积占用磁盘空间导致RDS PostgreSQL实例不可用。
当释放同步任务或同步失败时,DTS会主动清理该replication slot;如果PostgreSQL发生了主备切换,则需要您登录备库来手动清理。
执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。
全量初始化会并发执行
INSERT
操作,导致目标数据库的表产生碎片,因此全量初始化完成后目标实例的表空间比源实例的表空间大。对于表级别的数据同步,如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见通过无锁变更工单实现无锁结构变更。
在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。
DTS的校验对象为数据内容,暂不支持Sequence等元数据的校验,您需要自行校验。
由于业务切换到目标端后,新写入的Sequence不会按照源库的Sequence最大值作为初始值去递增,您需要在业务切换前,在源库中查询对应Sequence的最大值,然后在目标库中将其作为对应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控制台,在基本信息页面的RDS迁移功能区域查看同步任务的剩余时间。 |
增量数据同步 |
带地址切换
一键升级RDS至PolarDB时支持带地址切换,系统会自动交换RDS和PolarDB上的连接地址,您无需在应用程序端修改任何配置即可自动连接到PolarDB。选择该切换方式后,RDS连接地址对应的PolarDB连接地址如下图所示。
使用带地址切换功能时,需注意以下几点:
带地址切换只会切换RDS和PolarDB的域名,Vswitch、Vip等配置不会切换。
仅当源RDS和目标PolarDB集群同时存在的连接地址才支持相互切换,默认情况下仅私网主地址支持带地址切换。
带地址切换时,RDS和PolarDB的主地址一定会切换,RDS的独享代理地址及只读地址可以和PolarDB的默认集群地址及自定义地址切换,可以选择不切换或切换多组。由于PolarDB最多可以创建7个集群地址,因此最多只支持7组RDS独享代理地址及只读地址的切换。
如需切换其他连接地址,您需在切换前创建好对应的连接地址,否则不会切换。关于如何为PolarDB集群和RDS实例创建连接地址,请参见管理连接地址和设置连接地址。
带地址切换不会切换端口,一键升级时创建的PolarDB集群,除自定义地址端口外,其他端口均与RDS对应地址的端口一致,如需修改端口,请参见查看和管理实例连接地址和端口。
切换域名后,可能会存在DNS解析缓存问题,在缓存过期时间内可能会出现连接不上数据库或数据库只支持读操作无法执行写入操作等情况,建议您刷新一下服务器的DNS缓存。
切换域名后,如果您需要使用DMS登录PolarDB数据库,必须使用新版本的DMS并且使用集群ID来进行登录,连接串无法登录。