Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.
一.问题描述
014-12-15 20:00:29 4398 [Warning] Unsafe statement written to the binary log using statement format since
BINLOG_FORMAT = STATEMENT. INSERT… ON DUPLICATE KEY UPDATE on a table with more than
one UNIQUE KEY is unsafe Statement: INSERT INTO longxibendi
(lxid
, l_id
, l_aplply
, l_types
, ctimes
) VALUES
(75692, 218, 8, 2, 1418644829) ON DUPLICATE KEY
UPDATE ctimes
=1418644829
一个mysql master 的err log 报上面的错误。
二.问题原因
查了下原因,longxibendi这个表上有2个唯一键。则使用 INSERT… ON DUPLICATE KEY UPDATE ,且当前数据库binlog_format是statement格式,这种sql语句就会报unsafe。
查了下手册
http://dev.mysql.com/doc/refman/5.6/en/replication-rbr-safe-unsafe.html
看官方解释,是 server层把数据传给innodb引擎,innodb引擎检查key值比较敏感造成的。
个人理解,可能与server与innodb每次只传1行数据有关。
三.问题解决
两种办法:
1.修改binlog_format格式为mixed;
登陆mysql,执行 set global binlog_format=MIXED;
2.不要使用这类sql;
其中,第1种方法,需要注意下。
如果是 master->slave 结构的数据库架构。并且 slave上开启了 log_slave_updates。那么在master上修改完binlog格式,开启了log_slave_updates的从库,会同布中断。
所以,需要先在 slave上,设置 binlog_format=mixed,之后再在master上设置。slave报错信息如下:
Last_SQL_Errno: 1666
Last_SQL_Error: Error executing row event: 'Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'
from:http://blog.csdn.net/longxibendi/article/details/41948941