在运行时切换 binlog 格式的最安全方法是什么?

qua*_*nta 28 mysql replication binlog

由于以下警告mysqld.log

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

我想将复制格式切换为MIXED.

但根据 MySQL 文档:

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

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

Rol*_*DBA 36

由于在您执行此操作时 binlog 将具有特定格式,因此您可能决定不将这两种格式放在一起赌博,尽管 MySQL(呃 Oracle [仍然无法摆脱我的舌头])构建了此功能。

要在不重启 mysql 的情况下完全安全地玩,请尝试以下操作:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

这将以“混合”格式保留最后一个二进制日志。倒数第二个(倒数第二个)binlog 的存在只是关闭了以前格式的最后一个 binlog。

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

试一试 !!!

警告

在信用到期的地方给予信用,我的答案实际上是在@Jonathan的回答中捎带。我只是关闭并打开二进制日志。他因首先提出这一点而获得+1。

更新 2011-10-12 13:58 EDT

如果您对一个活动的 Master 执行此操作,并且有一个或多个从该 Master 复制的 Slave,则您还需要关注中继日志是否采用新格式。您可以执行以下操作:

在 Slave 上,运行 STOP SLAVE;

在 Master 上运行这些:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

在 Slave 上,运行 START SLAVE;

运行STOP SLAVE;START SLAVE;轮换中继日志并导致新条目以任何格式进行复制。您可能还想在从站中应用 binlog_format 更改。

  • 要记住的一件事是 mysql 复制设置实际上是在每个客户端会话的基础上设置的。设置全局 binlog_format 只会更改 NEW 会话的值。因此,如果您在客户端持续连接的系统上运行它,即使您按照此处指定的方式执行刷新和锁定,您对设置所做的任何更改也不会立即适用——它们在客户端之前不会生效重新连接(或在他们自己的会话中设置值,但根据我的经验,前者更有可能)。 (3认同)
  • 仅供参考,此答案与此处的答案不一致:https://dba.stackexchange.com/questions/58539/is-the-mysql-replicas-data-consistent-if-the-master-was-switched-to -binlog-form (2认同)

Jon*_*han 6

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

set global binlog_format = 'MIXED';
Run Code Online (Sandbox Code Playgroud)

这会将所有新会话设置为混合二进制日志格式。所有现有会话将是之前设置的任何内容,直到它们结束。

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

  • 首先设置全局变量并等待剩余会话完成是最安全的方法。 (3认同)