liuxinwang / go-mysql-starrocks

mysql to starrocks|doris sync
GNU General Public License v2.0
24 stars 7 forks source link

能否实现mysql日志根据点位或者时间进行回溯 #2

Closed 603183892 closed 1 year ago

603183892 commented 1 year ago

你好,使用了下应用非常方便,提一点建议 能否实现mysql binlog 根据点位或者时间进行回溯 因为在发布或者变更改应用的时候会出现数据遗漏的情况

liuxinwang commented 1 year ago

能否详细描述下你的需求,发布或者变更应用为什么会数据遗漏?

603183892 commented 1 year ago

需求描述: 场景:mysql源端增加了新表需要在您开发应用中修改toml进行添加,在添加的时候如果生成不停止的话新表数据时无法及时写入。如果修改toml文件后,重新启动应用的话在不停生成的情况会造成其他表数据遗漏 期望:可在配置文件中增加,启动时可以配置binlog的点位或者更友好的方式根据时间读取mysql binlog 点位将重启应用造成的部分数据没有同步回溯到停止应用的时间。

不知道我的需求是否说明白了 还有一个可能就是您开发的应用所在的服务器重启了,重启后生产上面的部分数据或丢失无法及时同步

liuxinwang commented 1 year ago

重启go-mysql-starrocks不会导致数据遗漏,因为有一个_${name}-pos.info同步点位记录文件,用于记录当前已经同步的gtid值。 重启应用还是服务器,只需再次启动go-mysql-starrocks即可,其会从点位记录文件中找到gitd值接续同步(如果binlog还存在的话)

603183892 commented 1 year ago

嗯,我这边做了两个验证, 1、在mysql表中增加了一个字段,并修改里面的内容,没有及时在starrocks中添加,在starrocks添加之后这个值我想通过回溯的方式将值写入到starrocks。 2、在mysql中增加一个表,没有停生产,后面调整go-mysql-starrocks 配置,增加新表,在重启,后发现表中有些数据比生产中少也想通过回溯点位的方式将数据在重新推送下

liuxinwang commented 1 year ago
  1. 第一个问题是存在的,因为新增字段在starrocks中是后建立的,该字段的历史数据不会同步。
  2. 对于增加表的情况,重新配置go-mysql-starrocks并重启,如果在重启前新表已经写入的数据不会同步,重启后新的数据可以同步到starrocks中。
  3. 对于重启go-mysql-starrocks已经配置的同步表(非新增表配置)的数据不会遗留;你是有遇到遗漏的情况吗?可以提供下示例

对于1 和 2,目前可以通过修复点位记录文件的gtid值(修改前先停止go-mysql-starrocks),修改为更早时间的gtid值(gtid值需要解析binlog,不是很方便获取)

603183892 commented 1 year ago

3 没有发现这个问题,主要还是1、2中的问题。我是提一个建议,如果能让用户自己录入时间,或者点位,这样在生产上面运行的话就比较放心。希望能在后期版本迭代中进行增加。go语言不是很擅长提供不了代码支持。只能在使用方面提供下需求。感谢回复

liuxinwang commented 1 year ago

考虑增加一个start-gtid参数,指定初次监听开始的gtid点位;注意:当_xxx-pos.info点位文件内容存在时,此选项不生效

liuxinwang commented 1 year ago

v0.1.9

603183892 commented 1 year ago

感谢!!!