关于MySQL Binlog类型的一个谣言

  众所周知,MySQL的Binlog可以是三种类型:Statement、Row、Mixed。Statement的特点是每次只存储一条语句,Row的特点是存储每行数据的变化情况,Mixed是前两种的混合。于是,网上很多资料都提到,Row模式下执行单条语句可能造成很多log条目,因为改变了表的结构,比如alter table,造成了每行数据都发生了变化。实际上,这个说法是错误的!

  alter table、drop table、create table等信息即使在Row模式下也不会产生大量的log条目,因为它还是记录的语句,而不是单行数据的变化情况。MySQL的官方文档是这么说的

wKioL1L40PWhQBPFAAIZpEuM2W0511.jpg

   如果使用binlog解析,也能看到alter、drop、create语句会在log里面体现为一个Query事件,在message字段记录了数据库语句。

   Mixed,选择性的使用面向行数据变化的Row方式记录,主要是面对一些未决语句(nondeterministic),考虑到安全问题,避免主从库之间数据出现不一致,比如语句面向多行插入,其中又有auto-increment的字段,数据库存储引擎不同,可能带来插入顺序不一样的问题,结果就是自增列数据不一致。

   Row和Statement的记录方式的选择,按照文档指出的如下规则:

wKiom1L41TDAIffAAAOotpOYYu8082.jpg

   这篇日志还不错,看不出什么问题来,可以用来参考。

http://blog.itpub.net/15480802/viewspace-758064

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章