MySQL binlog 格式困境?

MySQL binlog 格式困境?

MySQL 版本:5.5.13

如果我将 binlog 格式设置为STATEMENT,我会收到以下警告在大师

[警告] 由于 BINLOG_FORMAT = STATEMENT,使用语句格式将不安全的语句写入二进制日志。语句不安全,因为它使用可能在从属服务器上返回不同值的系统函数...

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

但如果我切换MIXEDmysqld.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

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

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

答案1

我假设您在一个设置上完成了此操作,而无需清理从属设备并从头开始进行设置。

基于语句的复制的错误消息告诉您,您的应用程序使用了一些无法使用基于语句的复制进行复制的命令。例如,以下查询

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

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

这样一来,主服务器和从服务器上的数据就会有所不同。这很糟糕,因为根据从服务器的不同,客户端会读取不同的数据,而后续的写入操作会更改其他数据,因此最终得到的数据会更加不同。

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

那么你应该怎么做呢? - 将你的主服务器配置为使用混合日志记录,然后使用一致的快照设置从服务器。

答案2

您必须消除插入、更新、打开临时表等的所有机会......

  1. 在从属服务器上:
停止从属;
使用读锁刷新表;
  1. 在 Master 上:
使用读锁刷新表;
设置全局 binlog_format='MIXED';
解锁表格;
  1. 在从属服务器上:
解锁表格;
启动从属;

相关内容