Sam*_*Sam 5 mysql replication mysql-5 mysql-5.1 binlog
在生产中使用 MySQL 复制之前,我们正在对其进行测试。在我们的案例中,MySQL 是由 Puppet 设置的,我注意到 master 和 slave 之间的 binlog_format 设置不同。
在主人上:
mysql> show variables like 'binlog_format' \G
*************************** 1. row ***************************
Variable_name: binlog_format
Value: ROW
Run Code Online (Sandbox Code Playgroud)
在奴隶上:
mysql> show variables like 'binlog_format' \G
*************************** 1. row ***************************
Variable_name: binlog_format
Value: STATEMENT
Run Code Online (Sandbox Code Playgroud)
有时,复制会中断并显示类似于以下内容的错误:
Last_SQL_Error:无法在表 test.pruning 上执行 Delete_rows 事件;在“修剪”中找不到记录,错误代码:1032;处理程序错误 HA_ERR_KEY_NOT_FOUND; 事件的主日志 mysql-bin.000002, end_log_pos 1448
不知道是不是master和slave的binlog_format设置不同导致的。
上述错误可能是由这种不一致的设置引起的吗?我应该将奴隶更改为基于“行”的格式吗?很难重现该错误,因此我正在寻找我们应该遵循的最佳实践,而且我们对 MySQL 非常陌生。
您收到的错误消息
\n\n\n\n\nLast_SQL_Error: 无法在表 test.pruning 上执行 Delete_rows 事件;无法在\xe2\x80\x99中找到\xe2\x80\x98pruning\xe2\x80\x99的记录,Error_code: 1032; 处理程序错误 HA_ERR_KEY_NOT_FOUND;事件\xe2\x80\x99s主日志mysql-bin.000002,end_log_pos 1448
\n
使用基于行的复制执行 DELETE 查询时可能会出现此消息。不幸的是,这是基于行的复制的缺点之一:
\n\n\n\n\n\n
\n\n- 基于行的复制的缺点
\nRBR 可以生成更多必须记录的数据。要复制 DML 语句(例如 UPDATE 或 DELETE 语句),基于语句的复制仅将该语句写入二进制日志。相比之下,基于行的复制将每个更改的行写入二进制日志。如果语句更改了许多行,基于行的复制可能会向二进制日志写入更多的数据;即使对于回滚的语句也是如此。这也意味着从备份中获取和恢复可能需要更多时间。另外,二进制日志写入数据时会被锁定较长的时间,这可能会导致并发问题。
\n
我已经解决了类似的问题(error 1032在我对 \n MySQL master 主复制的回答中,可以安全地删除两个主服务器上的行?)DELETE查询是问题所在。
在你的情况下,因为奴隶正在使用STATEMENT,因此行更改预计是主站和从站之间主键的精确匹配。在很多情况下,情况可能并非如此。这就是错误 1032 存在的原因。
为了安全起见,
\n\nMIXED和 Slave ROW。至少,STATEMENT如果主站不是,请避免使用从站STATEMENT。