it-swarm-eu.dev

Jaký je nejbezpečnější způsob, jak přepnout formát binlogu za běhu?

Z důvodu následujícího upozornění v mysqld.log:

[Upozornění] Nebezpečný příkaz zapsaný do binárního protokolu pomocí formátu příkazu, protože BINLOG_FORMAT = STATEMENT. Příkaz je nebezpečný, protože používá klauzuli LIMIT. To není bezpečné, protože nelze zahrnout sadu řádků, které lze zahrnout.

Chci přepnout formát replikace na MIXED.

Ale podle dokumentu MySQL:

Přepínání formátu replikace za běhu se nedoporučuje, pokud existují nějaké dočasné tabulky, protože dočasné tabulky jsou protokolovány pouze při použití replikace založené na příkazech, zatímco u replikace založené na řádcích nejsou protokolovány.

Otázkou tedy je, jak mohu zjistit, zda existují nějaké dočasné tabulky pro bezpečné přepínání formátu binárního protokolu?

25
quanta

Protože binlog bude mít v tuto chvíli specifický formát, můžete se rozhodnout nehrát společně s těmito dvěma formáty, i když tuto funkci vytvořil MySQL (eh Oracle [stále nelze zavřít můj jazyk]).

Chcete-li ji hrát zcela bezpečně bez restartu mysql, zkuste následující:

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

Tím zůstane poslední binlog ve formátu „MIXED“. Penultimiate (vedle posledního) binlog existuje, pouze zavře poslední binlog, který byl v předchozím formátu.

Všechny existující relace před první FLUSH LOGS; začne psát v posledním binlogu jednou UNLOCK TABLES; je provedeno.

Pokusit se !!!

CAVEAT

Když dostanu úvěr, kde je splatný kredit, moje odpověď je opravdu naskakující z @ Jonathanova odpověď . Kromě toho jen zavírám a otevírám blogy. Dostane +1 za to, že to vyjde první.

AKTUALIZACE 2011-10-12 13:58 EDT

Pokud tak učiníte s aktivním Masterem a existuje jeden nebo více Slaves replikujících se z tohoto Master, musíte se také starat o to, aby byly protokoly relé v novém formátu. Co můžete udělat:

Na slave spusťte STOP SLAVE;

Na Master běží tyto:

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

Na slave spusťte START SLAVE;

Běh STOP SLAVE; a START SLAVE; otočí protokoly relé a způsobí, že nové položky budou replikovány v libovolném formátu. Možná budete chtít také použít změnu binlog_format ve slave.

35
RolandoMySQLDBA

Chcete-li přepnout binlog_format za běhu, můžete:

set global binlog_format = 'MIXED';

Tím se nastaví, že všechny NOVÉ relace budou smíšené ve formátu binlog. Všechny existující relace budou, co bylo nastaveno dříve, dokud neskončí.

Můžete také udělat set session binlog_format = 'MIXED'; ručně vyřešit problémy s relací konkrétně.

6
Jonathan