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,然后使用一致的快照设置从站。
你必须消除插入,更新,打开临时表等所有机会…
停止奴隶; 刷新带有读锁的表;
刷新带有读锁的表; 设置全局binlog_format ='MIXED'; 解锁表格;
解锁表格; 开始奴隶;