我有一个MySQL主从配置。

在两台服务器上,我都有两个表:table1table2

我在两台服务器上都具有以下触发器:

  Trigger: test_trigger
    Event: UPDATE
    Table: table1
Statement: insert into table2 values(null)
   Timing: AFTER


table2的结构如下:

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+


问题在于,在MySQL 5.1.*上,当从属调用触发器时,它会添加在主控上插入的ID,而不是它应根据自己的auto_increment值插入的ID。

假设我有以下数据:

在大师:

SELECT * FROM table2;
Empty set (0.08 sec)


在从站上:

SELECT * FROM table2;

+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)


(只需忽略从站不是主站的完整镜像的事实)

在上述情况下,当我在Master上的table1中更新一行时,从站停止并返回错误:


  查询中的键“ PRIMARY”错误“重复项'1”。


我不明白为什么奴隶试图插入一个特定的ID。

很奇怪,在MySQL 5.0.*上没有发生这种情况。

最佳答案

如果可能,请切换到基于行的复制。

除了基于语句的复制的最基本情况外,自动增量几乎无法解决任何其他问题。

对于任何产生多个auto_increment值(通过触发器,多行插入等)的语句,只有第1个auto_increment值在从属设备上总是正确的(仅记录第1个)。

如果从站从日志中读取了一个auto_increment值,但未“使用”该值,则该值将用于下一条语句(这可能是完全不相关的)。当从站出于某种原因(在配置中忽略表/ db,在proc / trigger中有条件地插入等)而跳过相应的insert语句时,就会发生这种情况。

我在审核日志类型表中遇到了类似的问题(触发器对table1的每次更改都会在table2中插入一个事件),以及其他一些与自动增量相关的问题。

我不确定此解决方案是否适合您的情况,但为了以防万一,我将发布此解决方案:


在表1中添加一个“ updated_count”字段。它从0开始(在插入时),并在每次更新时增加1(使用INSERT / UPDATE触发器)。
删除table2的auto_increment并将其PK更改为复合键(table1_pk,table1_update)。然后在table2 PK的AFTER INSERT / UPDATE触发器中使用table1的PK和'updated_count'。

关于mysql - MySQL 5.1。*奇怪的触发器复制行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23055989/

10-16 18:51