虽然我正在使用REPLACE INTO

时间:2015-08-09 13:28:43

标签: mysql

每天晚上我们都在做

LOAD DATA LOCAL INFILE '$path' 
REPLACE INTO TABLE $table 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
($fields)

位于$ path中的文件中的记录将根据$ table中的键有一些重复记录,这就是我们进行REPLACE INTO而不是INSERT INTO的原因。

此策略多年来一直无故障地工作,直到昨晚发生了一些小问题,并且在日志中发现了以下错误:

mySQL错误发生:重复密钥记录在225811872,记录在88773156有罪查询:ALTER TABLE remp ENABLE KEYS。

如果重要的是,该表可能有史以来第一次增长到200米以上(14.9 GiB)。此外,该表被划分为~40个分区。

从此刻开始,相关表格中的任何进一步的SELECT语句都会产生:

mySQL错误发生:表'。/ azuondb / remp#P#p1'被标记为崩溃,最后(自动?)修复失败

一个简单的(手动!)REPAIR TABLE有帮助,但在我执行此操作之前,该表“正在使用”且无法访问,因此严重影响了我们提供的服务。

任何人都知道导致此错误的原因以及将来如何帮助防止此错误?

2 个答案:

答案 0 :(得分:1)

在同时执行多个操作时,MyISAM表会不时发生崩溃。在大多数情况下,简单的修复就可以解决问题,但是如果表继续这样做 - 你应该确定问题的根源是什么。

请参阅docs以及此similar question at dba

答案 1 :(得分:0)

您应该为该字段重复添加唯一约束。

这可以防止错误。您也可以使用UPDATE ON DUPLICATE。

唯一的事情是,如果在同一个表上插入和更新,db有时会锁定。