TiDB Bug List=

[Critical bug] 使用 restore 恢复带 auto random 字段的表, 可能导致数据修改错误

大家好,

我们新发现了一个TiDB 的“BR”组件相关 critical bug,详细见下:

产品 TiDB
组件 BR
版本 6.4.0 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 7.1.0 7.1.1 6.1.5 6.1.6 6.1.7 7.0.0 7.4.0 6.6.0 7.2.0 7.3.0 7.1.2 7.5.0 6.5.6 7.1.3 6.5.5 7.1.4 7.5.1 7.6.0 6.5.7 6.5.8 8.0.0
分类 Troubleshoot
标签 KnowIssue
来源

Issue

使用 br restore 恢复出来的集群上, 执行 insert on duplicate key update 语句, 可能会遇到错误的目标记录被修改的情况.

Root Cause

如果表的主键是一个包含 auto random id 在内的组合索引, 这个表在 br 恢复后的集群上, auto random id 字段不会被 rebase. 后续对这张表的 insert on duplicate key update 语句会因为生成的 id 与已经存在记录的 id 重复, 产生非预期的对老记录的更新, 导致数据出错.

Github Issue br doesn't rebase auto random if table's PKIsHandle is false · Issue #52255 · pingcap/tidb · GitHub 参看这个 issue 里面的复现的例子.

Diagnostic Steps

可以通过下面的方法来诊断这个问题的存在

  1. 检查集群中是否有表的主键是包含 auto random id 的组合索引,并且该表的数据是通过 BR restore 生成的。没有就跳过, 否则, 执行步骤 2

  2. 对包含 auto random id 字段的复合主键的表, 执行 show create table 语句, 观察输出结果 AUTO_RANDOM_BASE 的值是否正常

Resolution

该问题在最新的版本中已经修复,以下是受到该问题影响的 LTS 版本,可以考虑升级到 6.1.8, 6.5.9, 7.1.5, 7.5.2 及之后的版本以避免该问题。

  1. v6.1.5-v6.1.7

  2. v6.5.0-v6.5.8

  3. v7.1.0-v7.1.4

  4. v7.5.0-v7.5.1

Workaround

参照源集群, 使用 alter table auto_random_base 语句修复受影响的表

3 个赞