MySQL错误1062(23000):尝试将ROW_FORMAT设置为Compressed时,键“duplicate_data”的条目“column 1-column 2”重复

1l5u6lss  于 2023-01-08  发布在  Mysql
关注(0)|答案(1)|浏览(131)

当我尝试使用压缩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"错误。
我该如何解决这个问题?是否有办法搜索这种重复数据(实际上无论如何都应该通过索引来防止)

ROW_FORMAT=COMPRESSED, ALGORITHM=INPLACE, LOCK=SHARED

这就解释了为什么:
运行就地联机DDL操作时,运行ALTER TABLE语句的线程会应用其他连接线程对同一表并发运行的DML操作的联机日志。应用DML操作时,可能会遇到重复键输入错误(错误1062(23000):重复条目),即使重复条目仅是临时的并且将由在线日志中的稍后条目恢复。这类似于InnoDB中的外键约束检查的思想,其中约束必须在事务期间保持。

llycmphe

llycmphe1#

您在错误日志中找到了发生这种情况的原因的解释。
可以通过强制ALTER TABLE阻塞来修复它:

ALTER TABLE myTableName ROW_FORMAT=COMPRESSED, ALGORITHM=COPY;

但这将不允许并发DML,因此要做好准备,在ALTER完成之前,应用程序无法访问该表。
或者,您可以使用其他联机DDL解决方案,如pt-online-schema-change。由于所有DML更改都是通过触发器对原始表和复制表同步执行的,因此不存在关键字重复的问题。但是,在其他情况下,pt-osc可能会导致问题。
它只是证明了TANSTAAFL- * 没有免费的午餐这样的东西。* 在重构表的过程中,不受阻碍地使用表实际上是不可能的。

相关问题