当我尝试使用压缩MySQL表时
alter table myTableName row_format=COMPRESSED;
我得到了错误
ERROR 1062 (23000): Duplicate entry '1123-7537-2020' for key 'duplicate_data'
我有一个索引"duplicate_data",用于在一行的3个字段相同时防止重复行。当我搜索此组合时,我无法在数据库中找到它,当我再次运行compress命令时,我收到另一个与其他数据有关的"Duplicate entry"错误。
我该如何解决这个问题?是否有办法搜索这种重复数据(实际上无论如何都应该通过索引来防止)
- 编辑**:找到此https://bugs.mysql.com/bug.php?id=104608后,我可以使用以下命令成功运行命令:
ROW_FORMAT=COMPRESSED, ALGORITHM=INPLACE, LOCK=SHARED
这就解释了为什么:
运行就地联机DDL操作时,运行ALTER TABLE语句的线程会应用其他连接线程对同一表并发运行的DML操作的联机日志。应用DML操作时,可能会遇到重复键输入错误(错误1062(23000):重复条目),即使重复条目仅是临时的并且将由在线日志中的稍后条目恢复。这类似于InnoDB中的外键约束检查的思想,其中约束必须在事务期间保持。
1条答案
按热度按时间llycmphe1#
您在错误日志中找到了发生这种情况的原因的解释。
可以通过强制ALTER TABLE阻塞来修复它:
但这将不允许并发DML,因此要做好准备,在ALTER完成之前,应用程序无法访问该表。
或者,您可以使用其他联机DDL解决方案,如pt-online-schema-change。由于所有DML更改都是通过触发器对原始表和复制表同步执行的,因此不存在关键字重复的问题。但是,在其他情况下,pt-osc可能会导致问题。
它只是证明了TANSTAAFL- * 没有免费的午餐这样的东西。* 在重构表的过程中,不受阻碍地使用表实际上是不可能的。