数据传输服务提供的实时同步功能不能很好得兼容触发器。当同步对象为整个库且这个库中包含了会更新同步表内容的触发器,那么可能导致同步数据不一致。
例如同步库为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表的数据由源实例同步过去。本小节简单介绍如果存在这种触发器的情况下,如何配置同步链路能够避免数据不一致问题。
下面简单介绍在这种触发器存在情况下,同步链路的配置步骤。
结构迁移
首先在数据传输服务控制台,创建一个只进行结构迁移的迁移任务,将需要同步对象的结构对象都迁移到目标库。具体步骤如下:
show triggers;
drop trigger data_check;
select * from child;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。