当您在同步或迁移数据时包含了触发器(Trigger),且同步或迁移对象依赖的触发器会更新某个表时,可能会因为目标库过早同步或迁移触发器,而导致源和目标库的数据不一致。本文介绍如何同步或迁移触发器,避免数据不一致的问题。
前提条件
同步或迁移实例的源和目标数据库需为指定类型的数据库,例如RDS Mariadb同步到RDS MySQL。更多信息,请参见支持的实例。
实例同时包含库表结构和增量任务。
支持的实例
源库 | 目标库 | 说明 |
MySQL、PolarDB MySQL版、MariaDB | MySQL、PolarDB MySQL版、RDS MariaDB | 若源库触发器迁移方式选择为自动迁移,DTS会在目标库的触发器中加入触发控制语句,DTS默认不触发目标库中的触发器。更多信息,请参见自动执行。 |
SQL Server | SQL Server | 若源库触发器迁移方式选择为自动迁移,DTS会自动将触发器迁移至目标库。 重要 若源库的增量数据变更会导致源和目标库的触发器同时更新数据,则可能会使目标库产生脏数据。建议选择手动触发迁移,并执行相应的后续操作。 |
实例配置
在配置任务对象及高级配置阶段,选择源库触发器迁移方式。
选择手动触发迁移时:DTS在结构迁移过程中遇到触发器时,会产生
object ignored due to incremental migration is enabled
告警,而不会直接将其写入目标库。需要您在结束增量任务前,手动将源库的触发器同步或迁移到目标库。详情请参见手动触发。选择自动迁移时:您无需额外操作。
手动触发
同步和迁移实例的操作方法类似,本操作以同步实例为例进行介绍。
进入同步任务的列表页面。
登录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;