BR还原数据库后auto_increment被重置

【 TiDB 使用环境】生产环境
【 TiDB 版本】V5.4.3
【复现路径】

  1. 误删数据库比如 : goods 数据库
  2. 禁用 tikv gc : SET GLOBAL tidb_gc_enable = OFF;
  3. 设置快照时间点 : set @@tidb_snapshot=“xxxx-xx-xx xx:xx:xx”;
  4. 发现被误删的 goods数据库还在
  5. 使用br 工具进行备份,备份的时候指定 --backupts 为 快照 ts
  6. 备份成功后将备份的 goods库恢复到生产环境
  7. 清理快照时间点 : set @@tidb_snapshot=“”;
  8. 开启 tikv gc : SET GLOBAL tidb_gc_enable = ON;
    【遇到的问题:问题现象及影响】
    数据库恢复以后,业务开始写入数据,此时有主键冲突,发现 auto_increment 的值从1开始了。
    由于当时情况紧急,使用 ALTER TABLE table_name AUTO_INCREMENT =xxx 解决了。
    我的问题是:
  9. br还原后,为什么 auto_increment 会从1 开始?
  10. 因为库中的表特别多, ALTER TABLE table_name AUTO_INCREMENT =xxx 虽然可以解决,但是太麻烦,有没有简单的办法解决这个问题? 平滑重启 tidb server 是否能让 tidb 根据表的max ID,重启分配ID段,来解决这个问题

新版本应该没这个问题

您说的新版本 是6.0 还是 7.0版本?

升级版本试试

元数据不一致导致的吧。不一定是版本的问题。

建议可以升级试下

以前真没遇到过

正常不应该有这个问题吧,表结构里面自带的有AUTO_INCREMENT字段啊。。。

这个咋会重置呢

auto_increment不是缓存在每个tidb,不会持久化的吗?那br恢复的时候会对这个做处理吗?

理论上不需要持久化,tidb启动时候再分一段就行,有些自增值虽然没用但也被抛弃了不用了

升级到6.5.9吧,我理解重启应该也不能解决这个问题,应该是没有正常重置成功。重启只是把现有的缓存清了,加大的不一定符合。

建议升级新一点的版本没啥问题

新版本应该没这个问题

请升级吧,可能是遇到bug了,Duplicate entry when using BR to restore a NONCLUSTERED AUTO_ID_CACHE=1 table · Issue #46093 · pingcap/tidb · GitHub

应该是有几个类似的 bug 需要注意:
一个是楼上提到的这个 Duplicate entry when using BR to restore a NONCLUSTERED AUTO_ID_CACHE=1 table · Issue #46093 · pingcap/tidb · GitHub

  • nonclustered 表的话会有一个 auto increment 的隐藏列 _tidb_rowid,当 nonclustered 表同时存在auto_id_cache=1 的 auto increment 列的情况下,lightning/br 导入后,会丢失 _tidb_rowid 的一部分metadata(auto_increment的具体值)。
  • 经过 lighting/br 导入后,表中用户定义的自增列和 _tidb_rowid 的 metadata 混在一起,造成两个在show table 里观察到的值都不正确。同时因为 metadata 不正确,所以无法正确发号,会造成 duplicate entry 的 error。

还有一个是 DDL lost history jobs after batch creating tables · Issue #43725 · pingcap/tidb · GitHub

  • 当 BR restore 执行 batch create table 遇到 “entry too large, split batch create table” 报错时导致部分表创建失败,后续 BR 在 split batch 重试 batch create table 时发现这些表已经存在就直接返回错误了,不会走到后续更新 auto id 的逻辑,最后重新分配 auto id 会出现主键冲突的现象。
  • TiDB 日志中出现执行 “create tables” 时报 ErrEntryTooLarge 错误。检查 admin show ddl jobs,某个建表 DDL job 被 cancel,但实际上执行成功(比如能通过 show create table 获取到表信息)。

升级是比较好的处理方式,不然 workaround 可能就是 alter table auto_increment = x 手动重置 auto id

1 个赞

涨知识了