怎么获取tidb 集群的tso 用作cdc changefeed 的start-ts

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】
请问下各位老师,用ticdc 将tidb集群的数据同步到另外一个tidb 集群或者是kafaka ,启动changefeed 的时候需要start-ts,那么如何获取当前tidb集群的tso,作为start-ts呢,有什么命令嘛

如果是用当前TiDB备份搭建新的tidb集群有两种方式:

  1. dumpling + tidb-lightning方式:和mydumper类似在dumping的meta文件中,能找到备份时候的tso
  2. br backup + br restore方式:在br backup成功后,可以在标准输出中找到tso值

如果是只同步最新数据到新集群上,不管历史数据的话,可以用当前的timestamp(要毫秒级的)左移18位获得当前的tso值

MySQL []> select REPLACE(unix_timestamp(current_timestamp(3)),'.','') <<18 as current_tso;
+--------------------+
| current_tso        |
+--------------------+
| 438595539700809728 |
+--------------------+
1 row in set (0.000 sec)

在Grafana监控中的 PD页面中cluster类中,也可以看到当前的TSO信息
image

PS: 这个值是经过转换后的timestamp,并不是真实的TSO值,忽略吧

又找到一个获取tso的方式

MySQL [(none)]> begin;select @@tidb_current_ts;
Query OK, 0 rows affected (0.000 sec)

+--------------------+
| @@tidb_current_ts  |
+--------------------+
| 438595309234028545 |
+--------------------+
1 row in set (0.000 sec)

如果不是全量初始化的话,默认的start-ts 就是当前时间,不需要显示的指定

弱弱的问一句,是不是可以直接以时间的格式去指定,比如 :“2023-01-01 00:00:00” ?

tidb 有专门的时间转化成TSO的函数,tidb_parse_tso
https://docs.pingcap.com/zh/tidb/dev/tidb-functions#tidb_parse_tso

官网解释说是当前事务的tso,能用来做整个 就去那的tso吗

对的这个可以
1.如果是已经有数据的集群,通过备份工具备份的时候就会有tso
2.如果是没有数据的集群用cdc进行同步,不需要指定ts,从当前的start-ts 就可以同步

按照官方文档的说明,TSO就是一个时间戳,代表的其实是一个时间位点,如果是需要指定想从当前开始同步,那就无所谓是事务还是集群的TSO,选一个时间点就可以了,大于这个TSO的事务产生的变更都会被同步下去。(当然,正如上面回答的,其实针对你的场景,直接不指定start-ts就可以了)

TSO 指 Time Stamp Oracle,是 PD (Placement Driver) 为每个事务提供的单调递增的时间戳。

1 个赞

是的,感谢大佬回复

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。