binlog有三种模式,分别是statement(语句模式)、row(行模式)、mixed(混合模式),通过binlog_format参数来进行控制,下面我们来简单看一下这三种模式。
statement模式:
首先来看一下语句模式,下图是测试数据
执行一条update语句
mysql> update from user set name='root' where id>=3;
一共修改了三条数据,我们来看一下binlog的记录内容
可以看到,binlog中记录了我们上面执行的命令。为了保证数据的一致性,有时候还需要记录上下文信息,如下图中截取的binlog日志,以下是我执行的命令:
mysql> set @a=rand();
mysql> insert into user values(6,@a);
binlog不会去记录变量a的赋值语句,但当我执行insert使用到该变量时,binlog会对变量的情况进行记录。
statement模式下产生的binlog较少,但是存在一些函数会导致发生主从复制时数据不一致的情况。
row模式:
我们将数据修改回初始的状态,然后再次执行相同的update命令修改三行数据,来看一下binlog中记录的内容
可以看到,我们修改了三行数据,binlog中清晰的记录了每一行数据的具体修改,把什么修改成了什么。但是所产生的binlog要比statement模式多很多。
mixed模式:
mixed模式就是statement模式和row模式的结合,执行语句之后,mysql会自动判断使用什么模式去记录binlog。