解析MYSQL BINLOG 二進位制格式(4)--TABLE_MAP_EVENT

gaopengtttt發表於2017-02-12
原創:轉載請說明出處謝謝!
上接
http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二進位制格式(1)--準備工作 
http://blog.itpub.net/7728585/viewspace-2133189/ 解析MYSQL BINLOG 二進位制格式(2)--FORMAT_DESCRIPTION_EVENT 
http://blog.itpub.net/7728585/viewspace-2133321/ 解析MYSQL BINLOG 二進位制格式(3)--QUERY_EVENT 


class:Table_map_log_event
event:TABLE_MAP_EVENT
event_code:19

本event只用於 row模式的bin log ,從5.1.5開始,其實這部分
包含了大量的關於表的原資料,也是在保證slave正確
複製資料的重要event

--fixed data 
  6 bytes 表ID
  2 bytes 保留
--variable data part
  1 bytes  資料庫名長度
  var-size 資料庫名字 0x00 結尾
  1 bytes  表名長度
  var-size 表名 0x00 結尾
  packed interger 欄位數量 注意這裡就是packed interger參考第一篇文章
  var-size 欄位型別,每一個位元組代表一個欄位,如下:
  typedef enum enum_field_types {
  MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
  MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
  MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
  MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
  MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
  MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
  MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
  MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
  MYSQL_TYPE_BIT,
  MYSQL_TYPE_TIMESTAMP2,
  MYSQL_TYPE_DATETIME2,
  MYSQL_TYPE_TIME2,
  MYSQL_TYPE_JSON=245,
  MYSQL_TYPE_NEWDECIMAL=246,
  MYSQL_TYPE_ENUM=247,
  MYSQL_TYPE_SET=248,
  MYSQL_TYPE_TINY_BLOB=249,
  MYSQL_TYPE_MEDIUM_BLOB=250,
  MYSQL_TYPE_LONG_BLOB=251,
  MYSQL_TYPE_BLOB=252,
  MYSQL_TYPE_VAR_STRING=253,
  MYSQL_TYPE_STRING=254,
  MYSQL_TYPE_GEOMETRY=255
} enum_field_types;
packed interger:metadata block 長度,注意這裡就是packed interger參考第一篇文章
var-size metadata block資料
var-size 每一位代表這個欄位的值是否為NULL,其長度為 INT((n+7)/8) n代表欄位數量

接下來具體解析一個
             --
00000200  bf ba 78 97 58 13 e5 6b  01 00 33 00 00 00 34 02  |..x.X..k..3...4.|
00000210  00 00 00 00 ae 00 00 00  00 00 01 00 04 74 65 73  |.............tes|
00000220  74 00 05 6d 79 62 69 6e  00 02 03 0f 02 3c 00 03  |t..mybin.....<..|
00000230  a1 23 ad 72


這次關於event header 部分就不解析了
ba 78 97 58 13 e5 6b 01 00 33 00 00 00 34 02
00 00 00 00
也就是這部分,直接進入event data部分
--fixed data part
ae 00 00 00  00 00 :表ID 174
01 00:保留
--variable data part
04:資料庫名長度 4位元組
74 65 73 74 00:資料庫名test 0x00結尾
05:表名長度 5位元組
6d 79 62 69 6e  00:表名mybin 0X00結尾
02:欄位數量 2個欄位
03:MYSQL_TYPE_LONG(4位元組int型別)
0f:MYSQL_TYPE_VARCHAR(varchar型別)
02:metadata lenth
3c 00:metadata block 第一個欄位不需要長度,第二個欄位為可變型別長度為60
03:00000011 都可以為NULL
a1 23 ad 72:CRC32 校驗4位元組

到此為止:表中的說明資料就出來了,在MYSQLBINLOG中會看到
# at 513
#170206  3:10:50 server id 93157  end_log_pos 564 CRC32 0x72ad23a1      Table_map: `test`.`mybin` mapped to number 174
以及在表中
### INSERT INTO `test`.`mybin`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
###   @2='gaopeng' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */


資訊:
CRC32 0x72ad23a1      Table_map: `test`.`mybin` mapped to number 174
明顯來自Table_map_log_event
而且類似/* VARSTRING(60) meta=60 nullable=1 is_null=0 */
中的 VARSTRING(60) meta=60 nullable=1 都來自於
Table_map_log_event
並且可以看到和解析出來的一模一樣

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2133429/,如需轉載,請註明出處,否則將追究法律責任。

相關文章