MySQL的二进制日志格式的困境?

MySQL版本:5.5.13

如果我将binlog格式设置为STATEMENT ,则在主服务器上收到以下警告:

[Warning]自从BINLOG_FORMAT = STATEMENT以来,使用语句格式写入二进制日志的不安全语句。 语句是不安全的,因为它使用一个系统函数,可能会在从站上返回不同的值。

我还读了复制存储过程和函数的限制: http : //dev.mysql.com/doc/refman/5.5/en/stored-programs-logging.html

但是如果我切换到MIXED mysqld.log 上的 mysqld.log显示:

[警告]从属SQL:无法执行表hdcn.sessions上的Update_rows事件; 在“会话”中找不到logging,Error_code:1032; 处理程序错误HA_ERR_KEY_NOT_FOUND; 事件的主日志mysql-bin.003834,end_log_pos 602692401,Error_code:1032

[Warning]从属SQL:无法在表上执行Delete_rows事件reportingdb.102_rpt_clickview; 在'102_rpt_clickview'中找不到logging,Error_code:1032; 处理程序错误HA_ERR_END_OF_FILE; 事件的主日志mysql-bin.003834,end_log_pos 725203511,Error_code:1032

看起来像MIXED binlog格式导致Master不能完全复制到Slave。

我切换回STATEMENT格式。 我可以忽略不安全的警告吗?

我假设你在一个设置上做了这个,没有清理奴隶,并从头开始设置。

由于基于语句的复制的错误消息告诉您,您的应用程序使用了一些无法使用基于语句的复制进行复制的命令。 一个例子是一个类似的查询

 INSERT INTO t (t) VALUES(NOW()) 

NOW()将在主服务器和从服务器上执行时返回不同的值。

通过这样做,您可以在主站和从站上获得不同的数据。 这取决于你的奴隶,这是不好的,你的客户将读取不同的数据,随后的写入将改变其他数据,所以你最终的数据更加不同。

现在切换到混​​合复制,这可能会对某些语句使用基于行的复制。 对于RBR,您确实需要完全相同的数据,因为它很难识别已更改的行并进行更新。

那你该怎么办? – configuration您的主站使用混合日志logging,然后使用一致的快照设置从站。

你必须消除插入,更新,打开临时表等所有机会…

  1. 在奴隶(S):
停止奴隶;
刷新带有读锁的表;
  1. 主人:
刷新带有读锁的表;
设置全局binlog_format ='MIXED';
解锁表格;
  1. 在奴隶(S):
解锁表格;
开始奴隶;