Error de MySQL: imposible de escribir en el registro binario

8

Tengo un sistema (heredado de otra empresa de desarrollo) y todavía no conozco todas sus características. Construcción:
- cliente / aplicación web (Symfony 1.4)
- DB - MySQL.

El proyecto se implementa en 2 servidores:
1 er: servidor nginx + PHP + DB Master;
2 st: DB Slave.

Cuando el cliente web modifica los datos en DB Master, DB Slave funciona bien y los datos tienen un proceso de replicación normal. Cuando MySQL Management Client modifica los datos, tengo una notificación:

No se puede ejecutar la declaración: imposible de escribir en el registro binario ya que BINLOG_FORMAT = STATEMENT y al menos una tabla usa un motor de almacenamiento limitado al registro basado en filas. InnoDB se limita al registro de filas cuando el nivel de aislamiento de la transacción se LEE COMPROMETIDO o LEÍDO NO COMPROMETIDO

Y luego, DB Slave se cae y el proceso de replicación se rompe (inserción de error ... entrada duplicada ...).

La notificación similar ocurre (en esta situación: error) con el mismo texto, cuando trato de insertar datos con la aplicación / módulo Java (se ejecuta dentro de la transacción) y, después de la excepción, la transacción retrocede y no ocurre ninguna modificación.

¿Cómo puedo resolver este problema y hacer que el sistema funcione y hacer posible que los datos de modificación en DB Master y DB Slaves funcionen en modo normal?

Chaki_Black
fuente

Respuestas:

18

Hay 3 métodos que MySQL puede usar para escribir en los registros binarios:

  1. DECLARACIÓN

    Esto significa que cada instrucción SQL en el maestro se registra en el registro y se ejecuta en el esclavo. Esto puede causar problemas si la instrucción SQL contiene instrucciones como "NOW ()", "RAND ()" y algo no determinista. Esto también requiere soporte del motor de almacenamiento en uso.

  2. FILA

    Esto significa que cada fila que cambia una instrucción se registra individualmente en el registro binario. Esto proporciona registros binarios más grandes (generalmente) que el registro basado en instrucciones, pero casi siempre se garantiza que proporcionará la replicación exacta necesaria.

  3. MEZCLADO

    Esto permite a MySQL elegir entre registros binarios y basados ​​en filas, según sea necesario.

Si obtiene este error, una sugerencia es cambiar la variable BINLOG_FORMAT a MIXED. Esto permite que MySQL cambie automáticamente entre el registro basado en ROW y STATEMENT según sea necesario.

Phil Sumner
fuente
¡Derecha! ¡Excelente!
Chaki_Black
44
Una excelente sugerencia, pero ¿CÓMO cambias BINLOG_FORMAT?
Trebor Rude
2
Puede llegar muy tarde, pero puede ayudar a todos aquellos que quieran saber cómo cambiar BINLOG_FORMAT dba.stackexchange.com/questions/6150/…
Vivek Dhayalan
Trebor Rude: ¡Deberías leer la documentación de mysql, que explica esto en detalle! dev.mysql.com/doc/refman/5.6/en/...
Lifeboy
Esta respuesta me ayuda a resolver el problema. ¡Gracias!
Tung