如何让Tidb server每个节点的缓存的自增id失效,从而重新申请?

【 TiDB 使用环境】生产环境
【 TiDB 版本】 v6.5.0
【复现路径】
从mysql表迁移一张表到tidb中,表 id字段 设置了AUTO_INCREMENT属性,历史数据导入时id是显示写入,后期正常业务产生的数据使用隐式写入,tidb自动分配自增id
【遇到的问题:问题现象及影响】
目前遇到的问题:
历史数据迁移后,业务数据正常写入一段时间后,出现主键冲突的错误

【期望解决的问题】
1、我手动执行这个sql,(该值远大于表里的最大id值)alter table t AUTO_INCREMENT=527854302; 是否可以让tidb server 缓存的自增id失效,从而重新按照我设置的起始id重新申请?

2、有没有方式可以手动控制tidb server 缓存的自增id ,修改或者清空 或者 失效?

可以使用 admin reset-auto-increment 命令来重置 TiDB Server 缓存的自增 ID。

首先,您需要连接到 TiDB 控制台或使用 TiDB 客户端工具,然后执行以下命令:

admin reset-auto-increment table_name

其中,table_name 是您要重置自增 ID 的表名。

执行该命令后,TiDB Server 会清空自增 ID 的缓存,并重新根据当前表中的最大 ID 值进行分配。这样可以避免主键冲突的错误,并按照您设置的起始 ID 重新申请自增 ID。

需要注意的是,执行 admin reset-auto-increment 命令会对表进行写锁定,可能会影响到正在进行的业务操作。因此,在执行该命令之前,请确保没有正在进行的重要业务操作,并在合适的时间窗口内执行。

:100: :100: :100:

借楼问下, 怎么让TiDB 清除 AUTO_RANDOM的缓存呢?

好的,非常感谢

通过测试发现,执行这个sql后,alter table test.person AUTO_ID_CACHE 0; tidbserver 的每个节点自动分配的id都会出现跳跃,跳跃间隔3万 是不是这个sql 也会使tidb sever 缓存的id清空,然后重新分配?

TiDB 不会主动清除 AUTO_RANDOM 的缓存,但是您可以通过重启 TiDB 实例来清除 AUTO_RANDOM 的缓存。

当您修改了表的 AUTO_RANDOM 属性或者执行了一些与 AUTO_RANDOM 相关的操作后,TiDB 会将 AUTO_RANDOM 的缓存存储在内存中。如果您希望清除这些缓存,可以通过重启 TiDB 实例来实现。

请注意,在重启 TiDB 实例之前,确保您已经备份了重要的数据,并且在重启期间不会有重要的业务操作。

以下是重启 TiDB 实例的一般步骤:

  1. 首先,使用 tidb-serverstatus 命令或者其他方式确认当前 TiDB 实例的状态。

  2. 停止 TiDB 实例。您可以使用 systemctl 命令(如果是使用 systemd)或者其他适用的命令来停止 TiDB 实例的运行。

  3. 等待一段时间,确保 TiDB 实例完全停止。

  4. 启动 TiDB 实例。使用相应的命令来启动 TiDB 实例,等待实例启动完成。

  5. 再次确认 TiDB 实例的状态,确保实例已经成功启动。

请注意,重启 TiDB 实例会导致服务中断,因此请在合适的时间段进行操作,并确保已经做好了相应的备份和容灾准备。

tidb server是每个默认缓存3万个自增id,只保证唯一不保证连续,如果要唯一连续,建表时候加上 AUTO_ID_CACHE=1 就和mysql一样了。
如果要修改自增id值,使用如ALTER TABLE z2 force AUTO_INCREMENT= 100;命令,不加force 大的id改小不会成功。
至于出现自增主键冲突不可能是tidb问题,那样是非常严重bug了,具体问题可以再看看

参考 AUTO_INCREMENT | PingCAP 文档中心

是的,执行 ALTER TABLE ... AUTO_ID_CACHE 0 语句会清空 TiDB Server 缓存的自增 ID,并重新分配自增 ID。

在 TiDB 中,自增 ID 的分配是通过缓存机制来提高性能的。默认情况下,TiDB 会将一定范围的自增 ID 缓存在内存中,以减少与存储引擎的交互次数。这个缓存的大小由 AUTO_ID_CACHE 参数控制,默认为 30000。

当您执行 ALTER TABLE ... AUTO_ID_CACHE 0 语句时,将 AUTO_ID_CACHE 设置为 0,TiDB 将不再缓存自增 ID,而是每次分配自增 ID 时都与存储引擎进行交互。这样做会导致自增 ID 的分配出现跳跃,间隔为 30000。

因此,如果您希望清空 TiDB Server 缓存的自增 ID 并重新分配,可以执行 ALTER TABLE ... AUTO_ID_CACHE 0 语句。

需要注意的是,执行这个语句会导致自增 ID 的分配变慢,因为每次分配都需要与存储引擎进行交互。在执行之前,请确保您已经备份了重要的数据,并在合适的时间段进行操作。

1 个赞

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