前言:
       二进制日记录了数据库执行更改的操作,如Insert,Update,Delete等。不包括Select等不影响数据库记录的操作,因为没有对数据进行修改。二进制主要的功能有:复制(Replication)和恢复(Recovery)。具体的二进制里面的格式表示的意思请见这篇文章
       MySQL记录的日志有三种模式:STATEMENT、ROW、MIXED,这3个到底有什么区别呢?对Replication有什么区别呢?本文开始进行一些说明,如有遗漏请大家补充。
一,大小:日志产生量。
Client1:

View Code

Client2:

View Code

Client3:

View Code

除了binlog_format不一样之外,其他都是一样的。先看下事务操作的日志大小(物理)。删除数据:

delete from me_info where id < 2153269;

查看他们日志的大小:发现ROW 和 其他2个大小不一致,而MIXED和STATEMENT一致。通过mysqlbinlog 发现他们记录的格式ROW不同于STATEMENT和MIXED。

-rw-rw---- 1 mysql adm 3.7M 2012-12-31 16:19 mysql-bin.000001
-rw-rw---- 1 mysql adm  207 2012-12-31 16:19 mysql-bin2.000001
-rw-rw---- 1 mysql adm  207 2012-12-31 16:19 mysql-bin3.000001

小结1:
       通过上面的说明得出一点是ROW格式比MIX和STATEMENT要大,原因是ROW记录的是记录更新后的值(不需要记录上下文信息),而其他2个模式记录的只是一个逻辑的SQL语句(需要记录上下文信息),具体格式可以看这里的ROW日志信息。因为上面的表删除了3W的记录,ROW模式会记录每一条删除语句,所以日志会很大。这也说明将格式设置成ROW,对于磁盘空间的要求增加了,而复制采用传输二进制日志方式实现的,所以复制的网络开销也有增加。所以最后的结果是:ROW>STATEMENT=MIXED

二,复制:对复制产生的影响
表:

MySQL Binlog 【ROW】和【STATEMENT】选择(转)
root@127.0.0.1 : rep_test 05:38:06>desc user;
+---------------+--------------+------+-----+---------------------+----------------+
| Field         | Type         | Null | Key | Default             | Extra          |
+---------------+--------------+------+-----+---------------------+----------------+
| id            | int(11)      | NO   | PRI | NULL                | auto_increment |
| username      | varchar(20)  | NO   | UNI |                     |                |
| status        | int(4)       | YES  | MUL | NULL                |                |
…………………………………………
…………………………………………
…………………………………………
+---------------+--------------+------+-----+---------------------+----------------+
42 rows in set (0.03 sec)
MySQL Binlog 【ROW】和【STATEMENT】选择(转)

相关文章: