Advantages of statement-based replication
1 技术成熟
2 对于大量的更新删除等操作,仅仅会写入少量的变更结果,加速日志获取或者备份的速度
3 日志文件包含了所有更改的语句,可以用来做验证数据库
Disadvantages of statement-based replication
1.1 在UDF自定义函数中的语句 1.2 在DELETE和UPATE中没有使用order by 进行限制的字句 1.3 以下函数不能在语句格式中进行复制 load_file() uuid() user() found_rows() 等,now()函数除外 1.4 相比行格式,insert ...select 需要更多的行级锁 1.5 相比行格式,update语句需要锁住大量的行来进行表扫描 1.6 对于InnoDB:使用AUTO_INCREMENT会阻塞其他不冲突的INSERT语句(这里大概是因为自增都是通过同一个锁来控制的,所以会阻塞叼其他insert语句) 1.7 在复杂的语句中,行被更新或者插入之前,在从服务器上会对语句进行评估和执行。如果是行复制,从服务器只需要更改受影响的行而不需要去处理所有的表 1.8 在从库执行复杂语句中,由于评估错误,随着时间的超时,会对行的影响慢慢增多 1.9 存储函数使用跟调用函数相同的now()时候,并不是存储过程真实的情况 2.1 确定性UDF必须应用在从属上。 2.2 主和从的表的定义必须要一致
Advantages of row-based replication
1 所有的更改都可以被复制,是一种安全的复制 2 对于主库而言只有少量的行锁,从而实现较高的并发性 2.1 insert ...select 2.2 带有auto_increment的insert语句 2.3 对于update或delete语句,使用where字句不使用键或者不会更改大多数已经检查的行 2.4 在从库中任意使用insert ,update或delete语句只需要少量的行锁
Disadvantages of row-based replication
1 RBR格式在日志中会昌盛更多的数据记录,复制DML语句,语句格式仅仅是记录这条语句到二进制日志,二航个事, 将每行的改变记录进去,如果更改的行数越多,就会产生的数据写入到二进制日志则越多,这样的话可以使回滚 成为现实。由于记录每行的变更,锁住的时间将会更长,从而会引起并发的性能问题。可以使用binlog_row_image=minimal 来减少这个并发问题 2 确定性的UDF函数在基于航个事的复制情况下会产生大量的BLOB值从而是复制的时间变成。 3 你不能在从库上查看从主库传输过来的的语句,但是你可以通过mysqlbinlog带上--base64-output=decode-rows 和--verbose参数来查看改变的数据 4 对于使用MyISAM存储引擎的表,在将INSERT语句作为基于行的事件应用于二进制日志时,在将INSERT语句应用于语句时需要更强的锁定。 这意味着在使用基于行的复制时不支持MyISAM表上的并发插入。
以上为语句格式和行格式方面的优缺点,基于目前的复制和各个中间件的使用情况看,所有的数据库,都建议采用RBR的格式,而在5.7.7之后的版本,RBR也变成了默认的格式来支持生产的需求