将UNIQUE键添加到正在接收INSERT / DELETE的大型现有MySQL表中

时间:2019-07-11 17:35:55

标签: mysql unique-constraint percona

我有一个非常大的表(数十亿行),并且需要将UNIQUE索引添加到该表的列中。对于一个事实,我知道该表确实包含该键上的重复值,我需要清理(通过删除行/将列的值重置为可以自动生成的唯一值)。一个优点是,已经重复的行不再被修改。

鉴于我可能将使用Percona pt-osc工具并且表上存在连续的删除/插入操作,执行这样的更改的正确方法是什么?我的计划是:

  • 添加代码,以确保不再插入任何重复的ID。可能我需要为此临时添加一个单独的表,因为我希望数据库为我而不是应用程序强制执行此操作-因此将具有唯一索引的事务中的“影子表”插入到我的主表中,回滚所有尝试插入重复值的插入
  • 通过转换$current_pkey_value以下主键范围内的所有无效列值来回填表格
  • 然后添加索引并使用pt-osc切换表

有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

这是我们决定解决它的方式。

由于我们使用pt-online-schema-change,因此我们使用触发器来执行从现有表到临时表的同步。该工具为此实际上有一个特殊的配置密钥--no-check-unique-key-change,它将完全满足我们的需要-同意执行ALTER TABLE并设置触发器,以使发生冲突时,INSERT .. IGNORE将被应用,并且在同步过程中,使用现在唯一值的第一行将在插入中获胜。对我们来说,这是一个很好的权衡,因为我们看到的所有重复项都是由于数据争夺而不是价值生成过程中的实际冲突而产生的。

我不能说通过这种方式投票很高兴。我怀疑所有拒绝投票的人都会在第一次迭代时就设计出完美的音调表(并且神奇地仅在表设计从一开始就在所有正确的位置具有唯一索引的项目中工作)。