本文介绍排查DTS增量迁移延迟或同步延迟的方法。

问题描述

DTS在进行增量迁移时,迁移任务或同步任务出现延迟的现象。

可能原因

  • 原因1:任务规格受限制。DTS的增量迁移/同步链路的各个规格有对应的RPS限制,当源库的数据写入量过大时,达到了规格限流,就会导致任务延迟。

    您可以在控制台上查看任务流量或者执行一键诊断功能,检查当前链路是否到达相应规格的限制。查看方式,请参见监控任务性能同步链路规格迁移链路规格

  • 原因2:目标实例规格受限:目标库实例的写入性能已达到瓶颈。

    以目标实例为RDS MySQL为例,您可以在RDS控制台的监控与报警页面查看实例的CPU、内存、I/O等资源负载情况,并对照相应的实例规格,确认是否达到实例规格的限制。查看方式,请参见查看资源、引擎和部署监控RDS MySQL主实例规格列表

  • 原因3:可能存在热点更新,影响性能。无主键表可能会导致热点行更新;源库对单一表或者单一行的高频度更新也会导致热点更新。

    以源实例为RDS MySQL为例,您可以通过SQL洞察和审计页面查看源实例执行的事务情况,判断是否存在热点更新,比如事务集中在某几张特定的表上。查看方式,请参见SQL洞察和审计

  • 原因4:源库实例的读取性能达到瓶颈或网络带宽被打满。

    以源实例为RDS MySQL为例,您可以在RDS控制台的监控与报警页面查看实例的IOPS等指标,并对照相应的实例规格,确认是否达到实例规格的限制。查看方式,请参见查看资源、引擎和部署监控RDS MySQL主实例规格列表

  • 原因5:当DTS无法连接数据库或由于其他报错导致DTS写入数据至目标库发生异常时,DTS会进行多次重试,从而表现出同步延迟。此时您可以在控制台上查看任务是否处于重试中状态,并单击查看原因并修复,查看重试原因并进行相应修复。

    比如,当目标库实例为AnalyticDB MySQL时,如源库执行变更字段类型的DDL操作,会导致DTS同步任务出现延迟,处于重试中状态。这是因为目标实例AnalyticDB MySQL不支持字段类型变更,而DTS会在AnalyticDB MySQL中多次重试DDL操作且执行失败,从而表现出同步延迟。

  • 原因6:目标库带有触发器(trigger),会产生较大延迟。
    以MySQL数据库为例,可以使用如下命令查看是否有触发器。
    select * from information_schema.triggers where trigger_schema='<数据库名>';
  • 原因7:在目标库被同步的表存在既有主键又有唯一键等表结构复杂的情况下,当目标库存在除DTS外其他业务写入时可能会导致目标库存在锁表和慢SQL。
  • 原因8:源库存在大量DDL操作。

    以源实例为RDS MySQL为例,您可以通过SQL洞察和审计页面查看源实例中DDL的执行情况,判断是否存在大量DDL操作。查看方式,请参见SQL洞察和审计

解决方法

  • 解法1:升级DTS增量迁移/同步的链路规格,提高迁移性能。参见升级实例配置
  • 解法2:升级目标库的实例规格,提高目标库实例写入性能。

    以目标库实例为RDS MySQL为例,参考变更配置,升级实例配置。

  • 解法3:在存在热点行更新的情况时,等待热点更新完毕。或者从业务上考虑尽量避免热点更新。
  • 解法4:提升源库实例性能或升级网络带宽。

    以目标库实例为RDS MySQL为例,参考变更配置,升级实例配置。

  • 解法5:在控制台上查看具体的报错内容,并进行相应修复。

    本案例中,DTS在目标实例ADB中多次执行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。