【 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
命令会对表进行写锁定,可能会影响到正在进行的业务操作。因此,在执行该命令之前,请确保没有正在进行的重要业务操作,并在合适的时间窗口内执行。
kkpeter
(Upstream889)
4
借楼问下, 怎么让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 实例的一般步骤:
-
首先,使用 tidb-server
的 status
命令或者其他方式确认当前 TiDB 实例的状态。
-
停止 TiDB 实例。您可以使用 systemctl
命令(如果是使用 systemd)或者其他适用的命令来停止 TiDB 实例的运行。
-
等待一段时间,确保 TiDB 实例完全停止。
-
启动 TiDB 实例。使用相应的命令来启动 TiDB 实例,等待实例启动完成。
-
再次确认 TiDB 实例的状态,确保实例已经成功启动。
请注意,重启 TiDB 实例会导致服务中断,因此请在合适的时间段进行操作,并确保已经做好了相应的备份和容灾准备。
zhanggame1
(Ti D Ber G I13ecx U)
8
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 个赞
system
(system)
关闭
10
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。