MySQL 复制使用哪种 binlog 格式?

del*_*nda 8 mysql database mysql-replication replication

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

我将使用 5.1.49。

Row 目前正在获胜,但我只是想知道为什么我应该使用混合而不是行。

非常感谢,

德伦达

Syn*_*hro 11

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

UPDATE mytable SET a = a + 1 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

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

基于行的复制通过复制更改的数据而不是查询来避免这个问题,但是像这样的语句:

UPDATE mytable SET a = a + 1;
Run Code Online (Sandbox Code Playgroud)

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

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

总之:

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

官方文档在这里

这也是一个老问题:您现在应该将 MySQL 5.5 用于任何新版本。我更喜欢 Percona 的构建。