MySQL二进制日志的三种模式解析

原文出自 http://www.abcdocker.com/abcdocker/213

Row Level 行模式

日志会记录每一行数据被修改的形式,然后在slave端再对相同的数据进行修改
优点:在 row level模式下,bin-log中可以不记录执行sql语句的上下文相关的信息,仅仅只需要记录哪一条被修改。所以row level的日志内容会非常清楚的记录每一行数据修改的细节。不会出现某些特定的情况下的储存过程或者function,以及trigger的调用和触发无法被正确复制的问题。
缺点:row level 所有的执行的语句当记录到日志中的是后,都将以每行记录的修改来记录,会产生大量的日志内容。

Statement Leve (默认)

每一条会修改数据的sql语句都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的的相同的sql来再次执行。
优点:statement leve下的优点就是解决了row level下的缺点,不需要记录每一行的数据变化,减少bin-log日志量,节约IO,提高性能。
缺点:由于只记录,所以,在statement level下已经发现不少情况会造成MySQL的复制出现问题,主要是修改数据库的时候使用某些特定的函数或者功能的是会出现。

Mixed 自动模式

在该模式下,MySQL会根据执行的sql语句来区分对待记录日志的格式,也就是在statement和Row之前选择一种,如果sql语句确实就是update或者delete等修改数据的语句,那么还会记录所有行的变更。
###解析行模式和语句模式的区别
如果我们有要删除一百万条记录,在行模式(ROW )日志会记载100万条删除命令,而语句模式(ststement)只需记录一条delete * from test

企业场景如何选择binlog的模式

1、如果生产中使用MySQL的特殊功能相对较少(储存过程,触发器,函数),选择默认的语句模式即Statement Level。
2、如果生产中使用MySQL的特殊功能比较多的,可以选用Mixed模式。
3、如果生产中使用MySQL的特殊功能较多,有些昂数据最大化一致,此时最好Row level模式,但要注意该模式的日志量将非常大。

查看binlog模式

mysql> show global variables like "%binlog_format%"

配置binlog日志模式

# vim my.cnf   
#在[mysql]模块中配置
log-bin = /data/3306/mysql-bin
binlog_format="STATEMENT"
#binlog_format="ROW"
#binlog_format="MIXED"
也可以修改环境变量来修改binlog的模式
mysql> SET global binlog_format='STATEMENT'

你可能感兴趣的:(mysql)