源库存在触发器时如何配置同步或迁移作业

当您同步实例的对象为整库,且该数据库中包含了会更新库内某个表的触发器(Trigger)时,可能会导致源库和目标库的数据不一致。本文介绍源库存在触发器的情况下如何正确地配置同步作业,以确保数据的一致性和完整性。

背景信息

若同步或迁移实例的源库包含触发器且实例满足以下条件,请参考相关文档同步或迁移触发器,以确保源库和目标库的数据一致性。其他包含触发器的同步或迁移实例,请参考本文进行操作。

源库

目标库

说明

相关文档

无限制

PostgreSQL、PolarDB PostgreSQL版PolarDB PostgreSQL版(兼容Oracle)

  • 若实例使用的目标库账号有足够的权限(高权限账号或者super权限账号),触发器同步或迁移到目标库后,DTS会以Session级别自动禁用该触发器。

  • 若实例使用的目标库账号权限不足,您需要确保在实例运行期间目标数据库中session_replication_role的参数值为replica

MySQL、PolarDB MySQL版、MariaDB

MySQL、PolarDB MySQL版、MariaDB

支持手动配置同步或迁移触发器的方式。

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

SQL Server

SQL Server

实现流程

  1. 创建源库到目标数据库的迁移实例

    相关配置文档,请参见迁移方案概览

    重要
    • 迁移类型只需勾选库表结构迁移

    • 源库对象中选择的粒度为数据库或Schema。

  2. 登录目标数据库,删除从源数据库迁移过来的触发器。

  3. 创建源库到目标数据库的同步或迁移实例。

    相关配置文档,请参见同步方案概览迁移方案概览

    重要
    • 同步实例:同步类型默认已勾选增量同步,您只需勾选全量同步,请勿勾选库表结构同步

    • 迁移实例:迁移类型勾选全量迁移增量迁移,请勿勾选库表结构迁移

  4. (可选)数据传输完成后,结束或释放实例。

    操作文档,请参见结束DTS实例释放DTS实例

    说明

    实例结束或释放后,请根据业务需求手动在目标库中添加触发器。

案例介绍

说明

本操作以自建MySQL同步至RDS MySQL为例介绍配置流程。

数据准备

MySQL数据库triggertestdata中存在了两个表:parent和child。其中,表parent中有一个触发器(定义:当INSERT一条数据到表parent之后,将其INSERT写入的数据写入一份至表child中)。

说明

表结构及触发器定义如下表所示。

对象类型

名称

结构语句

parent

CREATE TABLE `parent` (
  `user_vs_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`user_vs_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8

child

CREATE TABLE `child` (
  `sys_child_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_vs_id` int(11) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`sys_child_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8

触发器

data_check

CREATE TRIGGER data_check
AFTER INSERT ON parent
FOR EACH ROW
insert into child(user_vs_id, name) values(new.user_vs_id, new.name) ;

在此案例中,如果在数据同步时,在源库的表parent中执行了INSERT操作,将导致源和目标库中的表child数据不一致。为解决该问题,需要删除被迁移到目标库中的触发器。

操作步骤

  1. 创建一个数据迁移实例,将源库的结构迁移至目标库。

    1. 进入迁移任务的列表页面。

      1. 登录DMS数据管理服务

      2. 在顶部菜单栏中,单击集成与开发

      3. 在左侧导航栏,选择数据传输(DTS) > 数据迁移

      说明
    2. 迁移任务右侧,选择迁移实例所属地域。

      说明

      新版DTS迁移任务列表页面,需要在页面左上角选择迁移实例所属地域。

    3. 单击创建任务,进入任务配置页面。

    4. 配置源库信息目标库信息后,单击页面下方的测试连接以进行下一步

      参数说明等信息,请参见自建MySQL迁移至RDS MySQL

    5. 迁移类型选择为库表结构迁移,然后选择待迁移的数据库或Schema。

      image

    6. 根据业务需求,完成后续配置。

  2. 由于执行结构迁移时,触发器也会被迁移至目标库中。当迁移实例完成后,您需要登录目标数据库,执行如下命令删除被迁移过去的触发器。

    drop trigger <触发器名称>;

    示例:

    drop trigger data_check;
  3. 创建数据同步实例,将源库的数据同步至目标库中。

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

    2. 配置源库信息目标库信息后,单击页面下方的测试连接以进行下一步

      参数说明等信息,请参见自建MySQL同步至RDS MySQL

      说明

      同步实例配置的源库和目标库需与步骤1保持一致。

    3. 同步类型手动勾选全量同步

      说明
      • 同步对象需和步骤1中配置的迁移对象保持一致。

      • 同步类型默认已勾选增量同步,请勿勾选库表结构同步

      image

    4. 根据业务需求,完成后续配置。

数据一致性测试

  1. 登录源数据库,在表parent中插入一条记录。

    insert into parent values(1,'testname');

    执行该操作后,由于源库触发器的缘故,该条记录也会被写入至源库的child表中。

  2. 登录源和目标数据库,查询表child的数据,比对其数据是否一致。

    • 源库查询结果

      +--------------+------------+----------+
      | sys_child_id | user_vs_id | name     |
      +--------------+------------+----------+
      |         2001 |          1 | testname |
      +--------------+------------+----------+
    • 目标库查询结果

      +--------------+------------+----------+
      | sys_child_id | user_vs_id | name     |
      +--------------+------------+----------+
      |         2001 |          1 | testname |
      +--------------+------------+----------+

    经比对,数据一致。

后续操作

  1. 在数据同步需求完成后,结束步骤3创建的同步实例。

    更多信息,请参见结束DTS实例

  2. (可选)查看触发器的创建语法。

    1. 找到步骤1创建的迁移实例。

    2. 单击目标实例的ID。

    3. 任务管理页面,单击结构迁移2模块。

    4. 任务详情页签,单击查看创建语法

  3. 登录目标数据库,手动添加触发器。