290
阿里云
触发器存在情况下如何配置同步作业__最佳实践_数据传输-阿里云
数据传输服务提供的实时同步功能不能很好得兼容触发器。当同步对象为整个库且这个库中包含了会更新同步表内容的触发器,那么可能导致同步数据不一致。
例如同步库为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表的数据由源实例同步过去。本小节简单介绍如果存在这种触发器的情况下,如何配置同步链路能够避免数据不一致问题。
下面简单介绍在这种触发器存在情况下,同步链路的配置步骤。
结构迁移
首先在数据传输服务控制台,创建一个只进行结构迁移的迁移任务,将需要同步对象的结构对象都迁移到目标库。具体步骤如下:
登录数据传输DTS控制台。
登录数据传输DTS控制台,点击右上角“创建在线迁移任务” 创建结构迁移任务。
实例连接信息配置。
在这个步骤中,主要配置迁移任务名称,迁移源实例及目标实例连接信息。其中:
源实例类型选择RDS实例,目标实例类型选择RDS实例。
迁移类型及迁移对象选择。
在这个步骤中迁移类型只能选择结构迁移,不能选择全量数据迁移及增量数据迁移。因为我们只是为了将结构迁移到目标RDS实例中。
预检查。
当预检查完成后,启动迁移任务,开始结构对象的迁移。
删除目标实例的触发器
当结构迁移完成后,到目标RDS实例上,将结构迁移任务迁移过来的触发器手动删除掉,执行SQL如下:
show triggers;
drop trigger data_check;
其中data_check 为需要删除的触发器。
创建同步链路
当目标实例中的触发器删除掉之后,可以开始创建同步链路。
因为结构已经迁移过去了,所以同步初始化只选择全量数据初始化。
同步链路配置流程如下:
进入数据同步界面,点击右上角“创建同步作业” 购买同步链路。链路购买完成后,返回DTS控制台,点击链路右侧的 配置同步链路,开始链路配置。
配置实例信息。
在这个步骤中,主要配置迁移任务名称,迁移源实例及目标实例连接信息。其中:
任务名称
默认情况下,DTS为每个任务自动生成一个任务名称。任务名称没有唯一性要求,您可以修改这个名称,为任务配置一个具有业务意义的名称,便于后续的任务识别。
源实例连接信息
- 实例类型:选择 RDS实例
- RDS实例ID:配置RDS实例的实例ID
- 数据库账号:RDS实例访问账号
- 数据库密码:上面RDS访问账号对应的密码
目标实例连接信息
- 实例类型:选择 RDS实例
- RDS实例ID:配置RDS实例的实例ID
- 数据库账号:RDS实例访问账号
- 数据库密码:上面RDS访问账号对应的密码
选择同步对象。
这一步选择同步对象,这里选择的同步对象同上面结构迁移的对象一定要一致。
同步初始化。
注意,这里面同步初始化只勾选全量数据初始化,不进行结构初始化,因为上面的结构迁移已经将同步对象的结构定义迁移到目标RDS实例了。
预检查。
当预检查成功后即可启动同步任务。
至此完成整个同步链路的配置。
数据一致性校验
在源库的parent表中插入一条记录。
insert into parent values(1,'jiangliu');
校验源跟目标的child表是否数据一致。
在源及目标实例中分别查询child表的数据。
select * from child;
源库及目标库结果如下:
源库:
目标库:
由此可见,同步数据一致。
最后更新:2016-11-23 16:03:55
上一篇:
公共云与金融云间的数据迁移__最佳实践_数据传输-阿里云
下一篇:
数据订阅SDK容灾__最佳实践_数据传输-阿里云
忘记密码怎么办,如何找回密码__账号登录_会员帐号及密码_会员账号&实名认证-阿里云
释放RDS实例__实例管理_API 参考_云数据库 RDS 版-阿里云
云服务器 ECS 有两种计费模式
创建自定义授权策略__快速入门_访问控制-阿里云
PutBucketLogging__关于Bucket的操作_API 参考_对象存储 OSS-阿里云
态势感知9月功能更新__产品升级更新_态势感知-阿里云
业务数据分析__快速开始_移动数据分析-阿里云
简单深度学习离线训练__应用场景_产品简介_高性能计算-阿里云
查询流控记录__JAVA SDK_SDK 手册_CDN-阿里云
LogHub数据源__准备数据源_用户指南_业务实时监控服务 ARMS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云