复制时自动增量字段中的重复值

时间:2017-09-28 21:07:57

标签: mysql triggers auto-increment database-replication

这是一个奇怪的问题。

源MySQL DB(MASTER)及其复制品(SLAVE)。这是一个(正如你理解它的MASTER-SLAVE)语句库复制,因为我需要触发器在SLAVE端运行。

  1. 原始触发器被新的触发器取代。
  2. 每个表都有3个triger:on INSERT,UPDATE和DELETE。
  3. Trigers由单一模式生成,仅由params不同。
  4. 每个触发器对SLAVE上的表(CHANGES)执行单个INSERT查询。
  5. 此表未复制且仅存在于SLAVE上。
  6. 此表中有一个自动增量列(ID - bigint)。
  7. 没有触发器设置或修改列ID的值。数据库为其设置默认值。
  8. 每分钟在CHANGES上执行约20次插入。
  9. 我看到有重复值的错误。
  10. 怎么可能?

    让我们再说一次:

    1. 在MASTER上执行INSERT / UPDATE / DELETE查询。
    2. 此更改已复制到SLAVE。
    3. 调用触发器并向CHANGES插入一行。
    4. 生成重复值错误。
    5. 正如我之前所说,没有触发器设置或修改自动增量字段(ID)的值。只有触发器才能使用表CHANGES。

      我知道可以一起调用两个或多个触发器,并尝试一起执行INSERT,但我认为DB应该很容易解决这个问题。或者这是一个非常糟糕的数据库。

      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
      

      UPD 2:

      我找到了一个临时且更脏的方法 - 为CHANGES添加了BEFORE INSERT触发器以手动设置ID。

      有效。但我仍然无法弄清楚为什么本机AUTO_INCREMENT机制正在生成重复的ID。

0 个答案:

没有答案