开发者社区 问答 正文

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

数据传输服务提供的实时同步功能不能很好得兼容触发器。当同步对象为整个库且这个库中包含了会更新同步表内容的触发器,那么可能导致同步数据不一致。
例如同步库为jiangliu_trigger_test,这个库中存在了两个表parent, child。parent上有一个触发器,是指在insert一条数据到parent后,在child中插入一条数据。这种情况下,同步初始化会将这两个表及触发器迁移到目标实例,在同步过程中,如果源实例有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`)


parent上的触发器如下: CREATE DEFINER= `dts`@`%` trigger data_check after
insert on parent for each row begin
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如下: show triggers;
drop trigger data_check;


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

创建同步链路


当目标实例中的触发器删除掉之后,可以开始创建同步链路。
因为结构已经迁移过去了,所以同步初始化只选择全量数据初始化。
同步链路配置流程如下:
进入数据同步界面,点击右上角“创建同步作业” 购买同步链路。链路购买完成后,返回DTS控制台,点击链路右侧的 [backcolor=transparent]配置同步链路,开始链路配置。

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

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

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

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

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

  • 同步初始化。

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

  • 预检查。
    当预检查成功后即可启动同步任务。
    至此完成整个同步链路的配置。


  • 数据一致性校验


    1. 在源库的parent表中插入一条记录。 insert into parent values(1,'jiangliu');


    校验源跟目标的child表是否数据一致。
    在源及目标实例中分别查询child表的数据。 select * from child;

    源库及目标库结果如下:

    • 源库:

    • 目标库:

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

    展开
    收起
    云栖大讲堂 2017-10-31 14:08:18 1852 分享 版权
    0 条回答
    写回答
    取消 提交回答