在运行时切换二进制日志格式的最安全方法是什么?


25

由于出现以下警告mysqld.log

[警告]由于BINLOG_FORMAT = STATEMENT,因此使用语句格式将不安全的语句写入二进制日志。该语句不安全,因为它使用LIMIT子句。这是不安全的,因为无法预测其中包含的行集。

我想将复制格式切换为MIXED

但是根据MySQL文档:

不存在任何临时表时,建议不要在运行时切换复制格式,因为临时表仅在使用基于语句的复制时才记录,而在基于行的复制中则不记录。

因此,问题是如何确定是否存在任何临时表来安全地切换二进制日志格式?


1
快速警告。从RBR-> SBR并使用已提交提交的内容时,请当心:bugs.mysql.com/bug.php?id=62493
Morgan Tocker 2011年

Answers:


35

由于执行此操作时二进制日志将具有特定格式,因此尽管MySQL(eh Oracle [仍然无法摆脱我的声音])构建了此功能,但您可能决定不一起使用这两种格式。

要完全安全地播放它而无需重新启动mysql,请尝试以下操作:

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

这将以“ MIXED”格式保留最后一个binlog。倒数第二个(紧随其后的)二进制日志的存在仅是关闭前一个格式的最后一个二进制日志。

FLUSH LOGS;一旦UNLOCK TABLES;执行,第一个之前的所有现有会话将开始写入最后一个二进制日志。

试试看 !!!

警告

在应得的信贷额度上给予信贷,我的答案真的是@带@Jonathan的答案。我只是关闭并打开二进制日志。他因首先提出来而获得+1。

更新美国东部时间2011-10-12 13:58

如果您对活动的主服务器执行此操作,并且从该主服务器复制了一个或多个从服务器,则需要注意中继日志也采用新格式。您可以执行以下操作:

在从站上,运行 STOP SLAVE;

在Master上运行以下命令:

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只会更改NEW会话的值。因此,如果您在持久连接客户端的系统上运行它,则即使您按此处指定的方法进行刷新和锁定,对设置所做的任何更改也不会立即生效-这些更改直到客户端生效重新连接(或在他们自己的会话中设置值,但以我的经验,前者更有可能)。
奥斯汀·米尔斯

对于那些好奇的人,您也可以将这个“ binlog_format ='MIXED';” 进入您的my.cnf。
基督教徒

2
仅供参考,这个答案是不同意与答案在这里:dba.stackexchange.com/questions/58539/...
HTTP500

手册指出:这意味着更改复制主服务器上的日志记录格式不会导致从属服务器更改其匹配的日志记录格式。(.snip ..)在复制过程中更改主记录上的二进制日志记录格式,或者在从属记录上也未更改二进制记录格式,可能会导致意外结果,甚至导致复制完全失败。
Halfgaar 2014年

@Halfgaar就在上周,我将奴隶从MIXED切换到STATEMENT了三次,没有任何不良影响。我这样做是因为复制由于竞争条件而中断。执行查询之前,该表在从属服务器上不存在。因此,我切换到STATEMENT来保持稳定。当然,在执行此操作时,所有写操作都停止了。顺便说一句,我也做了大师。
RolandoMySQLDBA 2014年

6

要在运行时切换binlog_format,您可以执行以下操作:

set global binlog_format = 'MIXED';

这会将所有新会话设置为混合binlog格式。所有现有的会话将是之前设置的任何会话,直到它们结束。

您也可以set session binlog_format = 'MIXED';手动解决特定的会话问题。


我不问方法,我问最安全的方法,以及如何检查是否存在任何临时表。
量子

3
最安全的方法是先设置全局变量,然后等待其余会话结束。
乔纳森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.