MySQL 复制使用哪种 binlog 格式?

MySQL 复制使用哪种 binlog 格式?

即将开始使用 MySQL 复制,我想知道哪种 binlog 格式最好用?有 Row、Statement 和 Mixed。

我将使用 5.1.49。

目前 Row 是赢家,但我只是想知道为什么我应该使用 Mixed 而不是 Row。

非常感谢,

德伦达

答案1

基于语句的复制速度最快、最紧凑,但在某些情况下,它在从服务器上产生的结果可能与在主服务器上产生的结果不同(非确定性),从而导致不一致。例如:

UPDATE mytable SET a = a + 1 LIMIT 1;

无法保证哪行会被更新,因为没有排序顺序,并且磁盘上的顺序不可预测或不一致。

基于行的复制通过复制更改的数据而不是查询来避免此问题,但是如下语句:

UPDATE mytable SET a = a + 1;

无论基于语句的复制影响多少行,它只需要复制几个字节:如果它更新 100 万行,基于行的复制将复制所有 100 万行,这会慢得多并且会创建更大的二进制日志。

混合模式在两者之间切换,使用最有效或最安全的模式(例如,简单的插入可能最好通过基于行的复制来完成 - 使用语句可能会更慢)。出现问题的机会在于识别哪些语句是非确定性的,这是一个不平凡的问题。

总之:

  • 基于行:始终安全,但可能非常慢,在时间和空间上效率低下
  • 基于语句:并不总是安全,但可能更快
  • 混合模式:理论上是两全其美的,但可能会出错,从而导致性能缓慢或数据错误,具体取决于出错的方式!

官方文档是这里

这也是一个老问题:现在你应该使用 MySQL 5.5 进行任何新构建。我更喜欢 Percona 的构建。

相关内容