2016-07-31 37 views
0

Ich habe eine MySQL Master-Slave-Datenbank und einen Prozess auf der Slave-Seite, die auf die neuesten Updates von der Slave-DB hört und entsprechend handelt. Ich habe auch einen Trigger auf der Slave-Seite geschrieben, um eine andere Tabelle zu aktualisieren (die der Prozess gerade abhört).Mysql trigger Ereignisse in einer Reihe Master-Slave-Replikation auf der Slave-Seite

Ich habe den Trigger auf dem Slave-Server eingefügt (nicht auf dem Master, da ich zeilenbasierte Replikation verwende). Der Prozess überprüft die "Ins_table" alle 10 Sekunden, um neue Datensätze zu erhalten. Die Replikation geschieht vollkommen in Ordnung. Der Trigger auf der Slave-Seite funktioniert jedoch nie. Ich habe oben Trigger in einer separaten Datenbank (ohne Replikation) getestet, und es funktioniert ohne jedes Problem. Können Sie mir bitte helfen zu verstehen, warum die löst nach einfügen funktionieren nicht auf der Slave-Seite einer Reihe-basierte Master-Slave-Replikation?

Antwort

1

Das ist das erwartete Verhalten für zeilenbasierte Replikation ist, mysql documentation

Replikation und Trigger

Mit der anweisungsbasierten Replikation sehen, löst auf dem Master ausgeführt auch auf dem Slave ausführen. Bei der zeilenbasierten Replikation werden auf dem Master ausgeführte Trigger nicht auf dem Slave ausgeführt. Stattdessen werden die Zeilenänderungen auf dem Master, die aus der Ausführung des Triggers resultieren, repliziert und auf den Slave angewendet.

Dieses Verhalten ist von Entwurf. Wenn bei der zeilenbasierten Replikation der Slave die Trigger sowie die von ihnen verursachten Zeilenänderungen anwendete, wurden die Änderungen am Slave zweimal angewendet, was zu unterschiedlichen Daten auf dem Master und dem Slave führte.

Wenn Sie möchten, dass Trigger sowohl auf dem Master als auch auf dem Slave ausgeführt werden - möglicherweise, weil Sie unterschiedliche Trigger für den Master und den Slave haben - müssen Sie die statementbasierte Replikation verwenden. Um slaveseitige Trigger zu aktivieren, ist es jedoch nicht erforderlich, ausschließlich die statementbasierte Replikation zu verwenden. Es reicht aus, nur für die Anweisungen, für die dieser Effekt gewünscht wird, zur anweisungsbasierten Replikation zu wechseln und für den Rest der Zeit die zeilenbasierte Replikation zu verwenden.