MySQL数据库中如何选择binlog的格式

  介绍

这期内容当中小编将会给大家带来有关MySQL数据库中如何选择binlog的格式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、binlog的三种模式

1。语句级别模式

每一条会修改数据的sql都会记录到主人的bin-log中.slave在复制的时候sql进程会解析成和原主人端来执行过的相同的sql来再次执行。

优点:语句级别下的优点,首先就是解决了行级下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约io,提高性能。因为他只需要记录在主人上所执行的语句的细节,以及执行语句时候的上下文的信息。

缺点:由于它是记录的执行语句,所以为了让这些语句在奴隶端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在奴隶端被执行的时候能够得到和在主端执行时候相同的结果。另外就是,由于mysql现在发展比较快,很多的新功能加入,使mysql的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,错误也就越容易出现。在语句级别下,目前已经发现的就有不少情况会造成mysql的复制问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如睡眠()在有些版本就不能正确复制。

2。rowlevel模式

日志中会记录成每一行数据被修改的形式,然后在奴隶端再对相同的数据进行修改

优点:bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以行级的日志的内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或功能,以及触发的调用和触发无法被正确复制的问题。

缺点:行级下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改记录,这样可能会产生大量的日志内容,比如有这样一条更新语句:更新产品集owner_member_id=& # 39; d # 39;owner_member_id=& # 39;一个# 39;,执行之后,日志中记录的不是这条更新语句所对应的事件(mysql是以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多事件。自然,bin-log日志的量会很大。

3。混合模式

实际上就是前两种模式的结合,在混合模式下,mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在声明和行之间选一种。新版本中的语句级别还是和以前一样,仅仅记录执行的语句。而新版本的mysql中对行级模式被做了优化,并不是所有的修改都会以行级来记录,像遇到表结构变更的时候就会以声明模式来记录,如果sql语句确实就是更新或者删除等修改数据的语句,那么还是会记录所有行的变更。

二,我们使用binlog时应该选择什么格式呢

通过上面的介绍我们知道了binlog_format为声明在一些场景下能够节省IO,加快同步速度,但是对于InnoDB这种事务引擎,在授权读取,读未提交隔离级别或者参数innodb_locks_unsafe_for_binlog为时,禁止binlog_format=声明下的写入,同时对于binlog_format=混合这种对于非事务引擎,其他隔离级别默认格写声明式的模式也只会记录行格式。

在选择@@tx_isolation;   +----------------+   | @@tx_isolation |   +----------------+   |读取提交|   +----------------+      比;创建表t (c1 int)引擎=innodb;      比;设置binlog_format=声明;      比;(1)插入t值;   错误1665 (HY000):不能执行语句:无法写入二进制日志BINLOG_FORMAT=声明以来,至少> mysql>显示变量如& # 39;innodb_locks_unsafe_for_binlog& # 39;;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | | Variable_name |值   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | innodb_locks_unsafe_for_binlog | |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   1行集(0.01秒)

即RR级别及以上除了行锁还会加锁的差距。但如果该参数设置为,对于当前读就不会加锁的差距,即在RR隔离级别下需要加锁的另一个重要当前读蜕化为读取提交,所以如果此参数设置为上时即便使用的事务隔离级别为Repetable-Read也不能保证从库数据的正确性。

五、总结

对于线上业务,如果使用InnoDB等事务引擎,除非保证RR及以上隔离级别的写入,一定不要设置为binlog_format为声明,否则业务就无法写入了。而对于binlog_format为混合模式,RR隔离级别以下这些事务引擎也一定写入的是行事件。

MySQL数据库中如何选择binlog的格式