MySQL复制格式小结

基于语句级的复制
binlog=statement
 
优点:
(1)binlog文件较小。
(2)日志是包含用户执行的原始SQL,方便统计和审计。
(3)出现最早可binlog、兼容较好。
(4)binlog方便阅读,方便故障修复。
 
缺点:
(1)存在安全隐患,一些执行结果不确定的DML语句,可能导致主从不一致。
(2)UDF(用户创建的函数)和存储过程的结果也不确定,因为具体的返回值受传入的参数值的影响。
(3)对一些系统函数不能准确复制或是不能复制:load file()、uuid()、user()、found rows()、sysdate()。

 
基于行级的复制
binlog=row
优点:
(1)发生更改的数据行的实际记录。相比statement更加安全的复制格式。
(2)在某些情况下复制速度更快(SQL复杂、表有主键)。
(3)系统的特殊函数也可以复制。
(4)更少的锁。
 
缺点:
(1)binary log比较大(MySQL 5.6 支持binlog row image)。
(2)单语句更新/删除的表执行过多,会形成大量binlog。
(3)无法从binlog看见用户执行的SQL(MySQL5.6增加一个新的Event binlog_rw_query_log_event记录用户的query)。
 
 
基于混合级复制
(1)混个使用ROW和statement格式,对于DDL记录会stement,对于TABLE里的行操作记录为ROW格式。
(2)如果使用innodb表,事务级别使用了read commeitted or read uncommitted 日志级别只能使用row格式。
(3)单在使用row格式中DDL语句还是会记录成statement格式。
(4)mixed格式,那么在以下几种情况会自动将binlog的模式由SBR模式改成RBR。
(5)当DML语句更新一个NDB表时。
(6)当函数中包含UUID()时。
(7)2个及以上包含AUTO_INCREMENT字段的表被更新时。
(8)行任何INSERT DELAYED语句时。
(9)用UDF时。
(10)视图中必须要求使用RBR时,例如创建视图是使用了UUID()函数。
 
采用哪种复制格式
生产环境里面全部采用 row格式。


 

posted @ 2018-08-01 13:58  屠魔的少年  阅读(110)  评论(0)    收藏  举报