Mydumper到tidb的数据,进行操作报主键冲突

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:2.1.10
  • 【问题描述】:使用Mydumper从mysql向tidb导入一百八十万带主键的数据,在同一个事务中修改一条数据,以及新增一条数据(此新增数据的id不进行指定,按照主键自增长),会出现主键冲突,考虑到tidb_server会缓存自增ID,试着直接插入当前数据,无异常

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. 请上传表结构
  2. 请问具体事务是什么?
  3. 上传几条数据,我们测试一下,多谢。

表结构数据.txt (3.3 KB) 这个是表机构,以及事务和参考数据

这个是我们导入一定数据量出现的,在少量数据测试中没有发现此问题

上述问题我们的解决方案是将数据不指定id重新导入,使用tidb自增id生成,就没有问题了,是否有参数可以控制tidb_server缓存的id进行刷新

你好,

目前不支持,可以看下 tidb 在自增 id 方面的描述

https://pingcap.com/docs-cn/v3.0/reference/mysql-compatibility/#自增-id

如果按照这样指定tidb_server的情况会出现主键冲突,如果是proxy 采取加权轮询的方式,应该是会出现有时候能insert 成功 有时候insert 失败的情况吧

你好,

上面的测试只是为了说明在何种情况可能出现主键冲突,如果使用的 proxy 仅为负载均衡,并且不手动输入 primary key,否则极少情况出现主键冲突。

现在有个问题就是,我导入的这一百八十万(会指定primary key ),如果只是一个事务单独进行insert,5000条测试成功率是百分之百,如果是一个事务中包含一条修改和一条不指定 primary key的insert,主键冲突率也是百分之百。

你好,可以将操作表的 auto_increment 设置大一点,超过导入的 180w 的数据,是否可行。

昨天解决生产问题,我们重新导入了这张表,使用的方式是没有指定 主键,应该是把tidb_server的id缓存刷过了,测试原来有问题的表也没问题了

设置的话可以跳过,假如设置100,tidb_server会缓存30000个id ,这个时候下次id就是 30001,设置1000000,下次id就是1000000,这个时候没有根据前面的id数自增啊,这是啥机制

你好,

如果是使用上TiDB 中,自增列只保证自增且唯一,并不保证连续分配。

可以看下 git autoincrement 对该机制的说明。是否对你有帮助。 https://github.com/pingcap/tidb/blob/26e946d25ee27a4272b495854494ade764627f80/meta/autoid/autoid.go#L434