当您在同步或迁移数据时包含了触发器(Trigger),且同步或迁移对象依赖的触发器会更新某个表时,可能会因为目标库过早同步或迁移触发器,而导致源和目标库的数据不一致。本文介绍如何配置同步或迁移触发器的方式,以避免数据不一致的问题。
前提条件
同步或迁移实例的源和目标数据库需为指定类型的数据库,例如RDS MariaDB同步到RDS MySQL。更多信息,请参见支持的实例。
实例同时包含库表结构和增量任务。
迁移实例:迁移类型需勾选库表结构迁移和增量迁移。
同步实例:同步类型默认已勾选增量同步,还需勾选库表结构同步。
在配置同步或迁移实例过程中,源库对象的选择粒度为整库或Schema。
支持的实例
源库 | 目标库 | 说明 |
MySQL、PolarDB MySQL版、MariaDB | MySQL、PolarDB MySQL版、MariaDB | 若源库触发器迁移方式选择为自动迁移,DTS会在目标库的触发器中加入触发控制语句,DTS默认不触发目标库中的触发器。更多信息,请参见自动执行。 |
SQL Server | SQL Server | 若源库触发器迁移方式选择为自动迁移,DTS会自动将触发器迁移至目标库。 重要 若源库的增量数据变更会导致源和目标库的触发器同时更新数据,则可能会使目标库产生脏数据。建议选择手动触发迁移,并执行相应的后续操作。 |
若同步或迁移实例的源库包含触发器,且目标库为PostgreSQL、PolarDB PostgreSQL版或PolarDB PostgreSQL版(兼容Oracle),DTS支持在实例运行过程中,避免因同步或迁移触发器而导致的数据不一致问题。
若实例使用的目标库账号有足够的权限(高权限账号或者super权限账号),触发器同步或迁移到目标库后,DTS会以Session级别自动禁用该触发器。
若实例使用的目标库账号权限不足,您需要确保在实例运行期间目标数据库中
session_replication_role
的参数值为replica
。
若为其他包含触发器的同步或迁移实例,操作方法请参见源库存在触发器时如何配置同步或迁移作业。
实例配置
在对象配置阶段,选择源库触发器迁移方式。
旧版配置页需处于配置任务对象及高级配置阶段。
选择手动触发迁移时: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;