欢迎来到天天文库
浏览记录
ID:39466467
大小:27.00 KB
页数:4页
时间:2019-07-04
《MySQL binlog 日志格式(Mixed,Statement,Row)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、MySQLbinlog日志格式(Mixed,Statement,Row)MySQL5.5中对于二进制日志(binlog)有3种不同的格式可选:Mixed,Statement,Row,默认格式是Statement。总结一下这三种格式日志的优缺点。MySQLReplication复制可以是基于一条语句(StatementLevel),也可以是基于一条记录(RowLevel),可以在MySQL的配置参数中设定这个复制级别,不同复制级别的设置会影响到Master端的bin-log日志格式。1.Row日志中会记录成每一行数
2、据被修改的形式,然后在slave端再对相同的数据进行修改。优点:在row模式下,bin-log中可以不记录执行的SQL语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程或function,以及trigger的调用和触发无法被正确复制的问题。缺点:在row模式下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update
3、语句:1UPDATEproductSETowner_member_id='b'WHEREowner_member_id='a'执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大。尤其是当执行altertable之类的语句的时候,产生的日志量是惊人的。因为MySQL对于altertable之类的表结构变更语句的处理方式是整个表的每一条记录
4、都需要变动,实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。2.Statement每一条会修改数据的SQL都会记录到master的bin-log中。slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。优点:在statement模式下,首先就是解决了row模式的缺点,不需要记录每一行数据的变化,减少了bin-log日志量,节省I/O以及存储资源,提高性能。因为他只需要记录在master上所执行的语句的细节,以及执行语句时候的上下文的信息。缺点:在statemen
5、t模式下,由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于MySQL现在发展比较快,很多的新功能不断的加入,使MySQL的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement中,目前已经发现的就有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些特定的函数或
6、者功能的时候会出现,比如:sleep()函数在有些版本中就不能被正确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row是基于每一行来记录的变化,所以不会出现类似的问题。3.Mixed从官方文档中看到,之前的MySQL一直都只有基于statement的复制模式,直到5.1.5版本的MySQL才开始支持row复制。从5.0开始,MySQL的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给MySQLReplica
7、tion又带来了更大的新挑战。另外,看到官方文档说,从5.1.8版本开始,MySQL提供了除Statement和Row之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在Mixed模式下,MySQL会根据执行的每一条具体的SQL语句来区分对待记录的日志形式,也就是在statement和row之间选择一种。新版本中的statment还是和以前一样,仅仅记录执行的语句。而新版本的MySQL中对row模式也被做了优化,并不是所有的修改都会以row模式来记录,比如遇到表结构变更的时候就会以statement模
8、式来记录,如果SQL语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。其他参考信息除以下几种情况外,在运行时可以动态改变binlog的格式:.存储流程或者触发器中间;.启用了NDB;.当前会话使用row模式,并且已打开了临时表;如果binlog采用了Mixed模式,那么在以下几种情况下会自动将binlog的模式由statement模式变
此文档下载收益归作者所有