如何通过忽略操作解决同步实例表报错

更新时间:
复制 MD 格式

本文介绍如何使用修改同步对象功能,解决DTS同步实例运行过程中表报错的问题。

前提条件

  • 没有业务读取目标库的数据,或业务可以短时间不读取目标库的数据。

  • 源库和目标库处于正常运行的状态。

  • 除报错信息中的表以外,同步实例有其他待同步的对象。

  • 当前实例的运行状态不能为修改同步对象中。

注意事项

  • DTS 同步任务采用串行写入模式以保证数据一致性,因此任意一张表发生写入报错,都会导致整个同步任务失败或阻塞,而不仅仅是该报错表停止同步。请及时处理单表报错,避免影响整个同步链路。

  • 修改同步对象会自动重启实例,在实例重启期间可能会导致源库与目标库数据不一致。

  • 本方法需要清空目标表的数据。在您执行本方法的操作前:

    • 请确保目标表中只有DTS在写入数据,或目标表中的数据可以被清空。

    • 请确保与目标表关联的业务不会被影响。

实现流程

  1. 移除同步实例报错信息中的表或热点表。

  2. 清空目标库中报错信息表的数据。

  3. 重新添加报错信息中的表到同步实例中。

操作步骤

  1. 进入同步任务的列表页面。

    通过DTS控制台进入

    1. 登录数据传输服务DTS控制台。

    2. 在左侧导航栏,单击数据同步。

    3. 在页面左上角,选择同步实例所属地域。

    通过DMS控制台进入

    说明

    实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式控制台和自定义DMS界面布局与样式。

    1. 登录DMS数据管理服务。

    2. 在顶部菜单栏中,选择Data + AI > 数据传输(DTS) > 数据同步。

    3. 在同步任务右侧,选择同步实例所属地域。

  2. 根据实际情况,移除报错的表或热点表。

    说明

    查看热点表的方法,请参见查看热点表信息。

    • 若该表所属的同步对象的粒度为整库:

      1. 在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。

      2. 在已选择对象中勾选报错表所在的库,并单击zuoyi移除该库。

      3. 在源库对象中以表为粒度勾选待同步的对象(不含报错的表),并单击youyi重新添加至已选择对象。

        说明

        更多信息,请参见移除同步对象。

      4. 依次单击下一步高级配置和下一步预检查并启动。

      5. 等待预检查通过率显示为100%时,单击修改成功,返回列表。

    • 若该表所属的同步对象的粒度为表:

      1. 在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。

      2. 在已选择对象中勾选报错的表,并单击zuoyi移除该表。移除后,已选择对象面板中 person 表不再被勾选,仅保留 person_new 表。

      3. 依次单击下一步高级配置和下一步预检查并启动。

      4. 等待预检查通过率显示为100%时,单击修改成功,返回列表。

  3. 清空目标库中报错表的数据。

    例如MySQL数据库,可以使用如下命令清空数据:

    TRUNCATE TABLE XXX;
    DROP TABLE XXX;
  4. 重新将报错的表添加为待同步的对象。

    1. 在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。

    2. 在源库对象中勾选报错的表,并单击youyi重新添加至已选择对象。

      说明

      更多信息,请参见新增同步对象。

    3. 依次单击下一步高级配置和下一步预检查并启动。

    4. 等待预检查通过率显示为100%时,单击修改成功,返回列表。

  5. 等待实例自动重启后,查看是否还报错。

常见问题

跳过或忽略报错表后,任务仍在重试或进度停滞,怎么办?

可能原因:

  • 目标库中还存在其他尚未解决的缺失表(与之前已忽略的表不同),DTS 因新的缺失表再次进入报错重试状态。

  • 当前正在同步大表,任务处于正常的迁移等待状态,进度暂时停滞。

处理方法:

  1. 登录 DTS 控制台,在同步任务列表中找到目标同步实例,单击修改同步对象。

  2. 找到当前新报错的表,将其设置为忽略。

  3. 保存配置后,依次单击暂停任务和重启任务,使新配置生效。

  4. 如问题仍未解决,检查同步任务中父表及其所有关联子表是否均已包含在同步范围内。

表结构修复与任务重启的标准流程

遇到表结构相关报错时,建议按以下通用流程排查并修复:

  1. 确认目标端表结构差异:在目标端执行以下命令,对比源端与目标端的表结构,确认缺失的字段、索引或自增属性:

    SHOW CREATE TABLE <表名>;
  2. 手动补全表结构:根据差异信息,在目标端手动添加缺失的字段、索引,或修正表结构,使目标端与源端保持一致。

  3. 重启DTS任务:表结构修复完成后,重新启动DTS任务以恢复同步。

  4. 处理"Removed Object"报错:若报错信息中包含Removed Object,建议先在目标库删除报错涉及的表,然后通过DTS重新执行结构迁移,让DTS重新在目标端创建该表结构。

重要

若报错根因是增量同步过程中遗漏了DDL操作(如未同步某次加字段操作),核心解决方法是补齐缺失的DDL语句并对齐表结构,而非仅重启DTS任务。仅重启任务而不修复结构差异,报错将持续出现。

源端执行 DDL 操作后,目标端重复执行了多次,如何排查?

排查步骤:

  1. 确认 DTS 任务监听时间点:核实源端 DDL 操作的执行时间是否晚于 DTS 开始监听增量变更的时间点。若 DDL 在 DTS 监听之前执行,DTS 不会重新推送该 DDL,此情况可排除 DTS 原因。

  2. 排除 MDL 锁等待误判:登录目标数据库,执行以下命令查看当前会话状态:

    SHOW FULL PROCESSLIST;

    区分正在执行 DDL 的事务与因元数据锁(MDL 锁)等待而挂起的会话,MDL 锁等待不代表 DDL 被重复执行。

  3. 开启通用日志复现:在目标端自建数据库中,执行以下命令开启通用日志:

    SET GLOBAL general_log = 'ON';

    然后在 DTS 控制台触发相应操作,观察是否能复现问题。

  4. 分析日志:检查 general_log,确认是否存在 DTS 推送的多条完全相同的 DDL 语句。

  5. 隔离测试:如生产环境不便直接测试,可将源端数据复制到新库,配置新的同步任务进行隔离验证。

说明

若在 DTS 侧日志中未发现重复推送记录,且问题无法复现,则可能不是 DTS 原因,或相关日志已超出保留期限。请联系阿里云技术支持进一步排查。