Какой самый безопасный способ переключения формата binlog во время выполнения?

25

Из-за следующего предупреждения в mysqld.log:

[Предупреждение] Небезопасный оператор записывается в двоичный журнал с использованием формата оператора, поскольку BINLOG_FORMAT = STATEMENT. Оператор небезопасен, потому что он использует предложение LIMIT. Это небезопасно, поскольку набор включенных строк не может быть предсказан.

Я хочу переключить формат репликации на MIXED.

Но согласно документу MySQL:

Переключение формата репликации во время выполнения не рекомендуется при наличии каких-либо временных таблиц, поскольку временные таблицы регистрируются только при использовании репликации на основе операторов, тогда как при репликации на основе строк они не регистрируются.

Итак, вопрос в том, как определить, существуют ли временные таблицы для безопасного переключения двоичного формата журнала?

кванты
источник
1
Быстрое предупреждение. Обращайте внимание на это, когда переходите из RBR-> SBR и используете read- commit
Морган Токер,

Ответы:

35

Поскольку binlog будет иметь определенный формат в тот момент, когда вы это сделаете, вы можете решить не играть вместе с этими двумя форматами, хотя MySQL (например, Oracle [все еще не может откатить мой язык]) создал эту функцию.

Для полной безопасности без перезапуска MySQL попробуйте следующее:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Это оставит последний binlog в формате «MIXED». Существует предпоследний (следующий за последним) бинлог, который просто закрывает последний бинлог, который был в предыдущем формате.

Все существующие сеансы до первого FLUSH LOGS;начнут записываться в последний binlog, как только UNLOCK TABLES;будут выполнены.

Попробуйте!

ПРЕДОСТЕРЕЖЕНИЕ

Давая кредит, где кредит должен, мой ответ действительно совмещает с ответом @ Джонатана . Я просто закрываю и открываю журналы поверх этого. Он получает +1 за то, что вывел это первым.

ОБНОВЛЕНИЕ 2011-10-12 13:58 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Если вы делаете это с активным Мастером, и есть один или несколько подчиненных, реплицирующих с этого Мастера, вам также следует позаботиться о том, чтобы журналы ретрансляции были в новом формате. Вот что вы можете сделать:

На Рабе беги STOP SLAVE;

На Мастере запустите эти:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

На Рабе беги START SLAVE;

Запуск STOP SLAVE;и START SLAVE;вращение журналов ретрансляции и вызывает репликацию новых записей в зависимости от формата. Вы можете также применить изменение binlog_format в подчиненном устройстве.

RolandoMySQLDBA
источник
3
Следует иметь в виду, что параметры репликации mysql фактически устанавливаются для каждого сеанса клиента. Установка глобального binlog_format просто меняет значение для новых сессий. Таким образом, если вы запускаете его в системе с постоянно подключенными клиентами, любые изменения, внесенные вами в настройки, не будут применены немедленно, даже если вы выполните сброс и блокировку, как указано здесь, - они не вступят в силу, пока клиенты Переподключиться (или установить значение в своем сеансе, но, по моему опыту, первое более вероятно).
Остин Миллс
Для тех, кому интересно, вы также можете поместить это "binlog_format = 'MIXED';" в ваш my.cnf.
Кристиан
2
К вашему сведению, этот ответ не согласуется с ответом здесь: dba.stackexchange.com/questions/58539/…
HTTP500
В руководстве говорится : Это означает, что изменение формата ведения журнала на ведущем устройстве репликации не приводит к тому, что ведомое устройство изменяет свой формат ведения журнала для соответствия. (..snip ..) Изменение двоичного формата ведения журнала на главном сервере во время репликации или без его изменения на ведомом устройстве может, таким образом, привести к непредвиденным результатам или даже вообще вызвать сбой репликации.
Halfgaar
@Halfgaar Только на прошлой неделе я трижды переключал раба с MIXED на STATEMENT без каких-либо побочных эффектов. Я делал это, потому что репликация нарушалась из-за состояния гонки. Таблица перестала существовать на ведомом устройстве до выполнения запроса. Итак, я переключился на ЗАЯВЛЕНИЕ на стабильную, как эта ситуация. Конечно, все записи были остановлены, пока я делал это. Кстати, я тоже сделал Мастер.
RolandoMySQLDBA
6

Для переключения binlog_format во время выполнения вы можете сделать:

set global binlog_format = 'MIXED';

Это установит все НОВЫЕ сеансы в смешанный формат binlog. Все существующие сеансы будут такими, какие были установлены ранее, до их окончания.

Вы также можете сделать это set session binlog_format = 'MIXED';вручную, чтобы решить любые проблемы со сессией специально.

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