如果迁移的源数据库类型为PostgreSQL,如自建PostgreSQL、RDS PostgreSQL,您需要在配置具体的迁移任务前,参考本文的注意事项及限制,以保障数据迁移任务的正常运行。
源库为PostgreSQL的迁移方案概览
根据迁移方案,查看迁移任务的注意事项及限制:PostgreSQL间的迁移
- RDS PostgreSQL间的迁移
类型 说明 源库限制 - 待迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
待迁移的数据库名称中间不能包含短划线(-),例如dts-testdata。
- 如迁移对象为表级别,且需进行编辑(如表列名映射),则单次迁移任务仅支持迁移至多1000张表。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待迁移的表,分批配置多个任务,或者配置整库的迁移任务。
- 如需进行增量迁移,WAL日志:
- 需开启,即设置wal_level参数的值为logical。
如为增量迁移任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量迁移和增量迁移任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量迁移完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
- 源库的操作限制:
- 在库表结构迁移和全量迁移阶段,请勿执行库或表结构变更的DDL操作,否则数据迁移任务会失败。
- 如仅执行全量数据迁移,请勿向源库中写入新的数据,否则会导致源和目标数据不一致。为实时保持数据一致性,建议选择结构迁移、全量数据迁移和增量数据迁移。
- 若源库有长事务,且实例包含增量迁移任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
其他限制 - 为保障迁移任务的正常进行,避免主备切换导致的逻辑订阅中断,需要RDS PostgreSQL支持并开启Logical Replication Slot Failover,设置方式,请参见逻辑复制槽故障转移(Logical Replication Slot Failover)。
- 单个数据迁移任务只能迁移一个数据库,如需迁移多个数据库,您需要为每个数据库配置数据迁移任务。
- 增量数据迁移期间,如果迁移对象的选择粒度为Schema,在待迁移的Schema中创建了新的表或使用RENAME命令重建了待迁移的表,您需要在对该表写入数据前执行
ALTER TABLE schema.table REPLICA IDENTITY FULL;
命令。说明 将上述命令中的schema
和table
替换成真实的Schema名和表名。 - 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; $$;
- 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
。 - 若为全量迁移或增量迁移任务,且源数据库中要迁移的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量迁移时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量迁移或增量迁移过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS迁移任务释放后,您可以将session_replication_role的参数值改回origin。
- 为保障增量数据迁移延迟时间展示的准确性,DTS会在源库中新增一个名为
dts_postgres_heartbeat
的心跳表。 - 增量数据迁移期间,DTS会在源库中创建前缀为
dts_sync_
的replication slot用于复制数据。DTS会每隔90分钟自动清理一次历史replication slot,避免其持续累积占用磁盘空间。说明- DTS释放实例后会主动删除该replication slot,如果您在同步期间修改了数据库密码,或者删除了DTS的访问IP白名单,则会导致该replication slot无法自动删除,此时需要您在源库手动删除,避免其持续累积占用磁盘空间导致RDS PostgreSQL实例不可用。
- 当释放迁移任务或迁移失败时,DTS会主动清理该replication slot;如果RDS PostgreSQL发生了主备切换,则需要您登录备库来手动清理。
- 执行数据迁移前需评估源库和目标库的性能,同时建议业务低峰期执行数据迁移。否则全量数据迁移时DTS占用源和目标库一定读写资源,可能会导致数据库的负载上升。
- 由于全量数据迁移会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量迁移完成后目标库的表存储空间会比源库的表存储空间大。
- 请确认DTS对数据类型为FLOAT或DOUBLE的列的迁移精度是否符合业务预期。DTS会通过
ROUND(COLUMN,PRECISION)
来读取这两类列的值。如果没有明确定义其精度,DTS对FLOAT的迁移精度为38位,对DOUBLE的迁移精度为308位。 - DTS会尝试恢复七天之内迁移失败任务。因此业务切换至目标实例前,请务必结束或释放该任务,或者将DTS访问目标实例账号的写权限用
revoke
命令回收掉。避免该任务被自动恢复后,源端数据覆盖目标实例的数据。
特殊情况 当源实例为RDS PostgreSQL时,迁移期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致迁移失败。
- 待迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
- 自建PostgreSQL迁移至RDS PostgreSQL
类型 说明 源库限制 - 带宽要求:源库所属的服务器需具备足够出口带宽,否则将影响数据迁移速率。
- 待迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
待迁移的数据库名称中间不能包含短划线(-),例如dts-testdata。
- 如迁移对象为表级别,且需进行编辑(如表列名映射),则单次迁移任务仅支持迁移至多1000张表。当超出数量限制,任务提交后会显示请求报错,此时建议您拆分待迁移的表,分批配置多个任务,或者配置整库的迁移任务。
- DTS不支持迁移源库中的临时表、系统内部的触发器(TRIGGER)、部分函数(关于PROCEDURE与FUNCTION的C语言函数和内部函数);DTS支持迁移的自定参数TYPE为COMPOSITE、ENUM或RANGE,支持迁移的约束为主键、外键、唯一、CHECK约束。
- 如需进行增量迁移,WAL日志:
- 需开启,即设置wal_level参数的值为logical。
如为增量迁移任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量迁移和增量迁移任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量迁移完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
- 源库的操作限制:
- 如自建PostgreSQL进行主备切换,会导致迁移失败。
- 在库表结构迁移和全量迁移阶段,请勿执行库或表结构变更的DDL操作,否则数据迁移任务会失败。
- 若源库有长事务,且实例包含增量迁移任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
其他限制 - 由于源库的主备节点可能存在延迟导致数据不一致,执行数据迁移时请使用源库的主节点作为迁移的数据源。
- 单个数据迁移任务只能迁移一个数据库,如需迁移多个数据库,您需要为每个数据库配置数据迁移任务。
- 增量数据迁移期间,如果迁移对象的选择粒度为Schema,在待迁移的Schema中创建了新的表或使用RENAME命令重建了待迁移的表,您需要在对该表写入数据前执行
ALTER TABLE schema.table REPLICA IDENTITY FULL;
命令。说明 将上述命令中的schema
和table
替换成真实的Schema名和表名。 - 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; $$;
- 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会每隔90分钟自动清理一次历史replication slot,避免其持续累积占用磁盘空间。说明 当释放迁移任务或迁移失败时,DTS会主动清理该replication slot;如果RDS PostgreSQL发生了主备切换,则需要您登录备库来手动清理。 - 若为全量迁移或增量迁移任务,且源数据库中要迁移的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量迁移时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量迁移或增量迁移过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS迁移任务释放后,您可以将session_replication_role的参数值改回origin。
- 执行数据迁移前需评估源库和目标库的性能,同时建议业务低峰期执行数据迁移。否则全量数据迁移时DTS占用源和目标库一定读写资源,可能会导致数据库的负载上升。
- 由于全量数据迁移会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量迁移完成后目标库的表存储空间会比源库的表存储空间大。
- 请确认DTS对数据类型为FLOAT或DOUBLE的列的迁移精度是否符合业务预期。DTS会通过
ROUND(COLUMN,PRECISION)
来读取这两类列的值。如果没有明确定义其精度,DTS对FLOAT的迁移精度为38位,对DOUBLE的迁移精度为308位。 - DTS会尝试恢复七天之内迁移失败任务。因此业务切换至目标实例前,请务必结束或释放该任务,或者将DTS访问目标实例账号的写权限用
revoke
命令回收掉。避免该任务被自动恢复后,源端数据覆盖目标实例的数据。
PostgreSQL迁移至MySQL
目前新版控制台支持配置以下链路:- RDS PostgreSQL迁移至RDS MySQL
- 自建PostgreSQL迁移至自建MySQL
类型 | 说明 |
---|---|
源库限制 |
|
其他限制 |
|
特殊情况 |
|
自建PostgreSQL迁移至PolarDB O引擎
具体注意事项及限制如下:类型 | 说明 |
---|---|
源库限制 |
|
其他限制 |
|