![MySQL binlog 格式困境?](https://linux22.com/image/563115/MySQL%20binlog%20%E6%A0%BC%E5%BC%8F%E5%9B%B0%E5%A2%83%EF%BC%9F.png)
MySQL 版本:5.5.13
如果我将 binlog 格式设置为STATEMENT
,我会收到以下警告在大师:
[警告] 由于 BINLOG_FORMAT = STATEMENT,使用语句格式将不安全的语句写入二进制日志。语句不安全,因为它使用可能在从属服务器上返回不同值的系统函数...
我还阅读了复制存储过程和功能的局限性:http://dev.mysql.com/doc/refman/5.5/en/stored-programs-logging.html
但如果我切换MIXED
到mysqld.log
在奴隶显示:
[警告] 从属 SQL:无法在表 hdcn.sessions 上执行 Update_rows 事件;在“sessions”中找不到记录,Error_code:1032;处理程序错误 HA_ERR_KEY_NOT_FOUND;事件的主日志 mysql-bin.003834,end_log_pos 602692401,Error_code:1032
[警告] 从属 SQL:无法在表 reportingdb.102_rpt_clickview 上执行 Delete_rows 事件;在“102_rpt_clickview”中找不到记录,Error_code:1032;处理程序错误 HA_ERR_END_OF_FILE;事件的主日志 mysql-bin.003834,end_log_pos 725203511,Error_code:1032
看起来MIXED
binlog 格式导致 Master 不能完全复制到 Slave。
我切换回了STATEMENT
格式。我可以忽略不安全警告吗?
答案1
我假设您在一个设置上完成了此操作,而无需清理从属设备并从头开始进行设置。
基于语句的复制的错误消息告诉您,您的应用程序使用了一些无法使用基于语句的复制进行复制的命令。例如,以下查询
INSERT INTO t (t) VALUES(NOW())
NOW()
在主服务器和从服务器上执行时将返回不同的值。
这样一来,主服务器和从服务器上的数据就会有所不同。这很糟糕,因为根据从服务器的不同,客户端会读取不同的数据,而后续的写入操作会更改其他数据,因此最终得到的数据会更加不同。
现在您切换到混合复制,这可能会对某些语句使用基于行的复制。使用 RBR 您确实需要完全相同的数据,因为很难识别已更改的行并更新它们。
那么你应该怎么做呢? - 将你的主服务器配置为使用混合日志记录,然后使用一致的快照设置从服务器。
答案2
您必须消除插入、更新、打开临时表等的所有机会......
- 在从属服务器上:
停止从属; 使用读锁刷新表;
- 在 Master 上:
使用读锁刷新表; 设置全局 binlog_format='MIXED'; 解锁表格;
- 在从属服务器上:
解锁表格; 启动从属;