TiDB如何获取单位时间内的数据变化?

【 TiDB 使用环境】测试
【 TiDB 版本】v5.4.3
【复现路径】无
【遇到的问题:问题现象及影响】
目前考虑使用.NET做类似TiCDC的调度工具,进行数据同步,有开放接口或者表可以查到单位时间内的数据变化么?

之前的binlog ,可以采用文件的模式存放,可以通过其他的方式还原来查询

TiCDC,需要自己保存所有的变化信息了,然后在根据你的场景要求来做查询,但是要考虑到数据规模和增长速度… 有点小挑战

最简单的方案:

TICDC ---> kafka ----> kafka client consumer -> other tidb.... or doris,starRocks....

也可以考虑采用 flink 的链路来作 sink 服务,这样下游可以对接更多的服务

:sweat_smile:本意是服务器不够,想跳过TiCDC,省一台服务器~

那就通过 snapshot 来做咯,就是需要定个周期,但是没增量那么准确.

肯定没那么完美的

请展开来讲一讲~ :astonished:

每隔 1 分钟,或者 X 分钟,读取一下数据,用时间作为版本字段,然后保存起来。

但是这样的处理没办法解决 数据被 Delete 的状态… 只能通过补偿算法,来做判断和处理。

没TICDC 直接…

应该不需要这么麻烦,只需要读取到X分钟内数据是否变化即可,如果有变化,就增量同步,不需要知道变成了什么?我看有个闪回功能,不知道能不能用。


闪回(Flashback)是 TiDB 数据库提供的一种数据恢复功能,可以将数据库恢复到某个历史时间点的状态。闪回功能和 GC(Garbage Collection)有一定的关系。

在 TiDB 中,GC 是用来回收已经被删除的数据占用的存储空间的。GC 会定期扫描 TiKV 中的数据,将已经被删除的数据标记为“可以回收的”,然后在后续的 Compaction 过程中将这些数据真正地回收掉。GC 的过程是不可逆的,一旦数据被 GC 回收,就无法再恢复了。

而闪回功能则是用来恢复已经被删除的数据的。闪回功能可以将数据库恢复到某个历史时间点的状态,包括已经被删除的数据。因此,闪回功能可以用来恢复已经被 GC 回收的数据。

需要注意的是,闪回功能只能恢复已经被删除的数据,而不能恢复已经被修改的数据。因此,在使用闪回功能时,需要注意选择恢复的时间点,以免恢复到错误的状态。

总之,闪回功能和 GC 有一定的关系。GC 是用来回收已经被删除的数据占用的存储空间的,而闪回功能则是用来恢复已经被删除的数据的。闪回功能可以用来恢复已经被 GC 回收的数据,但不能恢复已经被修改的数据。

您可以使用 TiDB 的 SELECT ... AS OF TIMESTAMP 语句来获取一段时间内的有变化的数据。具体步骤如下:

  1. 首先,您需要在表上启用 TiDB 的闪回功能。您可以使用以下命令启用闪回功能:

    ALTER TABLE table_name ENABLE FLASHBACK;
    
  2. 然后,您可以使用以下语法来查询一段时间内的有变化的数据:

    SELECT * FROM table_name AS OF TIMESTAMP 'start_time' WHERE update_time >= 'start_time' AND update_time < 'end_time';
    

    其中,table_name 是您要查询的表名,start_timeend_time 是您要查询的时间范围,update_time 是您表中记录更新时间的列名。

    例如,如果您要查询 2021 年 5 月 1 日至 2021 年 5 月 31 日之间 table_name 表中有变化的数据,您可以使用以下语句:

    SELECT * FROM table_name AS OF TIMESTAMP '2021-05-01 00:00:00' WHERE update_time >= '2021-05-01 00:00:00' AND update_time < '2021-06-01 00:00:00';
    

    这将返回在该时间范围内更新过的所有行。

更多关于 TiDB 闪回功能的信息可以在 [1] 中找到,关于 SELECT ... AS OF TIMESTAMP 语句的详细信息可以在 [2] 中找到。

注意:闪回功能需要在 TiDB 集群中启用 TiDB Binlog,因此在使用闪回功能之前,请确保您的 TiDB 集群已经启用了 TiDB Binlog。

嗯,依赖于binlog,还是要加机器~ :upside_down_face:

:astonished:哈?这个Binlog是周边工具那个Binlog么?

我让同事试一下吧

5.X 支持得不太好,试试吧

我觉得加个update_time时间戳列就行,属性设为自动更新,然后你同步时候通过这个时间戳范围查找 update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTA

你这什么时候的文档,SELECT * FROM table_name AS OF TIMESTAMP 并不用ALTER TABLE table_name ENABLE FLASHBACK;这个步骤,直接就可以查,mvcc功能,和后面TiDB Binlog没啥关系啊

省不了这个。后患无穷

:joy:表太多,几乎所有表都要维护一遍,还涉及客户的升级~不敢想象

哦吼,是这样么?

如果没有物理删除的话,可以考虑用datax同步数据?
https://github.com/alibaba/DataX

目前主要是考虑集成到自己软件中,不通过第三方软件去管理调度。
其实也很好奇,这些软件是如何感知到数据变化的。