Question

J'utilise quelques bases de données sur MySQL 5.0.45 et j'essaie de synchroniser ma base de données héritée avec un schéma révisé, afin de pouvoir exécuter les deux côte à côte. Je le fais en ajoutant des déclencheurs à la nouvelle base de données, mais je rencontre des problèmes de réplication. Ma configuration est la suivante.

Serveur "maître"

  • La base de données "legacydb", est répliquée sur le serveur "esclave".
  • La base de données "newdb" contient des déclencheurs qui mettent à jour "legacydb". et pas de réplication.

Serveur "esclave"

  • Base de données "legacydb"

Mes mises à jour vers & new; newdb " marche bien et déclenche mes déclencheurs. Ils mettent à jour " legacydb " sur " master " serveur. Cependant, les modifications ne sont pas répliquées sur les esclaves. Les documents MySQL indiquent que par souci de simplicité, la réplication examine le contexte actuel de la base de données (par exemple, "SELECT DATABASE ();" )) lors du choix des requêtes à répliquer plutôt que de rechercher le produit de la requête. Mon déclencheur est exécuté à partir du contexte de la base de données "newdb", la réplication ignore donc les mises à jour.

J'ai essayé de déplacer l'instruction de mise à jour vers une procédure stockée dans "legacydb". Cela fonctionne bien (les données se répliquent sur esclave) lorsque je me connecte à " maître " et exécutez manuellement & USE; USE newdb; CALL legacydb.do_update ('Foobar', 1, 2, 3, 4); ". Toutefois, lorsque cette procédure est appelée depuis un déclencheur, elle ne se réplique pas.

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

  • Force le déclencheur à définir une nouvelle base de données actuelle. Ce serait plus facile, mais je ne pense pas que ce soit possible. C’est ce que j’espérais obtenir avec la procédure stockée.

  • Répliquez les deux bases de données et créez des déclencheurs à la fois en maître et en esclave. Ce serait possible, mais cela poserait beaucoup de problèmes.

  • Forcer la réplication à prendre en compte toutes les modifications apportées à "legacydb", quel que soit le contexte actuel de la base de données.

  • Si la réplication fonctionne à un niveau trop élevé, elle ne verra jamais aucune mise à jour exécutée par mon déclencheur. Dans ce cas, aucune quantité de piratage ne pourra atteindre ce que je veux.

Toute aide pour y parvenir serait grandement appréciée.

Était-ce utile?

La solution

Cela peut avoir quelque chose à voir avec cela:

Une fonction stockée acquiert les verrous de table avant l’exécution, afin d’éviter les incohérences dans le journal binaire en raison d’une incompatibilité entre l’ordre dans lequel les instructions s’exécutent et le moment où elles apparaissent dans le journal. Les instructions qui appellent 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.

En revanche, 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 existe toute une liste de problèmes liés aux déclencheurs: http://dev.mysql.com/doc/refman/ 5.0 / fr / routine-restrictions.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top