2014-04-14 24 views
0

我有一個MySQL主從配置。MySQL 5.1。*奇怪的觸發器複製行爲

在兩臺服務器上我有兩個表: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在master上插入,而不是它根據自己的auto_increment值插入的id。

比方說,我有以下數據:

在站長:

SELECT * FROM table2; 
Empty set (0.08 sec) 

奴隸:

SELECT * FROM table2; 

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

(只是忽略一個事實,即從不是一個完整的鏡子的主人)

鑑於abov Ë情況下,當我從主表1更新一行,從機停止並返回錯誤:

Error 'Duplicate entry '1' for key 'PRIMARY'' on query.

我不明白爲什麼從試圖插入一個特定的ID。

這很奇怪,在MySQL 5.0.*這沒有發生。

+0

是否使用基於語句的複製? – Vatev

+0

@Vatev是 - 它是基於聲明的複製 – TSorin

回答

0

如果可能,切換到基於行的複製。

對於除了基於語句的複製的最基本情況之外的任何事情,自動增量都非常糟糕。

對於任何生成多個auto_increment值(通過觸發器,多行插入等)的語句,只有第一個auto_increment值始終在從站上正確(僅記錄1 st)。

如果從站從日誌中讀取一個auto_increment值,但不'使用'它,則該值將用於下一個語句(可能完全不相關)。當從站由於某種原因(配置中忽略的表/ db,proc/trigger中的條件插入等)跳過相應的插入語句時,會發生這種情況。

我有一個與審計日誌類型表(一個觸發器插入table1中的每個更改到table1的事件)以及幾個其他自動增量相關的問題類似的問題。

我不知道這個解決方案將適合你的情況,但我打算將它張貼以防萬一:

  • 添加「updated_count」字段到Table 1。它從0開始(插入時),並在每次更新時增加1(使用BEFORE INSERT/UPDATE觸發器)。

  • 刪除表2的AUTO_INCREMENT,並改變其對PK複合鍵(table1_pk,table1_update)。然後在table2的PK的AFTER INSERT/UPDATE觸發器中使用table1的PK和'updated_count'。

+0

現在改變應用程序的工作方式需要很長時間(這是一些傳統的網絡應用程序;應該解釋古董MySQL版本 - 5.0.24) 我的目標爲解決與從AUTO_INCREMENT的問題忽略任何它從二進制日誌讀取和只使用一個可用值該列。但它似乎是棘手的,它看起來像...... – TSorin

+0

您應該檢查是否基於行的複製是一個選項。它們之間的切換是微不足道的。否則,您應該嘗試找出錯誤的自動增量值來自哪裏。可能有一個聲明在主機上插入一行,但不在從機上。 – Vatev