Який найбезпечніший спосіб переключити формат binlog під час виконання?


25

Через таке попередження в mysqld.log:

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

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

Але згідно з документом MySQL:

Перемикання формату реплікації під час виконання не рекомендується, коли існують тимчасові таблиці, оскільки тимчасові таблиці реєструються лише при використанні реплікації на основі висловлювань, тоді як при реплікації на основі рядків вони не реєструються.

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


1
Швидке попередження. Слідкуйте за цим, переходячи з RBR-> SBR та використовуючи функцію
Morgan Tocker,

Відповіді:


35

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

Щоб відтворити його повністю безпечно без перезавантаження mysql, спробуйте наступне:

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

Це залишить останній бінлог у форматі "MIXED". Передостанній (поруч із останнім) бінлог існує лише для закриття останнього бінолога, який був у попередньому форматі.

Усі існуючі сеанси до першого FLUSH LOGS;почнуть писати в останній бінлог, як тільки UNLOCK TABLES;буде виконано.

Спробувати !!!

КАВАТИ

Надаючи кредит там, де належить кредит, моя відповідь насправді несе відповідь на відповідь @ Джонатана . Я просто закриваю і відкриваю бінологи поверх цього. Він отримує +1 за те, що вивів це першим.

ОНОВЛЕННЯ 2011-10-12 13:58 EDT

Якщо ви робите це активному Мастеру і є один або кілька підлеглих, що реплікуються з цього Майстра, вам слід потурбуватися про те, щоб журнали ретрансляцій були у новому форматі. Ось що ви можете зробити:

На Раба, біжи 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 до підлеглого.


3
Потрібно пам’ятати, що налаштування реплікації mysql насправді встановлюється на основі сеансу для кожного клієнта. Встановлення глобального binlog_format просто змінює значення для нових сеансів. Таким чином, якщо ви запускаєте його в системі з постійно підключеними клієнтами, будь-які зміни, внесені в налаштування, не будуть застосовані негайно, навіть якщо ви виконаєте промивку та блокування, як зазначено тут - вони не набудуть чинності, поки клієнти відновити зв'язок (або встановити значення на власному сеансі, але, на мій досвід, це більш ймовірно).
Остін Міллз

Для тих, хто цікавиться, ви також можете поставити це "binlog_format = 'СМІШЕНО"; " у свій my.cnf.
Крістіан

2
FYI, ця відповідь не узгоджується з відповіддю тут: dba.stackexchange.com/questions/58539/…
HTTP500

У посібнику зазначено : Це означає, що зміна формату реєстрації в майстрі реплікації не призводить до того, що підлеглий змінює свій формат журналу на збіг. (..snip ..) Зміна формату двійкового ведення журналу на ведучому під час тривання реплікації, або без зміни його на підлеглому може, таким чином, спричинити несподівані результати або навіть призвести до відмови реплікації взагалі.
Halfgaar

@Halfgaar Тільки за минулий тиждень я тричі перейшов з раба з MIXED на STATEMENT без жодних негативних наслідків. Я робив це через те, що реплікація була порушена через стан перегонів. Таблиця стала неіснуючою на підлеглому до виконання запиту. Таким чином, я перейшов на STATEMENT до стабільної подібної ситуації. Звичайно, всі записи були припинені, поки я це робив. До речі, я зробив і Майстра.
RolandoMySQLDBA

6

Щоб переключити binlog_format під час виконання, ви можете:

set global binlog_format = 'MIXED';

Це встановить всі НОВІ сеанси змішаного формату бінарних файлів. Усі існуючі сеанси будуть встановлені раніше, поки вони не закінчаться.

Ви також можете зробити set session binlog_format = 'MIXED';вручну, щоб вирішити будь-які проблеми із сеансом конкретно.


Я не запитую шлях, я запитую найбезпечніший спосіб і як я можу перевірити, чи існують тимчасові таблиці.
кванта

3
Перша установка глобальної змінної та очікування завершення решти сеансів - найбезпечніший спосіб.
Джонатан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.