线上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--235959开启,同时插入一行记录,last_modified_time=23:59:59

ETL 00:00:00开始抽取,记做事务T2,此时T1未提交对T2不可见

事务T1000001提交;


那么该条记录对于ETL来说就丢失了;有什么好的解决方案呢?我现在能想到的就是Change Data Capature了(类似Oracle里的CDCMySQL可以解析binlog来做);欢迎讨论