Ошибка MySQL: невозможно записать в двоичный журнал

8

У меня есть система (унаследованная от другой компании-разработчика), и я пока не знаю всех ее возможностей. Конструкция:
- веб-клиент / приложение (symfony 1.4)
- БД - MySQL.

Проект развернут на 2 серверах:
1-й: nginx server + PHP + DB Master;
2-й: БД Раб.

Когда данные модифицируются веб-клиентом в DB Master, DB Slave работает хорошо, и данные имеют нормальный процесс репликации. Когда данные модифицируются MySQL Management Client, у меня появляется уведомление:

Невозможно выполнить оператор: невозможно записать в двоичный журнал, так как BINLOG_FORMAT = STATEMENT и хотя бы в одной таблице используется механизм хранения, ограниченный ведением журнала на основе строк. InnoDB ограничен регистрацией строк, когда уровень изоляции транзакции READ COMMITTED или READ UNCOMMITTED

И затем, DB Slave падает, и процесс репликации прерывается (ошибка вставки ... повторяющаяся запись ...).

Подобное уведомление происходит (в этой ситуации - ошибка) с тем же текстом, когда я пытаюсь вставить данные с помощью Java-приложения / модуля (он запускается внутри транзакции), и после исключения транзакция откатывается, и никаких изменений не происходит.

Как я могу решить эту проблему и заставить систему работать и сделать возможным модификацию данных на БД-ведущей и БД-ведомых, работающих в обычном режиме?

Chaki_Black
источник

Ответы:

18

Есть 3 метода, которые MySQL может использовать для записи в двоичные журналы:

  1. ЗАЯВЛЕНИЕ

    Это означает, что каждый оператор SQL на ведущем устройстве записывается в журнал и выполняется на ведомом устройстве. Это может вызвать проблемы, если инструкция SQL содержит такие операторы, как «NOW ()», «RAND ()» и что-либо недетерминированное. Это также требует поддержки от используемого механизма хранения.

  2. СТРОКА

    Это означает, что каждая строка, которая изменяется оператором, индивидуально записывается в двоичный журнал. Это дает большие двоичные журналы (как правило), чем журналирование на основе операторов, но почти всегда гарантирует точную необходимую репликацию.

  3. MIXED

    Это позволяет MySQL выбирать между бинарным и строковым журналированием по мере необходимости.

Если вы получаете эту ошибку, одно из предложений - изменить переменную BINLOG_FORMAT на MIXED. Это позволяет MySQL автоматически переключаться между журналами ROW и STATEMENT по мере необходимости.

Фил Самнер
источник
Правильно! Отлично!
Chaki_Black
4
Отличное предложение, но КАК вы меняете BINLOG_FORMAT?
Требор Руд
2
Может быть очень поздно, но это может помочь всем тем, кто хочет знать, как изменить BINLOG_FORMAT dba.stackexchange.com/questions/6150/…
Вивек Дхайалан
Требор Руд: Вам следует прочитать документацию по mysql, в которой это подробно объясняется! dev.mysql.com/doc/refman/5.6/en/…
Lifeboy
Этот ответ помогает мне решить проблему. Спасибо!
Tung