it-swarm.dev

Jaki jest najbezpieczniejszy sposób zmiany formatu binlog w czasie wykonywania?

Z powodu następującego ostrzeżenia w mysqld.log:

[Ostrzeżenie] Niebezpieczna instrukcja zapisana w dzienniku binarnym przy użyciu formatu instrukcji, ponieważ BINLOG_FORMAT = STATEMENT. Instrukcja jest niebezpieczna, ponieważ używa klauzuli LIMIT. Jest to niebezpieczne, ponieważ nie można przewidzieć zestawu zawartych wierszy.

Chcę zmienić format replikacji na MIXED.

Ale zgodnie z dokumentem MySQL:

Przełączanie formatu replikacji w czasie wykonywania nie jest zalecane, jeśli istnieją tabele tymczasowe, ponieważ tabele tymczasowe są rejestrowane tylko w przypadku replikacji opartej na instrukcjach, natomiast w przypadku replikacji wierszowej nie są rejestrowane.

Pytanie brzmi: w jaki sposób mogę stwierdzić, czy istnieją tabele tymczasowe umożliwiające bezpieczne przełączanie formatu dziennika binarnego?

25
quanta

Ponieważ binlog będzie miał określony format w chwili, gdy to zrobisz, możesz zdecydować się nie grać razem z tymi dwoma formatami, chociaż MySQL (eh Oracle [wciąż nie może zrzucić mojego języka]) zbudował tę funkcję.

Aby zagrać całkowicie bezpiecznie bez ponownego uruchomienia mysql, spróbuj wykonać następujące czynności:

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

Spowoduje to pozostawienie ostatniego binlogu w formacie „MIXED”. Przedostatni (obok ostatniego) binlog istnieje po prostu przynosząc zamknięcie ostatniego binlogu, który był w poprzednim formacie.

Wszystkie istniejące sesje przed pierwszym FLUSH LOGS; zacznie pisać w ostatnim binlogu raz UNLOCK TABLES; jest wykonywany.

Spróbuj !!!

CAVEAT

Udzielanie kredytu tam, gdzie należny jest kredyt, moja odpowiedź naprawdę polega na odpowiedź Jonathana . Poza tym po prostu zamykam i otwieram binlogi. Otrzymuje +1 za wydobycie tego jako pierwszego.

AKTUALIZACJA 2011-10-12 13:58 EDT

Jeśli robisz to aktywnemu Mistrzowi i istnieje co najmniej jeden Slave replikujący się z tego Mistrza, musisz się martwić, że dzienniki przekaźników mają również nowy format. Oto, co możesz zrobić:

W Slave uruchom STOP SLAVE;

W trybie głównym uruchom następujące:

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

W Slave uruchom START SLAVE;

Bieganie STOP SLAVE; i START SLAVE; obraca dzienniki przekazywania i powoduje, że nowe wpisy są replikowane w dowolnym formacie. Możesz także zastosować zmianę binlog_format w slave.

35
RolandoMySQLDBA

Aby przełączyć format_loglog w czasie wykonywania, możesz:

set global binlog_format = 'MIXED';

Spowoduje to ustawienie wszystkich NOWYCH sesji na mieszany format binlog. Wszystkie istniejące sesje będą miały wszystko, co zostało ustawione wcześniej, aż do ich zakończenia.

Możesz także zrobić set session binlog_format = 'MIXED'; ręcznie, aby rozwiązać problemy z konkretną sesją.

6
Jonathan