Дубликаты в автоинкрементальном поле

275
02 октября 2017, 00:18

Задача не совсем обычная. Скажу сразу, это временное решение.

Итак, есть исходная MYSQL база данных (назовём, MASTER) и его реплика (пусть, SLAVE). Реплицирование (как уже понятно, MASTER-SLAVE) statement-based по причине, что на SLAVE нужно запускать триггеры.

  1. Свои триггеры на SLAVE были удалены и заменены новым набором.
  2. Для каждой таблицы создано по 3 триггера: на INSERT, на UPDATE и на DELETE.
  3. Все триггеры созданы на основе одного шаблона и отличаются только передаваемыми значениями.
  4. Каждый триггер делает 1 INSERT в таблицу (назовём, CHANGES) в SLAVE.
  5. Таблица CHANGES присутствует только на SLAVE. На MASTER ничего о ней не знают и не работают с ней. С таблицей CHANGES работают только триггеры на SLAVE.
  6. В таблице CHANGES есть автоинкрементальное поле ID (bigint).
  7. Ни один триггер не пишет напрямую значение этого поля. Значение заполняется по умолчанию базой данных.
  8. За минуту в таблицу CHANGES добавляется около 20 записей.
  9. По мере работы системы возникают дубликаты для поля ID.

Как такое может возникать?

Странно ещё то, что каждый раз дублированное значение на немного отличается от предыдущего в большую сторону. Больше похоже на значение какого-то автоинкремента, но только не этой таблицы.

Итак, ещё раз цепочка действий:

  1. В MASTER происходит INSERT / UPDATE / DELETE таблицы.
  2. Это изменение переносится репликацией в SLAVE.
  3. На SLAVE срабатывает соответствующий триггер, который создаёт запись в CHANGES.
  4. Периодически, возникают дубликаты для незатрагиваемого запросами поля ID таблицы CHANGES.

Могу сразу сказать, что ни один триггер точно не затрагивает значение поля ID. И никто другой тоже. Никаких UPDATE / DELETE над CHANGES тоже не выполняется.

Я понимаю, что два и больше разных триггеров могу сработать одновременно и, соответственно, будут делать INSERT тоже одновременно. Но такая ситуация должна без особых сложностей разрешаться самой СУБД. Иначе, это была бы очень плохая СУБД.

UPD:

CREATE TABLE `CHANGES` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`field1` ENUM(...) NOT NULL,
`field2` BOOL NOT NULL DEFAULT FALSE,
`field3` VARCHAR(64) NOT NULL,
`field4` VARCHAR(255) NOT NULL,
`field5` TEXT,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TRIGGER `tr_TABLE_insert` AFTER INSERT ON `TABLE`
FOR EACH ROW BEGIN
    INSERT INTO `CHANGES` (`field1`, `field3`, `field4`, `field5`)
    VALUES ("value1", "value3", "value4", "value5");
END
READ ALSO
Yii CDbCommand запрос большого количества данных и memory

Yii CDbCommand запрос большого количества данных и memory

Необходимо выгрести большое кол-во данных из базы данных и положить в Excel так, чтобы по пути не закончилась память

228
Как заполнить двумерный массив нулями и единицами рандомно, чтобы число единиц пользователь вводил с клавиатуры?

Как заполнить двумерный массив нулями и единицами рандомно, чтобы число единиц пользователь вводил с клавиатуры?

Создайте двумерный массив А(N,M)Значения N и M вводит пользователь с клавиатуры

316
работа с API SoundCloud под Android

работа с API SoundCloud под Android

Кто-то знает рабочие пути взаимодейтсвия с SoundCloud при разработке приложения под Android? https://githubcom/soundcloud/java-api-wrapper, как я понял, уже не вариант

288
Java-классы. Объекты и экземпляры [дубликат]

Java-классы. Объекты и экземпляры [дубликат]

На данный вопрос уже ответили:

238