binlog 日志的三种模式

Statement Level 语句模式

优点:不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能。因为它只需要在Master上所执行的语句细节,以及执行语句的上下文的信息。

缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些指定的函数或者功能的时候会出现。

使用以下函数的语句也无法被复制:

* LOAD_FILE()

* UUID()

* USER()

* FOUND_ROWS()

* SYSDATE() (除非启动时启用了 –sysdate-is-now选项)

同时在INSERT …SELECT 会产生比RBR更多的行级锁

 

 Row Level  行模式(5.7.7以后的默认模式)

优点:不记录执行的sql语句上下文相关的信息,仅仅只需要记录那一条被修改。

所以Row模式 的日志内容会记录下每一行数据修改的细节。不会出现某些特定的情况下的存储过程或函数,以及触发器的调用和触发无法被正确复制的问题

缺点:Row模式 所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样会造成binlog日志量会很大

 

Mixed 自动模式

在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句是update或delete等修改数据的语句,还是会记录所有行的变更。

 





binlog日志模式修改的方式

1 ,基于启动修改binlog日志格式

启动MySQL服务器来显式选择二进制日志格式 。支持的格式为: –binlog-format=type
    1,STATEMENT 使日志记录为基于语句格式。
    2,ROW 使日志记录为行格式。
    3,MIXED 使日志记录为混合格式。
在MySQL 5.7.7之前,基于语句的日志记录格式是默认的。在MySQL 5.7.7及更高版本中,基于行的记录格式是默认的。

 

2,基于my.cnf配置文件修改,参数如下:

1.[myslqd]

2.log-bin=mysql-bin

3.#binlog_format=STATEMENT

4.#binlog_format=ROW

5.#binlog_format=MIXED

3,临时修改

 临时修改如下(全局):
MySQL [(none)]> SET GLOBAL binlog_format=’ROW’;
MySQL [(none)]> SET GLOBAL binlog_format=’MIXED’;
MySQL [(none)]> SET GLOBAL binlog_format = ‘STATEMENT’;

临时修改如下(当前):
MySQL [(none)]> SET SESSION binlog_format=’ ROW ‘;
MySQL [(none)]> SET SESSION binlog_format=’MIXED’;
MySQL [(none)]> SET SESSION binlog_format=’STATEMENT’;

 

  • 查看binlog日志格式

MySQL [(none)]> show global variables like ‘%binlog_format%’; //查看全局

MySQL [(none)]> show variables like ‘%binlog_format%’; //查看当前

 

  • 查看binlog是否开启

MySQL [(none)]> show variables like ‘log_bin’;

 

  • 查看binlog列表

MySQL [(none)]> show binary logs;

 

  • 查看当前正在写入的binlog

MySQL [(none)]> show master status;

 

  • 查看第一个binlog日志内容

MySQL [(none)]> show binlog events;

 

  • 查看指定binlog日志内容

MySQL [(none)]> show binlog events in ‘mysql-bin.000002’;

 

  • 删除所有master的binlog 则从binlog 01 开始

MySQL [(none)]> reset master;