Дубликаты первичных ключей в таблице MySQL

в 10:27, , рубрики: mysql, Песочница, репликация базы данных, метки: ,

Впервые столкнулся во время разработки с такой ситуаций: дубликаты первичных ключей в таблице MySQL.

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

SELECT * 
FROM  `map_group_tmp` 
WHERE id =672192

В результате phpMyAdmin вернул только одну строку.

Ок, пошли дальше: поискал вхождения строки '672192' в .sql файле (результат экспорта из phpMyAdmin) с боевого. Действительно, нашлось две такие записи.

Попробовал такой запрос:

SELECT COUNT( * ) 
FROM  `map_group_tmp` 
WHERE 1 
GROUP BY id
ORDER BY COUNT( * ) DESC 

Всюду единички. Удивительно, как то ли phpMyAdmin, то ли движок БД прячет ситуацию, которой быть не должно вообще ни при каких обстоятельствах:)

Тогда пошел на хитрость:

SELECT t1.id, t1.time, t2.id, t2.time
FROM  `map_group_tmp` t1,  `map_group_tmp` t2
WHERE t1.id = t2.id
AND t1.items_ids != t2.items_ids

Ага, попались!:) Результат на скриншоте (time — время создания):

image

Несмотря на то, что на сервере реализована репликация БД, видно, что запись произошла с одного и того же сервера (последняя цифра id одинаковая у всех записей).

Также обратите внимание на время создания записей и последовательность id (они идут подряд).

Логи сервера показали, что примерно в это время произошла перезагрузка.

Автор: karenishe

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js