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


8

我有一个系统(从另一个开发公司继承),但是我还不知道其所有功能。构造:
-网络客户端/应用程序(symfony 1.4)
-数据库-MySQL。

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

当DB Master的Web客户端修改数据时,DB Slave可以正常工作,并且数据具有正常的复制过程。当MySQL Management Client修改数据时,我会收到一条通知:

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

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

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

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

Answers:


18

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

  1. 声明

    这意味着主服务器上的每个SQL语句都记录在日志中,并在从服务器上执行。如果SQL语句包含诸如“ NOW()”,“ RAND()”之类的语句以及任何不确定性的语句,则可能导致问题。这也需要使用中的存储引擎的支持。

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

  3. 混合的

    这样,MySQL可以根据需要在基于二进制的记录和基于行的记录之间进行选择。

如果遇到此错误,建议将BINLOG_FORMAT变量更改为MIXED。这样,MySQL可以根据需要在基于ROW和STATEMENT的日志记录之间自动切换。


对!优秀的!
Chaki_Black 2014年

4
一个很好的建议,但是您如何更改BINLOG_FORMAT?
Trebor Rude 2015年

2
可能已经很晚了,但是它可以为所有想知道如何更改BINLOG_FORMATdba.stackexchange.com/questions/6150/…的人提供帮助
Vivek Dhayalan

Trebor Rude:您应该阅读mysql文档,其中对此进行了详细说明!dev.mysql.com/doc/refman/5.6/en/...
Lifeboy

这个答案可以帮助我解决问题。谢谢!
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.