全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
数据传输服务DTS

触发器存在情况下如何配置同步作业

更新时间:2017-06-07 13:26:11

数据传输服务提供的实时同步功能不能很好得兼容触发器。当同步对象为整个库且这个库中包含了会更新同步表内容的触发器,那么可能导致同步数据不一致。

例如同步库为jiangliu_trigger_test,这个库中存在了两个表parent, child。parent上有一个触发器,是指在insert一条数据到parent后,在child中插入一条数据。这种情况下,同步初始化会将这两个表及触发器迁移到目标实例,在同步过程中,如果源实例有parent上的insert操作,就会导致child表在源实例跟目标实例数据不一致。

假设表parent定义如下:

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

child 定义如下:

  1. CREATE TABLE `child` (
  2. `sys_child_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `user_vs_id` int(11) DEFAULT NULL,
  4. `name` varchar(30) DEFAULT NULL,
  5. PRIMARY KEY (`sys_child_id`)

parent上的触发器如下:

  1. CREATE DEFINER= `dts`@`%` trigger data_check after
  2. insert on parent for each row begin
  3. insert into child(user_vs_id, name) values(new.user_vs_id, new.name) ;end

为了解决这个问题,只能将目标实例中的触发器data_check删除掉。child表的数据由源实例同步过去。本小节简单介绍如果存在这种触发器的情况下,如何配置同步链路能够避免数据不一致问题。

下面简单介绍在这种触发器存在情况下,同步链路的配置步骤。

结构迁移

首先在数据传输服务控制台,创建一个只进行结构迁移的迁移任务,将需要同步对象的结构对象都迁移到目标库。具体步骤如下:

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

    登录数据传输DTS控制台,点击右上角“创建在线迁移任务” 创建结构迁移任务。

  2. 实例连接信息配置。

    在这个步骤中,主要配置迁移任务名称,迁移源实例及目标实例连接信息。其中:

    源实例类型选择RDS实例,目标实例类型选择RDS实例。

  3. 迁移类型及迁移对象选择。

    在这个步骤中迁移类型只能选择结构迁移,不能选择全量数据迁移及增量数据迁移。因为我们只是为了将结构迁移到目标RDS实例中。

    迁移类型选择

  4. 预检查。

    当预检查完成后,启动迁移任务,开始结构对象的迁移。

删除目标实例的触发器

当结构迁移完成后,到目标RDS实例上,将结构迁移任务迁移过来的触发器手动删除掉,执行SQL如下:

  1. show triggers;
  2. drop trigger data_check;

其中data_check 为需要删除的触发器。

创建同步链路

当目标实例中的触发器删除掉之后,可以开始创建同步链路。

因为结构已经迁移过去了,所以同步初始化只选择全量数据初始化。

同步链路配置流程如下:

进入数据同步界面,点击右上角“创建同步作业” 购买同步链路。链路购买完成后,返回DTS控制台,点击链路右侧的 配置同步链路,开始链路配置。

  1. 配置实例信息。

    在这个步骤中,主要配置迁移任务名称,迁移源实例及目标实例连接信息。其中:

    • 任务名称

      默认情况下,DTS为每个任务自动生成一个任务名称。任务名称没有唯一性要求,您可以修改这个名称,为任务配置一个具有业务意义的名称,便于后续的任务识别。

    • 源实例连接信息

      • 实例类型:选择 RDS实例
      • RDS实例ID:配置RDS实例的实例ID
      • 数据库账号:RDS实例访问账号
      • 数据库密码:上面RDS访问账号对应的密码
    • 目标实例连接信息

      • 实例类型:选择 RDS实例
      • RDS实例ID:配置RDS实例的实例ID
      • 数据库账号:RDS实例访问账号
      • 数据库密码:上面RDS访问账号对应的密码
  2. 选择同步对象。

    这一步选择同步对象,这里选择的同步对象同上面结构迁移的对象一定要一致。

  3. 同步初始化。

    同步初始化配置

    注意,这里面同步初始化只勾选全量数据初始化,不进行结构初始化,因为上面的结构迁移已经将同步对象的结构定义迁移到目标RDS实例了。

  4. 预检查。

    当预检查成功后即可启动同步任务。

    至此完成整个同步链路的配置。

数据一致性校验

  1. 在源库的parent表中插入一条记录。

    1. insert into parent values(1,'jiangliu');
  2. 校验源跟目标的child表是否数据一致。

    在源及目标实例中分别查询child表的数据。

    1. select * from child;

    源库及目标库结果如下:

    • 源库:

      源库

    • 目标库:

      目的库

      由此可见,同步数据一致。

本文导读目录