配置同步或迁移触发器的方式

当您在同步或迁移数据时包含了触发器(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告警,而不会直接将其写入目标库。需要您在结束增量任务前,手动将源库的触发器同步或迁移到目标库。详情请参见手动触发

  • 选择自动迁移时:您无需额外操作。

手动触发

说明

同步和迁移实例的操作方法类似,本操作以同步实例为例进行介绍。

  1. 进入目标地域的同步任务列表页面(二选一)。

    通过DTS控制台进入

    1. 登录数据传输服务DTS控制台

    2. 在左侧导航栏,单击数据同步

    3. 在页面左上角,选择同步实例所属地域。

    通过DMS控制台进入

    说明

    实际操作可能会因DMS的模式和布局不同,而有所差异。更多信息,请参见极简模式控制台自定义DMS界面布局与样式

    1. 登录DMS数据管理服务

    2. 在顶部菜单栏中,选择集成与开发 > 数据传输(DTS) > 数据同步

    3. 同步任务右侧,选择同步实例所属地域。

  2. 单击目标实例的ID。

  3. 可选:在左侧导航栏,单击任务管理

  4. 实例进展区域,单击增量写入模块。

  5. 基本信息页签中,单击迁移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;

常见问题

  • 如何理解同时包含库表结构和增量任务?

    若为同步实例,则表示同步类型同时勾选库表结构同步增量同步;若为迁移实例,则表示迁移类型同时勾选库表结构迁移增量迁移

  • 如何结束增量任务?

    结束、重置或释放实例均可以结束增量任务。更多信息,请参见结束DTS实例重置DTS实例释放DTS实例