解析数据:
在buf中记录了很多信息,但我们的目的是为了解析出数据,因此可以跳过一些字节,直接到达我们的目标数据头部。
cols = buf[27]; //在insert/delete/update事件中,buf[27]表示列的个数
bits = (cols+7)/8
对于WRITE_ROWS_EVENT、DELETE_ROWS_EVENT: ptr = buf +28+bits
对于UPDATE_ROWS_EVENT:ptr = buf +28+bits * 2
从ptr开始,记录了我们需要解析的数据。
1) UPDATE_ROWS_EVENT
Old record New record Old record New record Old record ……
每更新了多少行,就有多少对 old/new record,当一个事件包存储不下所有记录时,将会拆分成多个 UPDATE_ROWS_EVENT事件。
2) WRITE_ROWS_EVENT
包含一条插入的数据record
3) DELETE_ROWS_EVENT
包含被删除的数据record,格式为:
record record record ……
从上面的分析可以看出,要想从binlog中解析出数据,除了辅助信息外,关键是要从record中获取得到行数据,因为DML操作对应的事件类型,都以record为记录单位。