当同步或迁移对象依赖的触发器(Trigger)会更新某个表时,可能会因为目标端过早同步或迁移触发器,而导致源和目标端的数据不一致。本文介绍如何同步或迁移触发器,避免数据不一致的问题。
背景信息
对于同步或迁移的DDL包含触发器,且包含增量同步或迁移任务的指定目标端的实例,您可以在配置任务对象及高级配置阶段选择源库触发器迁移方式。
前提条件
- 实例目标端的数据库类型为MySQL、PolarDB MySQL、AnalyticDB MySQL 3.0或RDS MariaDB。
- 实例包含增量同步或增量迁移任务。
手动触发
说明 同步和迁移实例的操作方法类似,本操作以同步实例为例进行介绍。
- 进入同步任务的列表页面。
- 登录DMS数据管理服务。
- 在顶部菜单栏中,单击集成与开发(DTS)。
- 在左侧导航栏,选择 。
说明- 实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式和自定义DMS界面布局与样式。
- 您也可以登录新版DTS同步任务的列表页面。
- 在同步任务右侧,选择同步实例所属地域。说明 新版DTS同步任务列表页面,需要在页面左上角选择同步实例所属地域。
- 单击目标实例的ID。
- 可选:在左侧导航栏,单击任务管理。
- 在实例进展区域,单击增量写入模块。
- 在基本信息页签中,单击迁移trigger按钮。说明 若没有迁移trigger按钮,则表示在结构迁移过程中未发现触发器。您可以在实例进展区域的结构迁移3模块,查看触发器的同步结果。
自动执行
DTS会拷贝源端触发器的代码,在触发器对象头部加入触发控制语句后写入目标端,示例代码如下所示:
源端触发器:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
END;
目标端触发器:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
IF (SELECT @`__#aliyun_dts_writer#__) IS NULL THEN
INSERT INTO test2 SET a2 = NEW.a1;
END IF;
END;