如果迁移的源数据库类型为PostgreSQL,如自建PostgreSQL、RDS PostgreSQL,您需要在配置具体的迁移任务前,参考本文的注意事项及限制,以保障数据迁移任务的正常运行。
源库为PostgreSQL的迁移方案概览
根据迁移方案,查看迁移任务的注意事项及限制:
PostgreSQL间的迁移
RDS PostgreSQL间的迁移
类型
说明
源库限制
待迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(迁移类型未选中库表结构迁移),则需确保该表与源库中待迁移的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
待迁移的数据库名称中间不能包含短划线(-),例如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值。
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用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。说明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
命令回收掉。避免该任务被自动恢复后,源端数据覆盖目标实例的数据。若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为RDS PostgreSQL时,迁移期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致迁移失败。
自建PostgreSQL迁移至RDS PostgreSQL
类型
说明
源库限制
带宽要求:源库所属的服务器需具备足够出口带宽,否则将影响数据迁移速率。
待迁移的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(迁移类型未选中库表结构迁移),则需确保该表与源库中待迁移的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
待迁移的数据库名称中间不能包含短划线(-),例如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值。
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用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。说明当释放迁移任务或迁移失败时,DTS会主动清理该replication slot;如果自建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
命令回收掉。避免该任务被自动恢复后,源端数据覆盖目标实例的数据。若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为自建PostgreSQL时,需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择迁移对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。
PostgreSQL迁移至MySQL
具体注意事项及限制如下:
类型 | 说明 |
源库限制 |
|
其他限制 |
|
特殊情况 |
|
PostgreSQL迁移至PolarDB PostgreSQL版(兼容Oracle)
具体注意事项及限制如下:
类型 | 说明 |
源库限制 |
|
其他限制 |
|
特殊情况 |
|