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函数。