首先,我们知道MySQL本身就带有replication的机制,我们需要伪造一个slave,向master注册,这样的话master才会发送binlog event。注册很简单,通过调用limysql.so中的cli_advanced_command(),指定binlog filename+position,向master发送COM_BINLOG_DUMP命令。在发送dump命令的时候,我们可以指定flag为BINLOG_DUMP_NON_BLOCK,这样master在没有可以发送的binlog event之后,就会返回一个EOF的包。数据包的具体格式如下:
例如COM_BINLOG_DUMP类型的数据包payload(数据包体)是这样的:
3.1.2接收事件
通过调用libmysql.so库中的cli_safe_read()函数,获得master发过来的数据,每次获得一个事件记录的数据,cli_safe_read()的返回值标示了从master发送过来的数据的数据字节数。而发送过来的数据保存在mysql->net->read_pos数组中。
3.2 Binlog事件
通过调用libmysql.so库中的cli_safe_read()函数可以获取一次binlog事件。
MySQL的Binlog事件类型有27种,在MySQL5.6之后增加到38种,但是我们只介绍与ROW模式相关的事件,所有的event都含有如下通用的事件结构:
+===============================+
| event header |
+================