解析MYSQL BINLOG 二進位制格式(4)--TABLE_MAP_EVENT
原創:轉載請說明出處謝謝!
上接
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
並且可以看到和解析出來的一模一樣
上接
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
包含了大量的關於表的原資料,也是在保證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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL二進位制檔案(binlog)MySql
- 如何在MySQL中檢視binlog二進位制日誌?MySql
- office檔案格式複合文件二進位制結構解析
- 二進位制求5個1的格式。。。。
- 利用vstruct解析二進位制資料Struct
- 二進位制與二進位制運算
- MySQL二進位制日誌的三種格式優缺點比較MySql
- 進位制詳解:二進位制、八進位制和十六進位制
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 【Linux合集】二進位制安裝mysqlLinuxMySql
- mysql 二進位制日誌總結MySql
- MySQL 壓縮二進位制日誌MySql
- 二進位制
- (二進位制)
- 十進位制——二 (八、十六 )進位制
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- MySQL二進位制日誌Mixed格式轉化為row格式的六種情況總結MySql
- Ubuntu 24.04 二進位制安裝 MySQL 8.0.20UbuntuMySql
- mysql二進位制日誌是什麼MySql
- centos 7 二進位制安裝mysql 5.7.25CentOSMySql
- RHEL 7.2 安裝二進位制MySQL 5.7.18MySql
- 二進位制、十進位制與十六進位制相互轉化
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制轉十進位制快速方法
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- Android逆向(一) —— AndroidManifest.xml 二進位制解析AndroidXML
- 什麼是二進位制?二進位制如何轉換?
- 04 二進位制
- Cocoapods 二進位制
- leetcode -- 二進位制LeetCode
- 使用canal偷取MySQL的二進位制日誌MySql
- 十進位制轉二進位制推導(草稿)
- JavaScript十進位制轉換為二進位制JavaScript
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- C++資料格式化5 - uint轉換成十六進位制字串&二進位制的data列印成十六進位制字串C++UI字串
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”