Bernhard Hiller Ответов: 1

Неверное сообщение об ошибке: “дубликат записи '284093' для ключа 'PRIMARY'”


В базе данных MySQL (версия 5.7.18), MyISAM стол sensorhistory имеет колонку id типа int(11) с доплатой auto_increment.
Данные вставляются из приложения, написанного на языке C#. То INSERT конечно, запрос не записывает столбец id напрямую. Вот для чего нужен "auto_increment". Таблица содержит еще 30 полей: float и varchar типы, соотв., плюс а DateTime(3) Параметризованный запрос длинен, поэтому я опущу его здесь.
В настоящее время 4 машины пишут строку в таблицу каждые ~30 секунд.
Я получаю следующее сообщение об ошибке:
Duplicate entry '284093' for key 'PRIMARY'
   at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
   at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at DataStorage.SensorHistoryDatastore.StoreSensorHistory(IReadOnlyList'1 _reports, Boolean _canRetry) in C:\Users\bernhard.hiller\SVN\Product-SW\trunk\C_DataStorage\PhysicalContainers\SensorHistoryDatastore.cs:line 84


Что я уже пробовал:

Как ни странно, когда я выполняю SELECT max(id) FROM sensorhistory в MySQL Workbench, Я получаю максимальное значение 284092, то есть на 1 меньше, чем "дубликат записи" из 284093. Это доказательство того, что сообщение об ошибке неверно.

Один Analyze table в MySQL Workbench показали, что таблица повреждена: Found key at page 6585344 that points to record outside datafile
Его можно было починить с помощью простого Repair table sensorhistory

Ошибка повторилась всего через 1 день, та же таблица, то же сообщение об ошибке (только с новым значением).

Меня интересует, как могло произойти это искажение таблицы и как предотвратить его повторение.

1 Ответов

Рейтинг:
11

OriginalGriff

Начните с проверки журналов машины: она разбилась за последние несколько дней и перезапустилась? Какие-нибудь "гадости" от самого MySql или от дисковых шашек?

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


Bernhard Hiller

В обоих случаях произошел сбой машины, как видно из журнала событий Windows с идентификатором 6008: "предыдущее выключение системы было неожиданным". За 4 дня было 70 (!) таких аварий, и они закончились 11 сентября. Я не знаю, что было изменено на этой машине, наш администратор должен будет это выяснить.

OriginalGriff

70 за 4 дня! Оооо, черт возьми! Это совсем не хорошая новость.
Однако это объясняет ваши проблемы с коррупцией.

Bernhard Hiller

Последняя авария машины произошла 11 сентября в 5:06 утра. Никаких сбоев с тех пор, и никаких проблем с базой данных тоже. Какое совпадение! Вскрытие было бы неплохо, но у меня сложилось впечатление, что наш администратор предпочитает повторять это на сайте клиента (проблемы возникли на нашей тестовой системе в офисе): очевидно, сейчас она работает.

OriginalGriff

Похоже, кто - то убрал с сервера мошенническое приложение? :смеяться: