当同步或迁移对象依赖的触发器(Trigger)会更新某个表时,可能会因为目标端过早同步或迁移触发器,而导致源和目标端的数据不一致。本文介绍如何同步或迁移触发器,避免数据不一致的问题。

背景信息

对于同步或迁移的DDL包含触发器,且包含增量同步或迁移任务的指定目标端的实例,您可以在配置任务对象及高级配置阶段选择源库触发器迁移方式
  • 选择手动触发迁移时:DTS在结构迁移过程中遇到触发器(Trigger)时,会产生object ignored due to incremental migration is enabled告警,而不会直接将其写入目标库。需要您在结束增量任务前,手动将源端的触发器同步或迁移到目标端。详情请参见手动触发
  • 选择自动迁移时:您无需额外操作,DTS会在目标端的触发器(Trigger)中加入触发控制语句,DTS默认不触发目标端中的触发器(Trigger)。更多信息,请参见自动执行

前提条件

  • 实例目标端的数据库类型为MySQL、PolarDB MySQL、AnalyticDB MySQL 3.0或RDS MariaDB。
  • 实例包含增量同步或增量迁移任务。

手动触发

说明 同步和迁移实例的操作方法类似,本操作以同步实例为例进行介绍。
  1. 进入同步任务的列表页面。
    1. 登录DMS数据管理服务
    2. 在顶部菜单栏中,单击集成与开发(DTS)
    3. 在左侧导航栏,选择数据传输(DTS) > 数据同步
    说明
  2. 同步任务右侧,选择同步实例所属地域。
    说明 新版DTS同步任务列表页面,需要在页面左上角选择同步实例所属地域。
  3. 单击目标实例的ID。
  4. 可选:在左侧导航栏,单击任务管理
  5. 实例进展区域,单击增量写入模块。
  6. 基本信息页签中,单击迁移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;