如果同步的源数据库类型为PostgreSQL,如RDS PostgreSQL、自建PostgreSQL,您需要在配置具体的同步任务前,参考本文的注意事项及限制,以保障数据同步任务的正常运行。
源库为PostgreSQL的同步方案概览
根据同步方案,查看同步任务的注意事项及限制:
DTS默认同步到目标数据库中时会取消外键约束,因此源数据库的级联、删除等操作不会同步到如下目标数据库:
RDS PostgreSQL
云原生数据仓库AnalyticDB PostgreSQL
PolarDB PostgreSQL版(兼容Oracle)
RDS MySQL
PolarDB PostgreSQL版
PostgreSQL间同步
RDS PostgreSQL间的单向同步
类型
说明
源库限制
待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置wal_level参数的值为logical。
如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
源库的操作限制
为保障同步任务的正常进行,避免主备切换导致的逻辑订阅中断,需要RDS PostgreSQL支持并开启Logical Replication Slot Failover,设置方式,请参见逻辑复制槽故障转移(Logical Replication Slot Failover)。
由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。
在库表结构同步和全量同步阶段,请勿执行库或表结构变更的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,如果您在同步期间修改了数据库密码,或者删除了DTS的访问IP白名单,则会导致该replication slot无法自动删除,此时需要您在源库手动删除,避免其持续累积占用磁盘空间导致RDS PostgreSQL实例不可用。
当释放同步任务或同步失败时,DTS会主动清理该replication slot;如果PostgreSQL发生了主备切换,则需要您登录备库来手动清理。
执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。
全量初始化会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量初始化完成后目标实例的表空间比源实例的表空间大。
对于表级别的数据同步,如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见不锁表结构变更。
在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。
若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。
若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为RDS PostgreSQL时
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。
当源实例为自建PostgreSQL时
需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。
自建PostgreSQL同步至RDS PostgreSQL
类型
说明
源库限制
待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置wal_level参数的值为logical。
如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
如自建PostgreSQL进行主备切换,会导致同步失败。
需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
若源库有长事务,且实例包含增量同步任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。
由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。
在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。
在同步实例运行期间,若源库进行了大版本升级,将会导致同步实例运行失败并且无法恢复,您需要重新配置同步实例。
其他限制
单个数据同步任务只能同步一个数据库,如需同步多个数据库,您需要为每个数据库配置数据同步任务。
同步期间,如果同步对象的选择粒度为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发生了主备切换,则需要您登录备库来手动清理。
执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。
全量初始化会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量初始化完成后目标实例的表空间比源实例的表空间大。
对于表级别的数据同步,如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见不锁表结构变更。
在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。
若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。
若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
RDS PostgreSQL间的双向同步
类型
说明
源和目标库的限制
若待同步的表不具备主键和唯一约束,则在配置任务过程中需要开启Exactly-Once写入功能,否则可能会导致目标数据库中出现重复数据。更多信息,请参见同步无主键和唯一约束的表。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置wal_level参数的值为logical。
如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
源库的操作限制
为保障同步任务的正常进行,避免主备切换导致的逻辑订阅中断,需要RDS PostgreSQL支持并开启Logical Replication Slot Failover,设置方式,请参见逻辑复制槽故障转移(Logical Replication Slot Failover)。
由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。
在库表结构同步和全量同步阶段,请勿执行库或表结构变更的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; $$;
说明执行以上命令输出的SQL包含源库所有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,如果您在同步期间修改了数据库密码,或者删除了DTS的访问IP白名单,则会导致该replication slot无法自动删除,此时需要您在源库手动删除,避免其持续累积占用磁盘空间导致RDS PostgreSQL实例不可用。
当释放同步任务或同步失败时,DTS会主动清理该replication slot;如果PostgreSQL发生了主备切换,则需要您登录备库来手动清理。
执行数据同步前需评估源库和目标库的性能,同时建议业务低峰期执行数据同步。否则全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升。
全量初始化会并发执行INSERT操作,导致目标数据库的表产生碎片,因此全量初始化完成后目标实例的表空间比源实例的表空间大。
对于表级别的数据同步,如果除DTS以外的数据没有写入目标库,您可以使用数据管理DMS(Data Management)来执行在线DDL变更,请参见不锁表结构变更。
在DTS同步期间,不允许有除DTS外的数据写入目标库,否则会导致源库与目标库数据不一致。例如,有除DTS外的数据写入目标库时,使用DMS执行在线DDL变更,可能引起目标库数据丢失。
若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号或者super权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。
双向同步实例包含正向和反向同步任务,在配置或重置双向同步实例时,若其中一个任务的目标对象是另一个任务待同步的对象:
仅允许其中一个任务同步全量和增量数据,另一个任务仅支持同步增量数据。
当前任务的源数据仅支持同步到当前任务的目标端,同步过来的数据不会作为另一个任务的源数据继续同步。
若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为RDS PostgreSQL时
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。
当源实例为自建PostgreSQL时
需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。
自建PostgreSQL或RDS PostgreSQL同步至云原生数据仓库AnalyticDB PostgreSQL
类型 | 说明 |
源库限制 |
|
其他限制 |
|
特殊情况 |
|
自建PostgreSQL同步至PolarDB PostgreSQL版(兼容Oracle)
类型 | 说明 |
源库限制 |
|
其他限制 |
|
RDS PostgreSQL同步至RDS MySQL
类型 | 说明 |
源库限制 |
|
其他限制 |
|
特殊情况 |
|
RDS PostgreSQL同步至PolarDB PostgreSQL版
单向同步
类型
说明
源库限制
待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置wal_level参数的值为logical。
如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
若源库有长事务,且实例包含增量同步任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。
在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。
在同步实例运行期间,若源库进行了大版本升级,将会导致同步实例运行失败并且无法恢复,您需要重新配置同步实例。
其他限制
单个数据同步任务只能同步一个数据库,如需同步多个数据库,您需要为每个数据库配置数据同步任务。
若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。
同步期间,如果同步对象的选择粒度为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用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。说明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值。
若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为RDS PostgreSQL时
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。
当源实例为自建PostgreSQL时
需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。
双向同步
类型
说明
源库限制
待同步的表需具备主键或唯一约束,且字段具有唯一性,否则可能会导致目标数据库中出现重复数据。
说明若接收数据的目标表不是通过DTS创建(同步类型未选中库表结构同步),则需确保该表与源库中待同步的表具备相同的主键或非空唯一约束,否则可能会导致目标数据库中出现重复数据。
若同步对象为表级别,且需进行编辑(如表列名映射),单次同步任务的表数量超过5000时,建议您拆分待同步的表,分批配置多个任务,或者配置整库的同步任务,否则任务提交后可能会显示请求报错。
WAL日志:
需开启,即设置wal_level参数的值为logical。
如为增量同步任务,DTS要求源数据库的WAL日志保存24小时以上,如为全量同步和增量同步任务,DTS要求源数据库的WAL日志至少保留7天以上(您可在全量同步完成后将WAL日志保存时间设置为24小时以上),否则DTS可能因无法获取WAL日志而导致任务失败,极端情况下甚至可能会导致数据不一致或丢失。由于您所设置的WAL日志保存时间低于DTS要求的时间进而导致的问题,不在DTS的SLA保障范围内。
若源库有长事务,且实例包含增量同步任务,则可能会导致源库长事务提交前的预写日志WAL(Write-Ahead Logging)无法清理而堆积,从而造成源库磁盘空间不足。
由于源库的逻辑订阅本身存在使用限制,在同步实例运行期间,若源库待同步的单条数据在增量变更后超过256 MB,则可能会导致同步实例运行失败且无法恢复,您需要重新配置同步实例。
在库表结构同步和全量同步阶段,请勿执行库或表结构变更的DDL操作,否则会导致数据同步任务失败。
在同步实例运行期间,若源库进行了大版本升级,将会导致同步实例运行失败并且无法恢复,您需要重新配置同步实例。
其他限制
单个数据同步任务只能同步一个数据库,如需同步多个数据库,您需要为每个数据库配置数据同步任务。
若为全量同步或增量同步任务,且源数据库中要同步的表包含外键、触发器、事件触发器,如果目标库账号为高权限账号,全量或增量同步时DTS会以Session级别暂时将session_replication_role的参数值设置为replica;如果目标库账号没有该权限,您需要手动将目标数据库中session_replication_role的参数值设置为replica。在此期间(全量同步或增量同步过程中session_replication_role的参数值为replica),若源库存在级联更新、删除操作,则可能会导致数据不一致。在DTS同步任务释放后,您可以将session_replication_role的参数值改回origin。
同步期间,如果同步对象的选择粒度为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用于复制数据。通过该replication slot,DTS可以获取源库15分钟内的增量日志。说明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; $$;
说明执行以上命令输出的SQL包含源库所有Sequence,请根据业务需求在目标库中执行。
双向同步实例运行时,DTS会在源和目标库中建立名为
dts
的Schema,以避免数据循环同步,实例运行期间,请勿修改该库。双向同步实例包含正向和反向同步任务,在配置或重置双向同步实例时,若其中一个任务的目标对象是另一个任务待同步的对象:
仅允许其中一个任务同步全量和增量数据,另一个任务仅支持同步增量数据。
当前任务的源数据仅支持同步到当前任务的目标端,同步过来的数据不会作为另一个任务的源数据继续同步。
若实例运行失败,DTS技术支持人员将在8小时内尝试恢复该实例。在恢复失败实例的过程中,可能会对该实例进行重启、调整参数等操作。
说明在调整参数时,仅会修改实例的参数,不会对数据库中的参数进行修改。可能修改的参数,包括但不限于修改实例参数中的参数。
特殊情况
当源实例为RDS PostgreSQL时
同步期间,请勿修改RDS PostgreSQL的连接地址和可用区,否则会导致同步失败。
当源实例为自建PostgreSQL时
需要确保max_wal_senders和max_replication_slots的参数值,均大于当前数据库复制槽已使用数与需要以该自建PostgreSQL为源创建的DTS实例数的总和。
当源实例为Google Cloud Platform Cloud SQL for PostgreSQL时,源库的数据库账号需填入具有cloudsqlsuperuser权限的账号。在选择同步对象时需选择此账号有权限管理的对象,或者给此账号添加目标对象的Owner权限。
说明具有cloudsqlsuperuser权限的账号,无法管理Owner为其他cloudsqlsuperuser权限账号的数据。