浅析MySQL二进制日志
作者:网络转载 发布时间:[ 2012/9/25 9:48:34 ] 推荐标签:
2.3 查询语句
查询语句的类型是Query事件,这也是常见的事件,用来存储主库上执行的语句,其实除了实际执行的语句外,这个事件还要包含一些附加的信息。如在写入一行数据中含有AUTO_INCREMENT的字段,我们执行一下写入,然后可以看到日志事件中多了哪些事件:
执行下面语句:
insert into i_node(name,value) values("sql","copy");
可以得到多了两条日志事件
| master-bin.000004 | 451 | Intvar | 1 | 479 | INSERT_ID=12 |
| master-bin.000004 | 479 | Query | 1 | 596 | use `db_info`; insert into i_node(name,value) values("sql","copy") |
+-------------------+-----+-------------+-----------+-------------+-----------------------------------------------------------------------------+
其实除此以外,还有其它的一些上下文信息会给当前的执行带来结果的影响,这些都是MySQL执行时需要知道的隐式信息。如:
1、当前数据库。可以看到我执行insert时,并没有执行use db_info这条语句,但是也被日志事件记录下来。因为我在初执行了,后面MYSQL都采用当前的数据库来执行语句。
2、用户自定义变量的值。如我执行下面两条语句之后
mysql> set @value = 'copy-on-write';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into i_node(name,value) values("sql",@value);
Query OK, 1 row affected (0.00 sec)
可以看到此时的日志事件如下:
| master-bin.000004 | 596 | Intvar | 1 | 624 | INSERT_ID=13 |
| master-bin.000004 | 624 | User var | 1 | 675 | @`value`=_latin1 0x636F70792D6F6E2D7772697465 COLLATE latin1_swedish_ci |
| master-bin.000004 | 675 | Query | 1 | 792 | use `db_info`; insert into i_node(name,value) values("sql",@value) |
多了一个变量的赋值操作,类型是User var
3、RAND()函数的种子。在执行随机数时,不会记录其随机数,会记录其种子数。
4、当前时间。
5、AUTO_INCREMENT字段的插入值,这个是一个上下文,因为它与前面的行有关。
6、LAST_INSERT_ID函数。
7、线程ID,调用CORRENT_ID函数。

sales@spasvo.com