目录
系统的新旧数据需要同步,但两个系统表结构差异较大,因此决定选用StreamSet完成数据的同步,也即SqlServer和MySql的同步。
SqlServer的CDC和CT区别
StreamSets提供了CDC和Change Tracking两种凡是捕获SqlServer的数据更改,其中CDC侧重于副本复制,Change Tracking(CT) 应该是精简版,仅支持数字主键的表监控,并且不支持复合主键。
-
如果应用程序需要有关所有所做更改的信息以及所更改数据的中间值,则可能适合使用CDC,而不适合使用CT。
-
CDC使用异步进程捕获,此进程读取事务日志;CT是与DML操作同步的,不需要读取事务日志;
-
CDC包含了变更的历史记录,CT只保存行,但不会捕获更改的数据;
上述说的CT按数字主键监视,其实是StreamSets的限制。因此,基于此,只能选择CDC完成我们的新旧系统数据同步了…
SqlServer的CDC配置
这个我就不抄了,大家百度下,有狠多例子,主要是采用 存储过程 EXEC sys.sp_cdc_enable_table完成表的配置,然后启动Sql代理客户端。
配置同步流程
StreamSets下配置同步流程还是非常方便的,主要的麻烦在于新旧系统并不是一对一的表关系,整理业务流程是比较麻烦的。
小坑1:主子表外键关联
有外键关联,肯定需要先插主表,再插子表。而在实际演练中,发现主子表的执行在源上是有顺序的,单在StreamSets上丢失了次序,导致子表插入失败。
这里采用 主子表分离到不通pipeline内,子表同步时加入延迟,即可解决该问题。
2S延迟,搞定该坑。
小坑2: 同步主表,自动生成多张子表
是时候请出超级飞侠了——【处理组件:JDBC Tee了】,
创建主表后再连接Tee 创建子表即可。
小结
使用StreamSets来同步,估计相比程序或者触发器,写的并不怎么快,唯一的优势就是调试和修改非常方便。毕竟有那么多的字段,根本说不清用或是不用,但数据只要一同步过去,总是能很快发现有问题,需要修正~~~,当然时间允许的话,还是写程序吧,毕竟谁让你是程序员了!