2016-07-31 5 views
0

スレーブDBからの最新の更新をリッスンし、それに応じて動作するMySQLマスタースレーブデータベースとスレーブ側のプロセスがあります。私はまた、別のテーブル(プロセスが聞いている)を更新するためにスレーブ側にトリガを書きました。スレーブ側で行ベースのマスター/スレーブレプリケーションでMysqlトリガーイベントが発生する

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

レプリケーションとトリガ

を参照し、行ベースのレプリケーションのための正常な動作です、スレーブ上で実行し、マスター上で実行トリガ。行ベースのレプリケーションでは、マスターで実行されたトリガーはスレーブ上で実行されません。その代わりに、トリガの実行に起因するマスタの行の変更はレプリケートされ、スレーブに適用されます。

この動作は仕様です。行ベースのレプリケーションの下でスレーブがトリガを適用した場合、トリガとそれによって引き起こされた行の変更が適用された場合、変更は実際にスレーブに2回適用され、マスターとスレーブの異なるデータになります。

マスタとスレーブの両方でトリガを実行する場合(おそらく、マスタとスレーブで異なるトリガがあるため)、ステートメントベースのレプリケーションを使用する必要があります。ただし、スレーブ側トリガを有効にするには、文ベースのレプリケーションのみを使用する必要はありません。この効果を望むステートメントに対してのみステートメントベースのレプリケーションに切り替え、残りの時間に行ベースのレプリケーションを使用することで十分です。

関連する問題