本文介绍如何使用修改同步对象功能,解决DTS同步实例运行过程中表报错的问题。
前提条件
没有业务读取目标库的数据,或业务可以短时间不读取目标库的数据。
源库和目标库处于正常运行的状态。
除报错信息中的表以外,同步实例有其他待同步的对象。
当前实例的运行状态不能为修改同步对象中。
注意事项
DTS 同步任务采用串行写入模式以保证数据一致性,因此任意一张表发生写入报错,都会导致整个同步任务失败或阻塞,而不仅仅是该报错表停止同步。请及时处理单表报错,避免影响整个同步链路。
修改同步对象会自动重启实例,在实例重启期间可能会导致源库与目标库数据不一致。
本方法需要清空目标表的数据。在您执行本方法的操作前:
请确保目标表中只有DTS在写入数据,或目标表中的数据可以被清空。
请确保与目标表关联的业务不会被影响。
实现流程
移除同步实例报错信息中的表或热点表。
清空目标库中报错信息表的数据。
重新添加报错信息中的表到同步实例中。
操作步骤
进入同步任务的列表页面。
通过DTS控制台进入
登录数据传输服务DTS控制台。
在左侧导航栏,单击数据同步。
在页面左上角,选择同步实例所属地域。
通过DMS控制台进入
说明实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式控制台和自定义DMS界面布局与样式。
登录DMS数据管理服务。
在顶部菜单栏中,选择。
在同步任务右侧,选择同步实例所属地域。
根据实际情况,移除报错的表或热点表。
说明查看热点表的方法,请参见查看热点表信息。
若该表所属的同步对象的粒度为整库:
在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。
在已选择对象中勾选报错表所在的库,并单击
移除该库。在源库对象中以表为粒度勾选待同步的对象(不含报错的表),并单击
重新添加至已选择对象。
说明更多信息,请参见移除同步对象。
依次单击下一步高级配置和下一步预检查并启动。
等待预检查通过率显示为100%时,单击修改成功,返回列表。
若该表所属的同步对象的粒度为表:
在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。
在已选择对象中勾选报错的表,并单击
移除该表。移除后,已选择对象面板中 person 表不再被勾选,仅保留 person_new 表。依次单击下一步高级配置和下一步预检查并启动。
等待预检查通过率显示为100%时,单击修改成功,返回列表。
清空目标库中报错表的数据。
例如MySQL数据库,可以使用如下命令清空数据:
TRUNCATE TABLE XXX; DROP TABLE XXX;重新将报错的表添加为待同步的对象。
在同步任务列表找到目标同步实例,并单击操作列的修改同步对象。
在源库对象中勾选报错的表,并单击
重新添加至已选择对象。说明更多信息,请参见新增同步对象。
依次单击下一步高级配置和下一步预检查并启动。
等待预检查通过率显示为100%时,单击修改成功,返回列表。
等待实例自动重启后,查看是否还报错。
常见问题
跳过或忽略报错表后,任务仍在重试或进度停滞,怎么办?
可能原因:
目标库中还存在其他尚未解决的缺失表(与之前已忽略的表不同),DTS 因新的缺失表再次进入报错重试状态。
当前正在同步大表,任务处于正常的迁移等待状态,进度暂时停滞。
处理方法:
登录 DTS 控制台,在同步任务列表中找到目标同步实例,单击修改同步对象。
找到当前新报错的表,将其设置为忽略。
保存配置后,依次单击暂停任务和重启任务,使新配置生效。
如问题仍未解决,检查同步任务中父表及其所有关联子表是否均已包含在同步范围内。
表结构修复与任务重启的标准流程
遇到表结构相关报错时,建议按以下通用流程排查并修复:
确认目标端表结构差异:在目标端执行以下命令,对比源端与目标端的表结构,确认缺失的字段、索引或自增属性:
SHOW CREATE TABLE <表名>;手动补全表结构:根据差异信息,在目标端手动添加缺失的字段、索引,或修正表结构,使目标端与源端保持一致。
重启DTS任务:表结构修复完成后,重新启动DTS任务以恢复同步。
处理"Removed Object"报错:若报错信息中包含
Removed Object,建议先在目标库删除报错涉及的表,然后通过DTS重新执行结构迁移,让DTS重新在目标端创建该表结构。
若报错根因是增量同步过程中遗漏了DDL操作(如未同步某次加字段操作),核心解决方法是补齐缺失的DDL语句并对齐表结构,而非仅重启DTS任务。仅重启任务而不修复结构差异,报错将持续出现。
源端执行 DDL 操作后,目标端重复执行了多次,如何排查?
排查步骤:
确认 DTS 任务监听时间点:核实源端 DDL 操作的执行时间是否晚于 DTS 开始监听增量变更的时间点。若 DDL 在 DTS 监听之前执行,DTS 不会重新推送该 DDL,此情况可排除 DTS 原因。
排除 MDL 锁等待误判:登录目标数据库,执行以下命令查看当前会话状态:
SHOW FULL PROCESSLIST;区分正在执行 DDL 的事务与因元数据锁(MDL 锁)等待而挂起的会话,MDL 锁等待不代表 DDL 被重复执行。
开启通用日志复现:在目标端自建数据库中,执行以下命令开启通用日志:
SET GLOBAL general_log = 'ON';然后在 DTS 控制台触发相应操作,观察是否能复现问题。
分析日志:检查
general_log,确认是否存在 DTS 推送的多条完全相同的 DDL 语句。隔离测试:如生产环境不便直接测试,可将源端数据复制到新库,配置新的同步任务进行隔离验证。
若在 DTS 侧日志中未发现重复推送记录,且问题无法复现,则可能不是 DTS 原因,或相关日志已超出保留期限。请联系阿里云技术支持进一步排查。