Erreur MySQL: impossible d'écrire dans le journal binaire

8

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-er: 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 l'application / le module java (il s'exécute à l'intérieur de la transaction) et après exception, la transaction est annulée 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?

Chaki_Black
la source

Réponses:

18

Il existe 3 méthodes que MySQL peut utiliser pour écrire dans les journaux binaires:

  1. 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é.

  2. 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.

  3. 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.

Phil Sumner
la source
Droite! Excellent!
Chaki_Black
4
Une excellente suggestion, mais COMMENT changez-vous BINLOG_FORMAT?
Trebor Rude
2
Peut être très tard, mais cela peut aider tous ceux qui veulent savoir comment changer BINLOG_FORMAT dba.stackexchange.com/questions/6150/…
Vivek Dhayalan
Trebor Rude: Vous devriez lire la documentation mysql, qui explique cela en détail! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy
Cette réponse m'aide à résoudre le problème. Merci!
Tung