本文介绍导致DTS增量迁移延迟或同步延迟过大的常见原因,以及相应的解决方法。您可以逐一排查这些原因,并根据解决方法恢复任务。
问题描述
DTS在进行增量任务时,迁移任务或同步任务出现延迟超过1000毫秒的情况。
可能原因
原因1:任务规格受限,且任务数据量过大。DTS的增量迁移或同步链路的各个规格有对应的RPS限制,当源库的数据写入量过大时(例如有大事务),达到了规格限流,就会导致任务延迟。
您可以在控制台上查看任务流量或者执行一键诊断功能,检查当前链路是否到达相应规格的限制。查看方式,请参见监控任务性能、同步链路规格和迁移链路规格。
原因2:目标实例规格受限:目标库实例的写入性能已达到瓶颈。
以目标实例为RDS MySQL为例,您可以在RDS控制台的监控与报警页面查看实例的CPU、内存、I/O等资源负载情况,并对照相应的实例规格,确认是否达到实例规格的限制。查看方式,请参见查看监控信息和RDS MySQL标准版(原X86)主实例规格列表。
原因3:可能存在热点更新,影响性能。无主键表可能会导致热点行更新;源库对单一表或者单一行的高频度更新也会导致热点更新。
以源实例为RDS MySQL为例,您可以通过SQL洞察和审计页面查看源实例执行的事务情况,判断是否存在热点更新,比如事务集中在某几张特定的表上。查看方式,请参见SQL洞察和审计。
原因4:源库实例的读取性能达到瓶颈或网络带宽被打满。
以源实例为RDS MySQL为例,您可以在RDS控制台的监控与报警页面查看实例的IOPS等指标,并对照相应的实例规格,确认是否达到实例规格的限制。查看方式,请参见查看监控信息和RDS MySQL标准版(原X86)主实例规格列表。
原因5:当DTS无法连接数据库或由于其他报错导致DTS写入数据至目标库发生异常时,DTS会进行多次重试,从而表现出同步延迟。此时您可以在控制台上查看任务是否处于重试中状态,并单击查看原因并修复,查看重试原因并进行相应修复。
比如,当目标库实例为云原生数据仓库 AnalyticDB MySQL 版(AnalyticDB for MySQL)时,如源库执行变更字段类型的DDL操作,会导致DTS同步任务出现延迟,处于重试中状态。这是因为目标实例云原生数据仓库 AnalyticDB MySQL 版(AnalyticDB for MySQL)不支持字段类型变更,而DTS会在云原生数据仓库 AnalyticDB MySQL 版(AnalyticDB for MySQL)中多次重试DDL操作且执行失败,从而表现出同步延迟。
原因6:目标库带有触发器(trigger),会产生较大延迟。
以MySQL数据库为例,可以使用如下命令查看是否有触发器。
select * from information_schema.triggers where trigger_schema='<数据库名>';
原因7:在目标库被同步的表存在既有主键又有唯一键等表结构复杂的情况下,当目标库存在除DTS外其他业务写入时可能会导致目标库存在锁表和慢SQL。
原因8:源库存在大量DDL操作。
以源实例为RDS MySQL为例,您可以通过SQL洞察和审计页面查看源实例中DDL的执行情况,判断是否存在大量DDL操作。查看方式,请参见SQL洞察和审计。
原因9:远距离传输导致的网络延迟。
您可以在任务列表页面查看源库和目标库实例所属地域。
原因10:源库和目标库中的表结构不一致。
原因11:控制台显示可能有延迟。
解决方法
解法1:升级DTS增量迁移或同步的链路规格,提高迁移性能。更多信息,请参见升级任务的链路规格。
解法2:升级目标库的实例规格,提高目标库实例写入性能。
以目标库实例为RDS MySQL为例,参考变更配置,升级实例配置。
解法3:在存在热点行更新的情况时,等待热点更新完毕。或者从业务上考虑尽量避免热点更新。
解法4:提升源库实例性能或升级网络带宽。
以目标库实例为RDS MySQL为例,参考变更配置,升级实例配置。
解法5:在控制台上查看具体的报错内容,并进行相应修复。
本案例中,DTS在目标实例云原生数据仓库 AnalyticDB MySQL 版(AnalyticDB for MySQL)中多次执行DDL操作且失败,导致DTS同步延迟,并进入重试状态。如需恢复同步任务,建议您先将执行过DDL的表移出同步对象,待延时降0毫秒后,再删除目标库对应表,最后将该表重新加入同步对象。操作方式,请参见DTS同步数据常见问题和修改同步对象。
解法6:建议删除或禁用目标库的触发器(trigger)。
以MySQL数据库为例,可以使用命令
DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>;
删除触发器。说明如源库存在触发器,您可参考源库存在触发器时如何配置同步作业,来配置DTS任务。
解法7:检查目标库实例的锁状态、慢SQL以及表结构,然后调整目标库写入或者目标库表结构来解决目标库写入锁以及慢SQL问题。
本案例以MySQL数据库为例,介绍锁状态和慢SQL、库表结构的查询方式,以及对应解决方式。
锁状态和慢SQL:使用命令
SHOW PROCESSLIST;
查询锁表或者慢SQL进程,然后执行命令KILL [CONNECTION | QUERY]thread_id
删除该进程。库表结构:使用命令
show create table <数据库名>.<表名>;
查看表结构。以存在唯一键为例,请从业务上评估是否需要该唯一键,如不需要,则可以在目标库执行命令alter table <数据库名>.<表名> drop index <唯一键名>;
进行删除。
解法8:如DTS任务已经成功运行,则源库应避免执行批量DDL。如必须执行DDL,请尽量在业务低峰期执行。
说明建议您在配置任务阶段不勾选无需同步的DDL。
解法9:远距离传输导致的网络延迟无法避免,您可以通过专线接入源库和目标库实例减少延迟。
解法10:根据实际情况调整表结构,确保源库和目标库的表结构保持一致。
解法11:请再观察几分钟,并刷新控制台。
更多信息
全量任务慢的解决方案,请参见如何解决全量迁移慢或迁移卡住。
若本文无法解决您的问题,您可以通过钉钉(钉钉通讯客户端下载地址)进入到DTS客户交流钉钉群(群号:68325004196或68640008972),进行咨询。