线上MySQl增量ETL由于源表没有last_modified_time(timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP),加起来比较有难度(online ddl虽然有工具,不过这些表是比较核心的表并且超过300GB);因此在从库启用了触发器,来记录PK以及对应的modified_time(记录事务的开始时间,这个验证可以简单通过load一个大文件来验证);这样做有几个缺陷:
1.如果主库的DML产生了row format binlog,那么是不会触发从库的trigger的
2.这些表的TPS接近double了
另外一种方式就是在从库添加last_modified_time column,不过即使有了这么一列抽取的数据就万无一失了吗?看如下序列:
事务T1:--23:59:59开启,同时插入一行记录,last_modified_time=23:59:59
ETL 00:00:00开始抽取,记做事务T2,此时T1未提交对T2不可见
事务T1于00:00:01提交;
那么该条记录对于ETL来说就丢失了;有什么好的解决方案呢?我现在能想到的就是Change Data Capature了(类似Oracle里的CDC,MySQL可以解析binlog来做);欢迎讨论
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298802,如需转载请自行联系原作者