2016-07-31 13 views
0

我有一個MySQL主從數據庫和一個從端的進程,它偵聽來自從服務器DB的最新更新並相應地執行操作。我還在從端寫了一個觸發器來更新另一個表(該進程正在偵聽)。在從屬端基於行的主從複製中的行觸發事件

delimiter # 
CREATE TRIGGER on_insert AFTER INSERT ON test 
FOR EACH ROW 
BEGIN 
    INSERT INTO Ins_table 
    VALUES(NEW.firstname, NEW.id); 
end# 
delimiter ; 

我插在從服務器上的觸發(不是法師,因爲我使用基於行的複製)。該過程每10秒檢查一次「Ins_table」以獲取新記錄。複製發生得很好。但是,從機側的觸發器無法工作。 我已經在單獨的數據庫(沒有複製)測試過上述觸發器,它的工作原理沒有任何問題。您能否幫我理解爲什麼觸發插入不能在基於行的主從複製的從屬端運行?

回答

1

這是基於行的複製預期的行爲,見mysql documentation

複製和觸發器

使用基於語句的複製,觸發器在主執行也執行上的奴隸。使用基於行的複製時,在主站上執行的觸發器不會在從站上執行。相反,從觸發器執行產生的主設備上的行更改將複製並應用到從設備上。

此行爲是設計使然。如果在基於行的複製下,從屬設備應用了觸發器以及由它們引起的行更改,則更改實際上將在從屬設備上應用兩次,從而導致主設備和從設備上的數據不同。

如果您希望在主設備和從設備上都執行觸發器 - 可能是因爲主設備和從屬設備上有不同的觸發器,則必須使用基於語句的複製。但是,要啓用從屬端觸發器,則不必專門使用基於語句的複製。僅對那些需要此效果的語句切換到基於語句的複製就足夠了,並且在其餘時間使用基於行的複製。