MySQL binlog格式三种形式介绍

  

本文主要给大家简单讲讲MySQL binlog格式三种形式,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL binlog格式三种形式这篇文章可以给大家带来一些实际帮助。

分析(本文碰到的案例):

查看MySQL binlog格式

 dba@192.168.111.4: dba_test 02:33:39>显示变量如& # 39;binlog_format % & # 39;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+ - - - - - - - - - - - - - - - - - - - - - - - - - + | Variable_name | | +价值- - - - - - - - - - - - - - - - - - - - - - - - - + + | binlog_format混合| | + - - - - - - - - - - - - - - - - - - - - - - - - - + 

测试语句:

 dba@192.168.111.4: dba_test 02:24:14>创建表tmp_test (int id、名称varchar(64),年龄int,主键(id)引擎=innodb; 
查询好,0行影响(0.05秒)

dba@192.168.111.4: dba_test 02:24:23>插入tmp_test值(1 & # 39;aaa # 39;, 11);
查询好了,1行影响(0.02秒)

dba@192.168.111.4: dba_test 02:25:17>插入tmp_test值(2 & # 39;bbb # 39;, 22);
查询好了,1行影响(0.02秒)

dba@192.168.111.4: dba_test 02:25:23>插入tmp_test值(3 & # 39;ccc # 39;, 33);
查询好了,1行影响(0.01秒)

dba@192.168.111.4: dba_test 02:25:28>插入tmp_test值(4日& # 39;ddd # 39;, 44);
查询好了,1行影响(0.01秒)

dba@192.168.111.4: dba_test 02:25:34>插入tmp_test值(5 & # 39;eee # 39;, 55);
查询好了,1行影响(0.01秒)

dba@192.168.111.4: dba_test 02:25:42>从tmp_test select *, + - - - + - - - + - - - - - - | + | id名称|年龄,| + - - - - - - - - - - - - - - - - - + + |,1 | aaa, |,11 | |,2 | bbb, |,ccc, 22日| |,3 | |,33 | |,ddd, 4 | |,44 | |,5 | eee, |,55 | +——+——+——+ 5行组(0.01秒)

dba@192.168.111.4: dba_test 02:25:50>创建表tmp_test_bak (int id、名称varchar(64),年龄int,主键(id)引擎=innodb;
查询好,0行影响(0.03秒)

dba@192.168.111.4: dba_test 02:26:31>插入tmp_test_bak tmp_test select *;,# # #记录成了行模式查询好了,五行影响(0.03秒)
记录:5,重复:0,警告:0

Binlog记录图:

癕ySQL

问题来了,我想要出来的Binlog格式是声明,而不是行。而一条插入结核病select * from ta的简单语句在混合模式下记录了行模式的Binlog。原因是什么?

首先确实在一些特定的情况下,不一会被转换模成行式:

。当DML语句更新一个NDB表时,
。当函数中包含UUID()时,
。2个及以上包含AUTO_INCREMENT字段的表被更新时,
。执行插入延迟语句时,
。用UDF时,
。视图中必须要求运用行时,例如建立视图时使用了UUID()函数;

上面来自网络,有兴趣的可以自己测试测试。而对于本文中的sql,符合不了上面的条件,但binlog也记录成格了行式,所以还是很奇怪为什么binlog格式被转换了,日常工作的时候有遇到过执行一条sql,会报一个警告:

<>之前警告:不安全的语句写入二进制日志使用语句格式自BINLOG_FORMAT=声明

难道因为这个导致转换的?因为上面的sql可以重现,没有报警告,所以这个情况排除。根据经验想到了一个参数:innodb_locks_unsafe_for_binlog,看到里面讲到事务隔离级别,那就看看隔离级别的情况:

 dba@192.168.111.4: dba_test 05:46:56>选择@@global.tx_isolation; + - - - - - - - - - - - - - - - - - - - - - - - - + | @@global。tx_isolation | + - - - - - - - - - - - - - - - - - - - - - - - - + |读取提交,,,,| + - - - - - - - - - - - - - - - - - - - - - - - - + 1行组(0.01秒)

dba@192.168.111.4: dba_test 06:36:45>选择@@session.tx_isolation; + - - - - - - - - - - - - - - - - - - - - - - - - + | @@session。tx_isolation | + - - - - - - - - - - - - - - - - - - - - - - - - + |读取提交,,,,| + - - - - - - - - - - - - - - - - - - - - - - - - + 1行组(0.01秒)

看到隔离级别是提交读,即不可重复读。把事务隔离级别设置成默认的,可重复读:

 dba@192.168.111.4: dba_test 06:41:02>会话设置事务隔离级别可重复读;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
查询好,0行影响(0.14秒)

dba@192.168.111.4: dba_test 06:41:42>选择@@session.tx_isolation; + - - - - - - - - - - - - - - - - - - - - - - - - + | @@session。tx_isolation | + - - - - - - - - - - - - - - - - - - - - - - - - + |可重复读,,,,| + - - - - - - - - - - - - - - - - - - - - - - - - + 1行组(0.00秒)

再执行测试里的SQL,发现这时候混合的binlog记录了声明格式,正常了,符合预期了。难道就是这个事务隔离级别的问题引起的?在手册里发现了这句:

MySQL binlog格式三种形式介绍