Toon posts:

[mysql5.0.22]SBR en triggers

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik draai 2 databases met daartussen statement based replication.

Nu wil ik triggers gaan gebruiken om bij te houden of bepaalde records gewijzigd zijn. Zodra er een update, insert of delete gedaan wordt moet in een aparte tabel een record geschreven worden die de identifier en de actie bij houd (dus update/insert/delete). die trigger zelf is geen enkel probleem, maar nu stuit ik tegen de replicatie.

wanneer ik de replicatie uitvoer krijg ik dubbele waarden in de tabel die alles bij houdt.
de trigger wordt immers eerst uitgevoerd op de ene DB, en creeert een record, daarna vind de replicatie plaats en wordt die tabel volledig overgezet naar de andere DB maar daarnaast worden ook alle triggers weer uitgevoerd waardoor hij alle waarden dubbel in die tabel zet.

nu zit ik hier al ff een tijdje op te denken en row based replication zou het al oplossen (dan gewoon alle triggers slechts op 1 db zetten. het is namelijk zo dat op 1 db alle wijzigingen gedaan worden die daarna gerepliceerd worden.) maar helaas is rbr geen optie(ivm huidige systemen)

voor de rest kan ik me maar erg weinig bedenken wat dit oplost..

als iemand hints of tips heeft hoor ik het graag.

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Kan je in een SBR de triggers ook niet alleen op de master zetten? De MySQL documentatie is daar lichtelijk vaag over.

Even verder gezocht: MySQL noemt in een faq het volgende. Dit suggereert dat in MySQL 5.1 het inderdaad op SBR kan.
Do triggers work with replication?

Triggers and replication in MySQL 5.1 work the same as in most other database engines: Actions carried out through triggers on a master are not replicated to a slave server. Instead, triggers that exist on tables that reside on a MySQL master server need to be created on the corresponding tables on any MySQL slave servers so that the triggers activate on the slaves as well as the master.

How are actions carried out through triggers on a master replicated to a slave?

First, the triggers that exist on a master must be re-created on the slave server. Once this is done, the replication flow works as any other standard DML statement that participates in replication. For example, consider a table EMP that has an AFTER insert trigger, which exists on a master MySQL server. The same EMP table and AFTER insert trigger exist on the slave server as well. The replication flow would be:

An INSERT statement is made to EMP.

The AFTER trigger on EMP activates.

The INSERT statement is written to the binary log.

The replication slave picks up the INSERT statement to EMP and executes it.

The AFTER trigger on EMP that exists on the slave activates.

[ Voor 85% gewijzigd door KabouterSuper op 30-05-2008 15:57 ]

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
Triggers and replication in MySQL 5.0 work in the same way as in most other database systems: Actions carried out through triggers on a master are not replicated to a slave server. Instead, triggers that exist on tables that reside on a MySQL master server need to be created on the corresponding tables on any MySQL slave servers so that the triggers activate on the slaves as well as the master.
al bedenk ik mij nu wel... worden statements gecreeerd door triggers eigenlijk ook gerepliceerd? (heb nog niet de mogelijkheid gehad dit te testen, is dus nog even puur vanuit redenatie)

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Volgens mij wel, want alle DML wordt gerepliceerd.


Update: dat lijkt toch niet zo te zijn. Voor procedures geldt dit wel. Voor functies niet.

[ Voor 48% gewijzigd door KabouterSuper op 30-05-2008 16:10 ]

When life gives you lemons, start a battery factory


Verwijderd

Topicstarter
ah toch wel gevonden... collega van me wist het toch wel (was iemand die normaal niets met sql doet, dus had niet verwacht dat hij het zou weten...

de statements veroorzaakt door triggers worden niet gerepliceerd. dus dan is het zo simpel om gewoon de trigger op beide DB's te zetten

dank naar de alwetende collega :D