J'ai un système (hérité d'une autre société de développement) et je ne connais pas encore toutes ses fonctionnalités. Construction:
- client/application web (symfony 1.4)
- DB - MySQL.
Le projet est déployé sur 2 serveurs:
1 er: serveur nginx + PHP + DB Master;
2-ème: DB Slave.
Lorsque les données sont modifiées par le client Web chez DB Master, DB Slave fonctionne bien et les données ont un processus de réplication normal. Lorsque les données sont modifiées par MySQL Management Client, j'ai une notification:
Impossible d'exécuter l'instruction: impossible d'écrire dans le journal binaire car BINLOG_FORMAT = STATEMENT et au moins une table utilise un moteur de stockage limité à la journalisation basée sur les lignes. InnoDB est limité à la journalisation des lignes lorsque le niveau d'isolation des transactions est READ COMMITTED ou READ UNCOMMITTED
Et puis, DB Slave tombe en panne et le processus de réplication s'interrompt (insertion d'erreur ... entrée en double ...).
La notification similaire se produit (dans cette situation - erreur) avec le même texte, lorsque j'essaie d'insérer des données avec Java application/module (il s'exécute à l'intérieur de la transaction) et après exception, la transaction annule et aucune modification ne se produit.
Comment puis-je résoudre ce problème et faire fonctionner le système et rendre possible la modification des données sur le maître DB et les esclaves DB en mode normal?
Il existe 3 méthodes que MySQL peut utiliser pour écrire dans les journaux binaires:
DÉCLARATION
Cela signifie que chaque instruction SQL sur le maître est enregistrée dans le journal et exécutée sur l'esclave. Cela peut provoquer des problèmes si l'instruction SQL contient des instructions telles que "NOW ()", "Rand ()" et tout ce qui n'est pas déterministe. Cela nécessite également la prise en charge du moteur de stockage utilisé.
RANGÉE
Cela signifie que chaque ligne modifiée par une instruction est enregistrée individuellement dans le journal binaire. Cela donne des journaux binaires plus grands (généralement) que la journalisation basée sur des instructions, mais est presque toujours garanti pour donner la réplication exacte nécessaire.
MIXTE
Cela permet à MySQL de choisir entre la journalisation binaire et basée sur les lignes selon les besoins.
Si vous obtenez cette erreur, une suggestion consiste à remplacer la variable BINLOG_FORMAT par MIXED. Cela permet à MySQL de basculer automatiquement entre la journalisation basée sur ROW et STATEMENT selon les besoins.