Репликация MySQL и ошибка Duplicate entry 'значение' for key 'PRIMARY'' on query

Имеем следующую конфигурацию: Master -> Slave. Репликация в одну сторону. На Slave не отправляются вообще никакие запросы.
НО!!! Регулярно Slave встает с ошибкой Duplicate entry
Вот конкретный пример:
Error 'Duplicate entry '10375' for key 'PRIMARY'' on query. Default database: 'parts_nm_new'. Query: 'INSERT INTO vsm_user_passwords (login, password, date_till) VALUES ('drivent', 'тут пароль', '2013-07-16')'
Вот как так?
PRIMARY KEY там один. Значение AUTO_INCREMENT. Как он может дублироваться?
Вот структура таблицы:
CREATE TABLE IF NOT EXISTS `vsm_user_passwords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`date_till` date NOT NULL,
`date_check` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `login` (`login`),
KEY `password` (`password`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
И эта проблема с разными таблицами вылезает :(
Какие могут быть рекомендации по решению проблемы?
  • Вопрос задан
  • 22551 просмотр
Пригласить эксперта
Ответы на вопрос 4
la0
@la0
Здравствуйте.
Такая ошибка более типична для master-master ( см. autoincrement_offset и *_increment dev.mysql.com/doc/refman/5.0/en/replication-options-master.html ).
Если такая проблема для master-slave — возможно поможет переключение режим логирования на mixed (но мне в это не совсем верится).
И обязательно убедитесь, что у вас при старте слейва не только идентичные данные, но и позишены в бинлоге
Ответ написан
Комментировать
Merkuloff
@Merkuloff
Проверьте, возможно у вас сбиты счетчики или отличаются данные на мастере и слейве.
Если отличается, то исправить так:

Все запросы выполнить в мастере

CREATE TABLE IF NOT EXISTS `vsm_user_passwords_new` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`date_till` date NOT NULL,
`date_check` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `login` (`login`),
KEY `password` (`password`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

(Прежде чем создавать табличку, желательно глянуть в SHOW CREATE TABLE `vsm_user_passwords`,
убедиться, что приведенная вами структура таблицы актуальна.)

INSERT INTO `vsm_user_passwords_new` (SELECT * FROM `vsm_user_passwords`);

TRUNCATE TABLE `vsm_user_passwords`;
DROP TABLE `vsm_user_passwords`;

RENAME TABLE `vsm_user_passwords_new` TO `vsm_user_passwords`;

p.s. Версия MySQL? Есть ли триггеры на эту таблицу?
p.s.s. Пробовали ли мониторить слейв, от кого идут запросы?
Ответ написан
@betal
Тоже такое встречается.
Добавлял в исключение ошибку, но конечно это не совсем правильно.
Ответ написан
Комментировать
У меня то же самое - оказалось, что поле актоинкремента достигло максимума. Я ид создавал генерируя случайное число, а не все подряд.

Решил следующим образом:
зашел в пхп майадмин - %таблица% - опции.
там есть инпут автоинкремента с саксимальным значением - его нужно поменять на меньшее.

Важно!!! - в таблице в поле автоинкремента нужно поменять его значения на какое нибуть меньшее.

Надеюсь поможет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы