缘起
若干年前,刚到一家3C类的电商公司做DBA,到公司没几天,公司的CEO和研发总监,说现在要做个事情:
把IDC的数据库的数据,要同步一份到仓库,因单量大,仓库经常爆仓,仓库网络不好时,可以直接用同步的数据
记得当时CEO还特意,弄个讲座讲了公司如何处理单量爆仓
第一次做DBA,第一个月只是有这个说法,没想到研发总监又说了一次,但是线上就一台数据库实例,领导连
线上数据库权限都没开给我,只是定时就把线上的慢SQL发给我来优化,因事情比较少,自己就查线上有没有同步数据的工具和方法。
自己尝试看看能否做一个数据同步工具。
方法
在查询资料过程中,发现一篇携程的BI部门的技术文档,介绍携程有用增加时间(row_createtime),修改时间(row_lastupdatetime),写入加默认时间
,修改更新最后一次时间,实现增量抽取数据,自己也加了这个携程技术同事QQ,问了一些关于增量抽取的问题,发现他们用的是SSIS来做增量抽取的。
最后得到信息: 增加2个时间字段,使用SSIS做同步数据
过程:
因为当时对SSIS不熟,花费了一些时间适应,特别是在SSIS写C#脚本,特别麻烦,自己边查资料边用,自己用visio还画图,要实现功能:
1,同步的2边数据库IP,账号,密码等配置到数据表
2,出错重抽
3,增量抽取
4,抽取日志记录,下次执行工具上次结果来执行
5,多个SSIS包,共用一个配置数据库和表
对接:
自己经过一个月的研究摸索,终于实现了以前的功能,但是如何在表里加这2个字段,几百张表,默认都没加。研发总监召集大家开会,决定批量增加这2个字段,
默认创建,修改时间都加getdate()时间,研发人员在程序里,有update的批量加上row_lastupdatetime=getdate(),我批量在数据库里加上这2个字段。
删除数据问题
处理完增加和修改时间问题,发现同步的表,有删除数据的情况,如何处理,源表已删除,同步系统,无法把目的库的删除数据删除,后面又让研发新加表时,加上
is_deleted字段,但已有表,如果加这个字段区分,程序逻辑,查询逻辑会大改,不和事宜。研发总监又召集大家开会,我在会上说,删除时,可以把删除的id记录到删除表里,
我同步时候,把这个删除id同步到目标库,通过id删除掉数据。
这个建议结果通过了,结论是领导说分给我一个同事,让我来主导这个事情, 建议变成自己的活。
但经过研发努力,涉及的同步表也不多,删除记录表也处理好了,最终这个从IDC同步到仓库的同步系统上线了。因同步到仓库的表不是很多,就10多个表。每个表一个SSIS包,
包部署到仓库服务器上。
运行故障
同步包运行了一段出现以下故障:
1,同步包同步资源报错故障
记得出故障,晚上回家的路上,回家后立即处理,当时的确没找到原因,没办法先解决问题,把同步包从仓库部署的,改成部署到线上库。结果不报错了,后来花了一周时间找到原因:
原来线上数据库限制运行最长时间,后来和领导沟通去掉后,再把包部署到仓库,实现拉模式抽取数据
2,事务太长,有些数据没同步过来
研发发现,有些数据漏抽,研究发现,有些事务运行时间比较长。没办法,把同步时间,从上次结束时间,开始往前提前30秒,多抽取一些,避免漏抽。
3,程序checksum检查
因同步到仓库作业,有订单主表,和明细表等,研发有时发现有偶尔数据不对,最后没办法,在订单明细表,把商品数量,金额等checksum后,和线上的数据做对比,对比正确用线下的数据,
不对的用线上数据,减少因同步数据导致订单出库异常
额外带来结果:
1, 该同步系统用起来,开出15个本地仓库在使用。
2,在开城市分站(北京,深圳等),用该同步系统从主库同步数据到新分站库(写了很多表同步包)
因开分站,为方便快速开出来,直接拷贝上海站的数据库弄个空库,再部署程序方式
3,当时腾讯电商收购后,做融合,写的php从主库同步数据,一开始他们坚持用同步字段:同步加1减1方式,在我的大力建议下,他们也改成通过修改时间来同步。
总结:
现在看来这个同步系统,很简陋,第一次做,没想到会有这么多问题需要解决,是对自己考验,但这个同步系统的确解决了公司快速开分仓,开分站的问题。
很有用的系统,觉得是一个比较有意义的创新。至今我还回忆深刻,也在我工作中给很大的激励和鼓舞,遇到难题想办法。