获取Binlog事件:
Mysql对Binlog的处理是以事件为单位的,每一次DML操作可能会产生多次事件,例如对于innodb存储引擎,会额外产生一条QUERY_EVENT(事务的begin语句)以及XID_EVENT(事务提交)。
通过调用libmysql.so库中的cli_safe_read()函数可以获取一次binlog事件:
cli_safe_read(mm); // mm类型为MYSQL*
net = &mm->net;
buf = (const char*) net->read_pos + 1;
Binlog的事件类型大约有27种,这里只介绍与ROW模式相关的事件
1) QUERY_EVENT:与STATEMENT模式处理相同,存储的是SQL,主要是一些与数据无关的操作,eg: begin、drop table;
2) TABLE_MAP_EVENT:记录了下一条事件所对应的表信息,在其中存储了数据库名和表名;
3) WRITE_ROWS_EVENT:操作类型为insert;
4) UPDATE_ROWS_EVENT:操作类型为update;
5) DELETE_ROWS_EVENT:操作类型为delete;
6) XID_EVENT, 用于标识事务提交。
在buf[EVENT_TYPE_OFFSET]中记录了事件的类型 (EVENT_TYPE_OFFSET = 4),根据其中记录的整数,对比log_event.h中的Log_event_type,可以找到相应的事件类型。
以一条insert语句为例,包含4个事件:
TABLE_MAP_EVENT
QUERY_EVENT (begin)
WRITE_ROWS_EVENT
XID_EVENT