当同步对象为整个库,且库中的触发器(TRIGGER)会更新库内某个表时,可能导致源和目标库的数据不一致。本文介绍触发器存在情况下如何配置同步作业。
重要 若您使用的是新版DTS控制台,且DTS实例目标端的数据库类型为MySQL、PolarDB MySQL版、AnalyticDB MySQL 3.0或RDS MariaDB,您可以在配置任务对象及高级配置阶段选择源库触发器迁移方式。更多信息,请参见同步或迁移源库中的触发器。
案例介绍
数据库triggertestdata中存在了两个表:parent和child。其中,表parent中有一个触发器(定义:当INSERT一条数据到表parent之后,将其INSERT写入的数据写入一份至表child中)。
说明 表结构及触发器定义如下表所示。
对象类型 | 名称 | 结构语句 |
---|---|---|
表 | parent |
|
表 | child |
|
触发器 | data_check |
|
在此案例中,如果在数据同步时,在源库的表parent中执行了INSERT操作,将导致源和目标库中的表child数据不一致。为解决该问题,需要删除被迁移到目标库中的触发器。
操作步骤
本文以自建MySQL同步至RDS MySQL为例介绍配置流程,更多配置案例请参见DTS数据同步方案概览。
- 创建一个数据迁移任务,将源库的结构迁移至目标库,相关案例请参见从自建MySQL迁移至RDS实例(仅选择结构迁移)。说明 在配置数据迁移任务时,在设置迁移类型及列表环节仅需选择结构迁移,然后选择待迁移的库或表。
- 由于执行结构迁移时,触发器也会被迁移至目标库中。当迁移任务完成后,您需要登录目标数据库,执行下述命令删除被迁移过去的触发器。
drop trigger <触发器名称>;
示例:
drop trigger data_check;
- 创建数据同步作业,将源库的数据同步至目标库中,配置案例请参见从ECS上的自建MySQL同步至RDS(仅选择全量数据初始化)。说明
- 在同步作业的选择同步对象环节中,需和步骤1中选择的同步对象一致。
- 由于已经完成了结构迁移,在同步作业的高级设置环节中,您仅需选中全量数据初始化。
数据一致性测试
- 登录源数据库,在表parent中插入一条记录。
insert into parent values(1,'testname');
执行该操作后,由于源库触发器的缘故,该条记录也会被写入至源库的child表中。 - 登录源和目标数据库,查询表child的数据,比对其数据是否一致。
- 源库查询结果
- 目标库查询结果
经比对,数据一致。 - 源库查询结果