即将开始使用 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 的构建。