Statement is not safe to log in statement format

今天收到MySQL的报警:
100607 20:55:23 [Warning] Statement is not safe to log in statement format. Statement: update users set Status = ‘6’ , gmt_modified = now() where ecpnumber = ‘057181933005’ limit 1
以前没有遇到过,觉得非常奇怪。仔细一看,update limit 1。
MySQL的limit 1返回的1行数据并不能保证下次执行返回的还是同一行,估计MySQL就是由于这个原因报警出来。提醒我们:
update users set Status = ‘6’ , gmt_modified = now() where ecpnumber = ‘057181933005’ limit 1在主机执行,并以statement记录到本机的话是不安全的。为什么列,因为它是以statement方式记录下来的。以这个方式记录下来的binlog在备机上执行将同样经过SQL解析等步骤和我们手工提交到备机的情况基本一样。这样的话,备机更新的这条数据可能不是主机更新的那条数据。结果导致主备机数据不一致。
检查了数据库的设置,果然binlog_format为STATEMENT。
问题修复
1、对已经发生的问题修复:检查发现where ecpnumber = ‘057181933005’的条件对应的数据只有一条,也就是说,limit 1和不加limit 1都是同一个数据
2、避免新问题的发生。
a)跟应用方确认,请他们修改掉limit 1的这种方式。通过select查询到底有几条,到底需要更新哪个数据,从而确切的修改那一条数据。
b)修改MySQL数据库参数,数据库这边的修改很简单。set global binlog_format=mix;

may you success

Leave a Reply