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 更改。
要在运行时切换 binlog_format,您可以执行以下操作:
set global binlog_format = 'MIXED';
Run Code Online (Sandbox Code Playgroud)
这会将所有新会话设置为混合二进制日志格式。所有现有会话将是之前设置的任何内容,直到它们结束。
您也可以set session binlog_format = 'MIXED';手动解决任何会话问题。