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格式。