【问题标题】:Adding a UNIQUE key to a large existing MySQL table which is receiving INSERTs/DELETEs向正在接收 INSERT/DELETE 的现有大型 MySQL 表添加 UNIQUE 键
【发布时间】:2019-11-21 11:49:45
【问题描述】:

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

考虑到我可能会使用 Percona pt-osc 工具并且表上有连续的删除/插入,执行此类更改的正确方法是什么?我的计划是:

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

我有什么遗漏吗?

【问题讨论】:

    标签: mysql unique-constraint percona


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多