每天晚上我们都在做
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有帮助,但在我执行此操作之前,该表“正在使用”且无法访问,因此严重影响了我们提供的服务。
任何人都知道导致此错误的原因以及将来如何帮助防止此错误?
答案 0 :(得分:1)
在同时执行多个操作时,MyISAM表会不时发生崩溃。在大多数情况下,简单的修复就可以解决问题,但是如果表继续这样做 - 你应该确定问题的根源是什么。
请参阅docs以及此similar question at dba。
答案 1 :(得分:0)
您应该为该字段重复添加唯一约束。
这可以防止错误。您也可以使用UPDATE ON DUPLICATE。
唯一的事情是,如果在同一个表上插入和更新,db有时会锁定。