MySQL 错误:无法写入二进制日志

Cha*_*ack 8 mysql logs errors

我有一个系统(从另一家开发公司继承),但我还不知道它的所有功能。构造:
- Web 客户端/应用程序(symfony 1.4)
- DB - MySQL。

项目部署在2台服务器上:
1-st:nginx服务器+PHP+DB Master;
2-st:DB 从站。

当数据在 DB Master 上被 web-client 修改时,DB Slave 运行良好,数据有正常的复制过程。当 MySQL 管理客户端修改数据时,我有一个通知:

无法执行语句:无法写入二进制日志,因为 BINLOG_FORMAT = STATEMENT 并且至少一个表使用仅限于基于行的日志记录的存储引擎。当事务隔离级别为 READ COMMITTED 或 READ UNCOMMITTED 时,InnoDB 仅限于行日志记录

然后,DB Slave 崩溃并且复制过程中断(错误插入...重复条目...)。

类似的通知发生(在这种情况下 - 错误)具有相同的文本,当我尝试使用 java 应用程序/模块(它在事务内运行)插入数据时,异常后,事务回滚并且不会发生任何修改。

如何解决这个问题并使系统正常工作并使DB Master和DB Slaves上的修改数据在正常模式下工作成为可能?

Phi*_*ner 18

MySQL 可以使用 3 种方法写入二进制日志:

  1. 陈述

    这意味着 master 上的每个 SQL 语句都会记录在日志中,并在 slave 上执行。如果 SQL 语句包含诸如“NOW()”、“RAND()”和任何不确定的语句,这可能会导致问题。这也需要使用中的存储引擎的支持。

  2. 这意味着被语句更改的每一行都单独记录在二进制日志中。这提供了比基于语句的日志记录更大的二进制日志(通常),但几乎总是保证提供所需的精确复制。

  3. 混合

    这允许 MySQL 根据需要在基于二进制和基于行的日志记录之间进行选择。

如果您收到此错误,一个建议是将 BINLOG_FORMAT 变量更改为 MIXED。这允许 MySQL 根据需要在基于 ROW 和 STATEMENT 的日志记录之间自动切换。

  • 一个很好的建议,但是您如何更改 BINLOG_FORMAT? (4认同)
  • 可能很晚了,但它可以帮助所有想知道如何更改 BINLOG_FORMAT http://dba.stackexchange.com/questions/6150/what-is-the-safest-way-to-switch-the-binlog 的人-format-at-runtime/6753#6753?newreg=1e7f12bd452b4a93945c79402565e180 (2认同)