2015-08-09 3 views
0

Каждую ночь мы делаемДубликат ошибка записи, хотя я использую REPLACE INTO

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

записей в файле, расположенном в $ пути будет иметь некоторые повторяющиеся записи в соответствии с ключом в $ таблице, и именно поэтому мы делают REPLACE INTO, а не INSERT INTO.

Эта стратегия работает errorlessly в течение многих лет, пока вчера вечером что-то не икнул, и следующее сообщение об ошибке можно было найти в журналах:

MYSQL ошибка: ключ Дублировать для записи на 225811872 с записью на 88773156 Guilty запроса : ALTER TABLE remp ENABLE KEYS.

Если это имеет значение, таблица, вероятно, выросла до 200 м строк (из 14,9 ГБ) в первый раз. Кроме того, таблица разделена на ~ 40 разделов.

С этого момента, любым дальнейшего ЗЕЬЕСТОМ на столе в вопросе привел: произошла

MYSQL ошибки: Таблица»./azuondb/remp#P#p1' помечен как поврежденные и последние (автомат?) ремонт не удался

Простой (ручной!) REPAIR TABLE помог, но пока я не выполнил это, таблица была «использована» и недоступна, что серьезно влияет на предоставляемые нами услуги.

У кого-нибудь есть идея, что вызвало эту ошибку и как ее предотвратить в будущем?

ответ

1

Время от времени в таблицу MyISAM приходится сталкиваться при сбое при выполнении нескольких операций одновременно. В большинстве случаев простой ремонт будет делать трюк, но если таблица продолжает делать это - вы должны определить, что является источником проблемы.

Обратитесь к docs, а также к этому similar question at dba.

0

Вы должны добавить уникальное ограничение для этого поля, которое дублирует.

Это должно предотвратить ошибку. Вы также можете использовать UPDATE ON DUPLICATE.

Единственное, что иногда может блокировать db, если вы вставляете и обновляете в той же таблице.

Смежные вопросы