2008-09-19 8 views
4

Je cours quelques bases de données sur MySQL 5.0.45 et j'essaie de synchroniser ma base de données avec un schéma révisé, donc je peux courir côte à côte. Je fais cela en ajoutant des déclencheurs à la nouvelle base de données, mais je rencontre des problèmes de réplication. Mon installation est la suivante.MySQL triggers + réplication avec plusieurs bases de données

serveur "maître"

  • Database "legacydb", réplique au serveur "esclave".
  • Base de données "newdb", a des déclencheurs qui mettent à jour "legacydb" et pas de réplication.

serveur "esclave"

  • Database "legacydb"

Mes mises à jour "newdb" marche très bien, et partit mes déclencheurs. Ils mettent à jour "legacydb" sur le serveur "maître". Cependant, les modifications ne sont pas répliquées vers les esclaves. Les documents MySQL indiquent que, pour des raisons de simplicité, la réplication examine le contexte de la base de données en cours (par exemple, "SELECT DATABASE();") pour décider quelles requêtes répliquer plutôt que d'examiner le produit de la requête. Mon déclencheur est exécuté à partir du contexte de la base de données "newdb", donc la réplication ignore les mises à jour.

J'ai essayé de déplacer l'instruction update vers une procédure stockée dans "legacydb". Cela fonctionne bien (c'est-à-dire que les données sont répliquées sur l'esclave) lorsque je me connecte à "maître" et que je lance manuellement "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);". Cependant, lorsque cette procédure est appelée à partir d'un déclencheur, elle n'est pas répliquée.

Jusqu'à présent, ma réflexion sur la façon de résoudre ce problème a été l'une des suivantes.

  • Forcer le déclencheur à définir une nouvelle base de données en cours. Ce serait le plus facile, mais je ne pense pas que ce soit possible. C'est ce que j'espérais réaliser avec la procédure stockée.

  • Répliquer les deux bases de données et avoir des déclencheurs dans les deux maître et esclave. Ce serait possible, mais une douleur à mettre en place.

  • Forcer la réplication à ramasser toutes les modifications apportées à "legacydb", quel que soit le contexte de base de données en cours. Si la réplication s'exécute à un niveau trop élevé, elle ne verra jamais les mises à jour effectuées par mon déclencheur, auquel cas aucun piratage n'atteindra ce que je veux.

Toute aide sur la façon d'y parvenir serait grandement appréciée.

Répondre

3

Cela peut avoir quelque chose à voir avec elle:

Une fonction stockée acquiert des verrous de table avant d'exécuter, afin d'éviter des incohérences dans le journal binaire en raison de décalage de l'ordre dans lequel les déclarations exécutent et quand ils apparaissent dans le journal . Les instructions qui invoquent une fonction sont enregistrées plutôt que les instructions exécutées dans la fonction. Par conséquent, les fonctions stockées qui mettent à jour les mêmes tables sous-jacentes ne s'exécutent pas en parallèle.

Par contre, les procédures stockées n'acquièrent pas de verrous au niveau de la table. Toutes les instructions exécutées dans les procédures stockées sont écrites dans le journal binaire.

De plus, il y a une liste de questions avec Triggers: http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

+0

Fondamentalement, la façon dont à toute épreuve est de mettre à jour la base de données, et s'il y a des déclencheurs dans une base de données répliquées, ou les fonctions stockées, ils doivent également exister sur la base de données esclave. Il y a aussi des restrictions sur la façon d'écrire les déclencheurs et les fonctions afin qu'ils se répliquent eux-mêmes. – Chris

Questions connexes