Qual è il modo più sicuro per cambiare il formato binlog in fase di esecuzione?


25

A causa del seguente avviso in mysqld.log:

[Avviso] Istruzione non sicura scritta nel registro binario utilizzando il formato dell'istruzione poiché BINLOG_FORMAT = STATEMENT. L'istruzione non è sicura perché utilizza una clausola LIMIT. Ciò non è sicuro perché non è possibile prevedere l'insieme di righe incluso.

Voglio cambiare il formato di replica a MIXED.

Ma secondo il documento MySQL:

Non è consigliabile cambiare il formato di replica in fase di runtime quando esistono tabelle temporanee, poiché le tabelle temporanee vengono registrate solo quando si utilizza la replica basata su istruzioni, mentre con la replica basata su righe non vengono registrate.

Quindi, la domanda è: come posso identificare se esistono delle tabelle temporanee per cambiare il formato del registro binario in modo sicuro?


1
Avviso rapido. Fai attenzione quando vai da RBR-> SBR e usi read-commit: bugs.mysql.com/bug.php?id=62493
Morgan Tocker,

Risposte:


35

Dal momento che un binlog avrà un formato specifico nel momento in cui lo fai, potresti decidere di non giocare insieme con i due formati sebbene MySQL (eh Oracle [non riesco ancora a mollare la lingua]) abbia creato questa funzione.

Per giocare in totale sicurezza senza un riavvio di mysql, prova quanto segue:

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

Questo lascerà l'ultimo binlog nel formato 'MIXED'. Il binlog penultimo (prossimo all'ultimo) esiste semplicemente porta alla chiusura l'ultimo binlog che era nel formato precedente.

Tutte le sessioni esistenti prima della prima FLUSH LOGS;inizieranno a scrivere nell'ultimo binlog una volta UNLOCK TABLES;eseguita.

Provaci !!!

AVVERTIMENTO

Dare credito quando il credito è dovuto, la mia risposta è davvero il piggyback della risposta @ Jonathan . Inoltre chiudo e apro i binlog. Ottiene un +1 per averlo messo in evidenza per primo.

AGGIORNAMENTO 2011-10-12 13:58 EDT

Se lo fai a un Master attivo e ci sono uno o più Slave che si replicano da quel Master, devi anche preoccuparti che i log dei relay siano nel nuovo formato. Ecco cosa puoi fare:

Sullo schiavo, corri STOP SLAVE;

Sul Master esegui questi:

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

Sullo schiavo, corri START SLAVE;

L'esecuzione STOP SLAVE;e la START SLAVE;rotazione dei registri di inoltro causano la replica delle nuove voci in qualsiasi formato. Potresti voler applicare la modifica binlog_format anche nello slave.


3
Una cosa da tenere a mente è che le impostazioni di replica di mysql sono effettivamente impostate su una base per sessione client. L'impostazione del binlog_format globale modifica semplicemente il valore per le NUOVE sessioni. Pertanto, se lo si esegue su un sistema con client connessi in modo persistente, eventuali modifiche apportate alle impostazioni non saranno immediatamente applicabili anche se si esegue lo svuotamento e il blocco come specificato qui - non avranno effetto fino a quando i client riconnettersi (o impostare il valore nella propria sessione, ma nella mia esperienza il primo è più probabile).
Austin Mills,

Per i curiosi, puoi anche inserire questo "binlog_format = 'MIXED';" nel tuo my.cnf.
Christian,

2
Cordiali saluti, questa risposta non è d'accordo con una risposta qui: dba.stackexchange.com/questions/58539/…
HTTP500

Il manuale afferma : Ciò significa che la modifica del formato di registrazione su un master di replica non fa corrispondere uno slave al suo formato di registrazione. (..snip ..) La modifica del formato di registrazione binaria sul master mentre è in corso la replica, o senza modificarla anche sullo slave può quindi causare risultati imprevisti o addirittura fallire del tutto.
Halfgaar,

@Halfgaar Proprio la scorsa settimana, ho cambiato tre volte uno schiavo da MIXED a STATEMENT senza effetti negativi. Lo stavo facendo perché la replica si stava rompendo a causa di una condizione di gara. La tabella è diventata inesistente su uno slave prima dell'esecuzione della query. Quindi, sono passato a STATEMENT per stabile come quella situazione. Naturalmente, tutte le scritture sono state interrotte mentre lo facevo. A proposito, ho fatto anche il Maestro.
RolandoMySQLDBA

6

Per cambiare binlog_format in fase di esecuzione puoi fare:

set global binlog_format = 'MIXED';

Questo imposterà tutte le NUOVE sessioni in formato binlog misto. Tutte le sessioni esistenti saranno quelle impostate in precedenza fino alla fine.

Puoi anche fare set session binlog_format = 'MIXED';manualmente per risolvere in modo specifico eventuali problemi con la sessione.


Non chiedo il modo, chiedo il modo più sicuro e come posso verificare se esistono delle tabelle temporanee.
quanta,

3
L'impostazione prima della variabile globale e l'attesa del completamento delle sessioni rimanenti è il modo più sicuro.
Jonathan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.