当同步对象为整个库,且库中的触发器(TRIGGER)会更新库内某个表时,可能导致源和目标库的数据不一致。本文介绍触发器存在情况下如何配置同步作业。

案例介绍

数据库triggertestdata中存在了两个表:parent和child。其中,表parent中有一个触发器(定义:当INSERT一条数据到表parent之后,将其INSERT写入的数据写入一份至表child中)。

说明 表结构及触发器定义如下表所示。
对象类型 名称 结构语句
parent
CREATE TABLE `parent` (
  `user_vs_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`user_vs_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8
child
CREATE TABLE `child` (
  `sys_child_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_vs_id` int(11) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`sys_child_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8
触发器 data_check
CREATE  TRIGGER `triggertestdata`.`data_check`
AFTER INSERT  ON triggertestdata.parent
 FOR EACH ROW
begin

insert into child(user_vs_id, name) values(new.user_vs_id, new.name) ;

end;

在此案例中,如果在数据同步时,在源库的表parent中执行了INSERT操作,将导致源和目标库中的表child数据不一致。为解决该问题,需要删除被迁移到目标库中的触发器。

操作步骤

本文以自建MySQL同步至RDS MySQL为例介绍配置流程,更多配置案例请参见DTS数据同步方案概览

  1. 创建一个数据迁移任务,将源库的结构迁移至目标库,可参考从自建MySQL迁移至RDS MySQL进行配置(仅选择结构迁移)。
    说明 在配置数据迁移任务时,在设置迁移类型及列表环节仅需选择结构迁移,然后选择待迁移的库或表。
    仅选择结构迁移
  2. 由于执行结构迁移时,触发器也会被迁移至目标库中。当迁移任务完成后,您需要登录目标数据库,执行下述命令删除被迁移过去的触发器。
    drop trigger <触发器名称>;

    示例:

    drop trigger data_check;
  3. 创建数据同步作业,将源库的数据同步至目标库中,可参考从ECS上的自建MySQL同步至RDS MySQL进行配置(仅选择全量数据初始化)。
    说明
    • 在同步作业的选择同步对象环节中,需和步骤1中选择的同步对象一致。
    • 由于已经完成了结构迁移,在同步作业的高级设置环节中,您仅需选中全量数据初始化
    仅选择全量数据初始化

数据一致性测试

  1. 登录源数据库,在表parent中插入一条记录。
    insert into parent values(1,'testname');
    执行该操作后,由于源库触发器的缘故,该条记录也会被写入至源库的child表中。
  2. 登录源和目标数据库,查询表child的数据,比对其数据是否一致。
    • 源库查询结果查询结果
    • 目标库查询结果查询结果
    经比对,数据一致。