CDC 任务第一次启动,通常要先把表里已有的数据读出来,再持续消费 Binlog。产品页面上这件事常被简化成两个阶段:全量完成,切到增量。真正的一致性问题恰好藏在“切”这个字里。
全量扫描可能持续几个小时,这期间业务仍在 INSERT、UPDATE、DELETE。先扫表、扫完以后再记 Binlog 位点,会漏掉扫描期间的变化;先记位点、等全量全部写完再读 Binlog,又必须保证这段日志不会被清理,而且下游能正确处理快照记录与后续变更。
Debezium 1.6.0.Final 的 MySQL connector 给出了一个可读的实现:在短暂锁定期间建立 repeatable read 事务,记录 Binlog 位点和表结构,然后释放全局读锁,在同一一致性视图里继续扫描表。这个位点才是全量与增量的边界。