浅析MySQL二进制日志

一般情况下,二进制日志更多的用于数据库的同步,因为二进制日志记录了数据库的所有改变,可以使得SLAVE都可以执行同样的更新,其实二进制日志可以对数据库作一个写入回放,所以也可以用于统计或者即时恢复等其它的目的。

二进制日志仅仅包含可能改变数据库的语句,估计都很容易理解这个,但是那些还没有改变且有可能改变数据库的语句也会记录下来,比如drop table if exists或者是带有WHERE条件的UPDATE和DELETE语句。

一,二进制日志结构

二进制日志是一系列二进制日志事件(又称为binlog事件),其实就是很多文件【包括系列日志文件和一个日志索引文件】共同组成二进制日志,这里每个日志文件称为binlog文件,每个日志文件由很多个日志事件组成,每个日志文件都是以Format_description事件开头并且以日志轮换事件Rotate作为文件结束,如:

  1.   mysql> show binlog events in 'master-bin.000003';  
  2. +-------------------+-----+-------------+-----------+-------------+---------------------------------------+   
  3. | Log_name          | Pos | Event_type  | Server_id | End_log_pos | Info                                  |  
  4. +-------------------+-----+-------------+-----------+-------------+---------------------------------------+   
  5. | master-bin.000003 |   4 | Format_desc |         1 |         106 | Server ver: 5.1.34-log, Binlog ver: 4 |   
  6. | master-bin.000003 | 106 | Rotate      |         1 |         150 | master-bin.000004;pos=4               |   
  7. +-------------------+-----+-------------+-----------+-------------+---------------------------------------+   
  8. rows in set (0.00 sec)  

Format_description事件包含写日志文件的服务器信息以及日志文件格式,而Rotate事件包含下一个日志文件的文件名及其开始读取的位置。

除了这两个事件以外,日志文件中的其他事件都被分成一个组一个组的形式,在事务存储引擎中,每个组会对应一个事务,而其它有可能是一个语句,总之,日志文件中的事件要么是单个语句,要么是由多条语句组成的事务。

事件类型是有很多种,就是上面的Event_type在实际使用时,会有多个取值,但可以归纳为每个日志事件由三个部分组成:

  1. 通用头。这部分信息就是所有事件都具备的信息,包含一些基本的信息,比如事件类型以及事件的大小,以上面为例可以从Pos和End_log_pos计算出这条语句的大小。
  2. 提交头。这部分信息和特定的事件类型有关。
  3. 事件体。这部分信息存储事件的主要数据,因事件类型不同而不同,例如,事件是Query的时候,存储查询语句。

如下:

| master-bin.000004 | 180 | Query       |         1 |         297 | use `db_info`; insert into i_node(name,value) values("sql",@value)        

相关推荐