mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)
mysql> select * from t1 limit 2;
+----+------+------+
| id | a | b |
+----+------+------+
| 1 | 1000 | 1 |
| 2 | 999 | 2 |
+----+------+------+
2 rows in set (0.12 sec)
mysql> flush logs;
mysql> delete from t1 where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> flush logs;
mysql> show binlog events in 'mysql-bin.000041';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------+
| mysql-bin.000041 | 4 | Format_desc | 222 | 123 | Server ver: 5.7.27-log, Binlog ver: 4 | //第一个event事件
| mysql-bin.000041 | 123 | Previous_gtids | 222 | 194 | f7b23f20-f3ea-11e9-bdb9-080027781379:1183166 | //第二个event事件
| mysql-bin.000041 | 194 | Gtid | 222 | 259 | SET @@SESSION.GTID_NEXT= 'f7b23f20-f3ea-11e9-bdb9-080027781379:1183167' | //第三个event事件
| mysql-bin.000041 | 259 | Query | 222 | 332 | BEGIN | //第四个event事件
| mysql-bin.000041 | 332 | Rows_query | 222 | 381 | # delete from t1 where id=2 | //第五个event事件
| mysql-bin.000041 | 381 | Table_map | 222 | 429 | table_id: 109 (flydb.t1) | //第六个event事件
| mysql-bin.000041 | 429 | Delete_rows | 222 | 477 | table_id: 109 flags: STMT_END_F | //第七个event事件
| mysql-bin.000041 | 477 | Xid | 222 | 508 | COMMIT /* xid=39 */ | //第八个event事件
| mysql-bin.000041 | 508 | Rotate | 222 | 555 | mysql-bin.000042;pos=4 | //第九个event事件
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------------+
9 rows in set (0.24 sec)
--binlog二进制文件
[root@hostmysql80 mysql]# hexdump -C mysql-bin.000041
00000000 fe 62 69 6e 6f c7 e9 5d 0f de 00 00 00 77 00 00 |.bino..].....w..|
00000010 00 7b 00 00 00 00 00 04 00 35 2e 37 2e 32 37 2d |.{.......5.7.27-|
00000020 6c 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 |log.............|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 |................|
00000050 38 0d 00 08 00 12 00 04 04 04 04 12 00 00 5f 00 |8............._.|
00000060 04 1a 08 00 00 00 08 08 08 02 00 00 00 0a 0a 0a |................|
00000070 2a 2a 00 12 34 00 01 03 91 8e f3 6f c7 e9 5d 23 |**..4......o..]#|
00000080 de 00 00 00 47 00 00 00 c2 00 00 00 80 00 01 00 |....G...........|
00000090 00 00 00 00 00 00 f7 b2 3f 20 f3 ea 11 e9 bd b9 |........? ......|
000000a0 08 00 27 78 13 79 01 00 00 00 00 00 00 00 be 0d |..'x.y..........|
000000b0 12 00 00 00 00 00 bf 0d 12 00 00 00 00 00 2e 6a |...............j|
000000c0 9b b4 74 c7 e9 5d 21 de 00 00 00 41 00 00 00 03 |..t..]!....A....|
000000d0 01 00 00 00 00 00 f7 b2 3f 20 f3 ea 11 e9 bd b9 |........? ......|
000000e0 08 00 27 78 13 79 bf 0d 12 00 00 00 00 00 02 00 |..'x.y..........|
000000f0 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 8b |................|
00000100 63 18 cf 74 c7 e9 5d 02 de 00 00 00 49 00 00 00 |c..t..].....I...|
00000110 4c 01 00 00 08 00 07 00 00 00 00 00 00 00 05 00 |L...............|
00000120 00 1a 00 00 00 00 00 00 01 00 00 a0 55 00 00 00 |............U...|
00000130 00 06 03 73 74 64 04 21 00 21 00 53 00 66 6c 79 |...std.!.!.S.fly|
00000140 64 62 00 42 45 47 49 4e 81 46 d6 c5 74 c7 e9 5d |db.BEGIN.F..t..]|
00000150 1d de 00 00 00 31 00 00 00 7d 01 00 00 80 00 19 |.....1...}......|
00000160 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 77 |delete from t1 w|
00000170 68 65 72 65 20 69 64 3d 32 7b 0f 12 7b 74 c7 e9 |here id=2{..{t..|
00000180 5d 13 de 00 00 00 30 00 00 00 ad 01 00 00 00 00 |].....0.........|
00000190 6d 00 00 00 00 00 01 00 05 66 6c 79 64 62 00 02 |m........flydb..|
000001a0 74 31 00 03 03 03 03 00 06 43 7f c7 c4 74 c7 e9 |t1.......C...t..|
000001b0 5d 20 de 00 00 00 30 00 00 00 dd 01 00 00 00 00 |] ....0.........|
000001c0 6d 00 00 00 00 00 01 00 02 00 03 ff f8 02 00 00 |m...............|
000001d0 00 e7 03 00 00 02 00 00 00 92 db 84 85 74 c7 e9 |.............t..|
000001e0 5d 10 de 00 00 00 1f 00 00 00 fc 01 00 00 00 00 |]...............|
000001f0 27 00 00 00 00 00 00 00 ca 4b 6d 6a 76 c7 e9 5d |'........Kmjv..]|
00000200 04 de 00 00 00 2f 00 00 00 2b 02 00 00 00 00 04 |...../...+......|
00000210 00 00 00 00 00 00 00 6d 79 73 71 6c 2d 62 69 6e |.......mysql-bin|
00000220 2e 30 30 30 30 34 32 8d 46 93 00 |.000042.F..|
0000022b
event事件结构如下: 参考官网:https://dev.mysql.com/doc/internals/en/event-header-fields.html
--v4 event structure:
+=====================================+
| event | timestamp 0 : 4 | //4字节,时间
| header +----------------------------+
| | type_code 4 : 1 | //1字节,log_event_type类型,枚举详见如下《附1、log_event_type枚举》
| +----------------------------+
| | server_id 5 : 4 | //4字节,是mysql的server_id。 和show variables like '%server%';查看一致
| +----------------------------+
| | event_length 9 : 4 | //4字节,整个event的长度,包含固定和非固定长度
| +----------------------------+
| | next_position 13 : 4 | //4字节,下一个event的开始位置
| +----------------------------+
| | flags 17 : 2 | //2字节,详见如下《附2、flags 标识》
| +----------------------------+
| | extra_headers 19 : x-19 | //
+=====================================+
| event | fixed part x : y | //
| data +----------------------------+
| | variable part | //
+=====================================+
--3.1、:第一个event事件解析:FORMAT_DESCRIPTION_EVENT ,用于描述mysql的基本信息。在binary log切换时候生成。
00000000 fe 62 69 6e 6f c7 e9 5d 0f de 00 00 00 77 00 00 |.bino..].....w..| //每一个binlog文件都有4字节的魔法数,其值固定为:fe 62 69 6e
00000010 00 7b 00 00 00 00 00 04 00 35 2e 37 2e 32 37 2d |.{.......5.7.27-|
00000020 6c 6f 67 00 00 00 00 00 00 00 00 00 00 00 00 00 |log.............|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 |................|
00000050 38 0d 00 08 00 12 00 04 04 04 04 12 00 00 5f 00 |8............._.|
00000060 04 1a 08 00 00 00 08 08 08 02 00 00 00 0a 0a 0a |................|
00000070 2a 2a 00 12 34 00 01 03 91 8e f3 6f c7 e9 5d 23 |**..4......o..]#|
--3.1.1、FORMAT_DESCRIPTION_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x6f c7 e9 5d 小端显示为5DE9C76F,转换为十进制是1575602031。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602031'
Fri Dec 6 11:13:51 CST 2019
type_code 1 0x0f 转换为十进制是log_event_type为15,是FORMAT_DESCRIPTION_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x77 00 00 00 小端显示为00000077,转换为十进制是119。这个FORMAT_DESCRIPTION_EVENT的事件 从4开始(减去4字节魔法数),加上119 ,下个事件为123开始。
next_position 4 0x7b 00 00 00 小端显示为0000007b,转换为十进制是123。下个事件从123开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.1.2、FORMAT_DESCRIPTION_EVENT的event data的部分解析如下: 参考官网:https://dev.mysql.com/doc/internals/en/format-description-event.html
Name Size 16进制 Remarks
binlog-version 2 0x04 00 小端显示为0004,转换为十进制是4。 binlog是v4版本
mysql-server version 50 0x35 2e开始 16进制转字符为:5.7.27-log。 mysql是5.7.27-log版本
create timestamp 4 0x00 00 00 00 冗余的timestamp,都是0x00
event_header_length 1 0x13 小端显示为13,转换为十进制是19。是Binlog Event Header的长度
event type header lengths 可变 0x38 0d开始 显示了所有event的header的长度。 具体参见官网如上。
CRC32 4 0x03 91 8e f3 CRC32校验位
--3.1.3、mysqlbinlog解析的 第一个event事件(4-123字节) 如下:
[root@hostmysql80 mysql]# mysqlbinlog -vv mysql-bin.000041
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#191206 11:13:51 server id 222 end_log_pos 123 CRC32 0xf38e9103 Start: binlog v 4, server v 5.7.27-log created 191206 11:13:51
BINLOG '
b8fpXQ/eAAAAdwAAAHsAAAAAAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQORjvM=
'/*!*/;
# at 123
--3.2、:第二个event事件解析:PREVIOUS_GTIDS_LOG_EVENT,用于记录上一个binlog日志的最后一个gtid,一个binlog中只有一个此event事件
00000070 2a 2a 00 12 34 00 01 03 91 8e f3 6f c7 e9 5d 23 |**..4......o..]#|
00000080 de 00 00 00 47 00 00 00 c2 00 00 00 80 00 01 00 |....G...........|
00000090 00 00 00 00 00 00 f7 b2 3f 20 f3 ea 11 e9 bd b9 |........? ......|
000000a0 08 00 27 78 13 79 01 00 00 00 00 00 00 00 be 0d |..'x.y..........|
000000b0 12 00 00 00 00 00 bf 0d 12 00 00 00 00 00 2e 6a |...............j|
000000c0 9b b4 74 c7 e9 5d 21 de 00 00 00 41 00 00 00 03 |..t..]!....A....|
--3.2.1、PREVIOUS_GTIDS_LOG_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x6f c7 e9 5d 小端显示为5DE9C76F,转换为十进制是1575602031。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602031'
Fri Dec 6 11:13:51 CST 2019
type_code 1 0x23 转换为十进制是log_event_type为35,是PREVIOUS_GTIDS_LOG_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x47 00 00 00 小端显示为00000047,转换为十进制是71。这个PREVIOUS_GTIDS_LOG_EVENT的事件 从123开始,加上71 ,下个事件为194开始。
next_position 4 0xc2 00 00 00 小端显示为000000c2,转换为十进制是194。下个事件从194开始,和上面的可以对应上
flags 2 0x80 00 详见如下《附2、flags 标识》
--3.2.2、PREVIOUS_GTIDS_LOG_EVENT的event data的部分解析如下:
Name Size 16进制 Remarks
number of sids 8 0x01 00 00 00 00 00 00 00 小端显示为0000000000000001,转换为十进制是1。本Gtid set 有几个server_uuid
gtid:uuid 16 0xf7 b2 3f ..到.. 13 79 gtid:uuid 为:f7b23f20-f3ea-11e9-bdb9-080027781379
n_intervals 8 0x01 00 00 00 00 00 00 00 小端显示为0000000000000001,转换为十进制是1。本server_uuid下的gtid set interval的个数。
gtid:current_gno 8 0xbe 0d 12 00 00 00 00 00 gtid:current_gno 上个binlog最后一次事务的gno 小端为:0000000000120dbe,十进制为1183166
gtid:next_gno 8 0xbf 0d 12 00 00 00 00 00 gtid:next_gno 本次事务的gno 小端为:0000000000120dbf,十进制为1183167
CRC32 4 0x2e 6a 9b b4 CRC32校验位
--3.2.3、mysqlbinlog解析的 第二个event事件(123-194字节) 如下:
# at 123
#191206 11:13:51 server id 222 end_log_pos 194 CRC32 0xb49b6a2e Previous-GTIDs
# f7b23f20-f3ea-11e9-bdb9-080027781379:1183166
# at 194
--3.3、:第三个event事件解析:GTID_LOG_EVENT,用于本次事务的gtid信息的说明(也是事务的第一个事件)。但时间是事务提交的时间。
000000c0 9b b4 74 c7 e9 5d 21 de 00 00 00 41 00 00 00 03 |..t..]!....A....|
000000d0 01 00 00 00 00 00 f7 b2 3f 20 f3 ea 11 e9 bd b9 |........? ......|
000000e0 08 00 27 78 13 79 bf 0d 12 00 00 00 00 00 02 00 |..'x.y..........|
000000f0 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 8b |................|
00000100 63 18 cf 74 c7 e9 5d 02 de 00 00 00 49 00 00 00 |c..t..].....I...|
--3.3.1、GTID_LOG_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x21 转换为十进制是log_event_type为33,是GTID_LOG_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x41 00 00 00 小端显示为00000041,转换为十进制是65。这个GTID_LOG_EVENT的事件 从194开始,加上65 ,下个事件为259开始。
next_position 4 0x03 01 00 00 小端显示为00000103,转换为十进制是259。下个事件从259开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.3.2、GTID_LOG_EVENT的event data的部分解析如下:
Name Size 16进制 Remarks
flags 1 0x00 是否为ROW模式,是则为0x00,不是为0x01。 DDL都不是ROW模式,而是statement模式(所以正常的binlog解析 无法闪回DDL操作)。
gtid:uuid 16 0xf7 b2 3f ..到.. 13 79 gtid:uuid 为:f7b23f20-f3ea-11e9-bdb9-080027781379
gtid:next_gno 8 0xbf 0d 12 00 00 00 00 00 gtid:next_gno 本次事务的gno 小端为:0000000000120dbf,十进制为1183167
0x02 todo...
last_committed 8 0x00 00 00 00 00 00 00 00 last_committed。小端显示为0000000000000000,转换为十进制是0。
sequence_number 8 0x01 00 00 00 00 00 00 00 sequence_number。小端显示为0000000000000001,转换为十进制是1。
CRC32 4 0x8b 63 18 cf CRC32校验位
--3.3.3、mysqlbinlog解析的 第二个event事件(194-259字节) 如下:
# at 194
#191206 11:13:56 server id 222 end_log_pos 259 CRC32 0xcf18638b GTID last_committed=0 sequence_number=1 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'f7b23f20-f3ea-11e9-bdb9-080027781379:1183167'/*!*/;
# at 259
--3.4、:第四个event事件解析:QUERY_EVENT,用于记录第一条语句的第一行数据的一些信息。
00000100 63 18 cf 74 c7 e9 5d 02 de 00 00 00 49 00 00 00 |c..t..].....I...|
00000110 4c 01 00 00 08 00 07 00 00 00 00 00 00 00 05 00 |L...............|
00000120 00 1a 00 00 00 00 00 00 01 00 00 a0 55 00 00 00 |............U...|
00000130 00 06 03 73 74 64 04 21 00 21 00 53 00 66 6c 79 |...std.!.!.S.fly|
00000140 64 62 00 42 45 47 49 4e 81 46 d6 c5 74 c7 e9 5d |db.BEGIN.F..t..]|
--3.4.1、QUERY_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x02 转换为十进制是log_event_type为21,是QUERY_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x49 00 00 00 小端显示为00000049,转换为十进制是73。这个QUERY_EVENT的事件 从259开始,加上73 ,下个事件为332开始。
next_position 4 0x4c 01 00 00 小端显示为0000014c,转换为十进制是332。下个事件从332开始,和上面的可以对应上
flags 2 0x80 00 详见如下《附2、flags 标识》
--3.4.2、QUERY_EVENT的event data的部分解析如下: 参考官网:https://dev.mysql.com/doc/internals/en/query-event.html
Name Size 16进制 Remarks
slave_proxy_id 4 0x07 00 00 00 小端显示为00000007,转换为十进制是7。就是thread_id ,为了创建临时表名不冲突 而设立的
execution time 4 0x00 00 00 00 小端显示为00000000,转换为十进制是0。 执行时间是0秒。 对于DML不准确 是第一个语句执行后的时间 而可能会有很多要执行的语句。 对于DDL操作时准确的。
schema length 1 0x05 数据库名字长度,为5,flydb是5个字符长度
error-code 2 0x00 00 错误代码
status-vars length 2 0x1a 00 小端显示为001a,转换为十进制是26。下面status-vars键值对的长度是26个字节
status-vars 键值对形式 (具体的键 - 值对 可参照下面的说明)。如下:
Q_FLAGS2_CODE 1+4 0x00 00 00 00 00 小端显示为00000000,是foreign_key_checks,sql_auto_is_null,unique_checks,autocommit 四个参数的值。
Q_SQL_MODE_CODE 1+8 0x01 00 00 a0 55 00 00 00 00 小端显示为0000000055a00000,转换为十进制是1436549120。 为sql_mode。
Q_CATALOG_NZ_CODE 1+4 0x06 03 73 74 64 0x03位长度,0x737464 转换为字符时 std。 是catalog的字符集 todo...
Q_CHARSET_CODE 1+6 0x04 21 00 21 00 53 00 小端显示为0021,0021,,0053。转换为十进制是33,33,83。对应的字符集。
schema 可变 0x66 6c 79 64 62 数据库名字。 16进制转字符为flydb
[00] 1 0x00 固定保留0x00
query 可变 0x42 45 47 49 4e 16进制转字符为BEGIN
CRC32 4 0x81 46 d6 c5 CRC32校验位
--3.4.3、mysqlbinlog解析的 第四个event事件(259-332字节) 如下:
# at 259
#191206 11:13:56 server id 222 end_log_pos 332 CRC32 0xc5d64681 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1575602036/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549120/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=83/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 332
--status_vars 键值对说明(此次binlog 只记录了以下4个绿色flag, 其他没记录的flag就按照默认值来) 如下:
Flag Value Length
0x00 Q_FLAGS2_CODE 4
0x01 Q_SQL_MODE_CODE 8
0x02 Q_CATALOG 1 + n + 1
0x03 Q_AUTO_INCREMENT 2 + 2
0x04 Q_CHARSET_CODE 2 + 2 + 2
0x05 Q_TIME_ZONE_CODE 1 + n
0x06 Q_CATALOG_NZ_CODE 1 + n
0x07 Q_LC_TIME_NAMES_CODE 2
0x08 Q_CHARSET_DATABASE_CODE 2
0x09 Q_TABLE_MAP_FOR_UPDATE_CODE 8
0x0a Q_MASTER_DATA_WRITTEN_CODE 4
0x0b Q_INVOKERS 1 + n + 1 + n
0x0c Q_UPDATED_DB_NAMES 1 + n*nul-term-string
0x0d Q_MICROSECONDS 3
Q_FLAGS2_CODE 小端显示
Bitmask of flags that are usually set with SET:
* SQL_AUTO_IS_NULL
* FOREIGN_KEY_CHECKS
* UNIQUE_CHECKS
* AUTOCOMMIT
Hex Flag
0x00004000 OPTION_AUTO_IS_NULL
0x00080000 OPTION_NOT_AUTOCOMMIT
0x04000000 OPTION_NO_FOREIGN_KEY_CHECKS
0x08000000 OPTION_RELAXED_UNIQUE_CHECKS
--举个例子: binlog显示Q_FLAGS2_CODE 为 00 40 00 0c 的 小端显示为0x0c004000 , 带入这四个参数是否生效 如下:
就是:0x04000000(OPTION_NO_FOREIGN_KEY_CHECKS)+0x08000000(OPTION_RELAXED_UNIQUE_CHECKS)+0x00004000(OPTION_AUTO_IS_NULL) = 0x0c004000
和mysqlbinlog解析一致,如下:
SET @@session.foreign_key_checks=0, @@session.sql_auto_is_null=1, @@session.unique_checks=0, @@session.autocommit=1/*!*/;
Q_SQL_MODE_CODE 具体看官网吧:https://dev.mysql.com/doc/internals/en/query-event.html
Q_CATALOG_NZ_CODE
1-byte length + chars of the catalog
Q_CHARSET_CODE
2-byte character_set_client + 2-byte collation_connection + 2-byte collation_server
--3.5、:第五个event事件解析:ROWS_QUERY_LOG_EVENT,记录执行sql的完整语句(参数 binlog_rows_query_log_events 控制 是否会有此event。 默认 无)
00000140 64 62 00 42 45 47 49 4e 81 46 d6 c5 74 c7 e9 5d |db.BEGIN.F..t..]|
00000150 1d de 00 00 00 31 00 00 00 7d 01 00 00 80 00 19 |.....1...}......|
00000160 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 77 |delete from t1 w|
00000170 68 65 72 65 20 69 64 3d 32 7b 0f 12 7b 74 c7 e9 |here id=2{..{t..|
--3.5.1、ROWS_QUERY_LOG_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x1d 转换为十进制是log_event_type为21,是ROWS_QUERY_LOG_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x31 00 00 00 小端显示为00000031,转换为十进制是49。这个ROWS_QUERY_LOG_EVENT的事件 从332开始,加上49 ,下个事件为381开始。
next_position 4 0x7d 01 00 00 小端显示为0000017d,转换为十进制是381。下个事件从381开始,和上面的可以对应上
flags 2 0x80 00 详见如下《附2、flags 标识》
--3.5.2、ROWS_QUERY_LOG_EVENT的event data的部分解析如下:
Name Size 16进制 Remarks
sql sql长度 0x19 64 65 6c.. 开始 16进制转字符为: delete from t1 where id=2
CRC32 4 0x7b 0f 12 7b CRC32校验位
--3.5.3、mysqlbinlog解析的 第五个event事件(332-381字节) 如下:
# at 332
#191206 11:13:56 server id 222 end_log_pos 381 CRC32 0x7b120f7b Rows_query
# delete from t1 where id=2
# at 381
--3.6、:第六个event事件解析:TABLE_MAP_EVENT, 用于row模式复制,记录的是要修改的表的基本信息
00000170 68 65 72 65 20 69 64 3d 32 7b 0f 12 7b 74 c7 e9 |here id=2{..{t..|
00000180 5d 13 de 00 00 00 30 00 00 00 ad 01 00 00 00 00 |].....0.........|
00000190 6d 00 00 00 00 00 01 00 05 66 6c 79 64 62 00 02 |m........flydb..|
000001a0 74 31 00 03 03 03 03 00 06 43 7f c7 c4 74 c7 e9 |t1.......C...t..|
--3.6.1、TABLE_MAP_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x13 转换为十进制是log_event_type为19,是TABLE_MAP_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x30 00 00 00 小端显示为00000030,转换为十进制是48。这个TABLE_MAP_EVENT的事件 从381开始,加上48 ,下个事件为429开始。
next_position 4 0xad 01 00 00 小端显示为000001ad,转换为十进制是429。下个事件从429开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.6.2、TABLE_MAP_EVENT的event data的部分解析如下: 参考官网:https://dev.mysql.com/doc/internals/en/table-map-event.html
Name Size 16进制 Remarks
table id 6 0x6d 00 00 00 00 00 表ID, 小端显示为00000000006d,转换为十进制是109。 表id为109
flags 2 0x01 00 flags保留
schema name length 1 0x05 数据库名字长度,为5,flydb是5个字符长度
schema name 可变 0x66 6c 79 64 62 数据库名字。 16进制转字符为flydb
[00] 1 0x00 固定保留0x00
table name length 1 0x02 表名字长度,为2,t1是2个字符长度
table name 可变 0x74 31 表名字。 16进制转字符为t1
[00] 1 0x00 固定保留0x00
column-count 可变 0x03 列的数量 3个列,是id、a、b三个列
column_type_def 可变 0x03 03 03 列的类型,这里是id、a、b三个字段都是long int类型。详见如下《附3、 field_types类型》
column_meta_def 可变 0x00 这里是long int类型,为0 。详见如下《附4、column_meta_def》。 也对应msyqlbinlog解析的meta=0
null_bitmap INT((n+8)/7) 0x06 是否可以为null的位图。每一位代表一个列。转换为bitmap:00000110, 第一列(bit)不能为null, 二、三列(bit)可以为null
n是列的数量,这里是3 对应msyqlbinlog解析的nullable=0
CRC32 4 0x43 7f c7 c4 CRC32校验位
--3.6.3、mysqlbinlog解析的 第六个event事件(381-429字节) 如下:
# at 381
#191206 11:13:56 server id 222 end_log_pos 429 CRC32 0xc4c77f43 Table_map: `flydb`.`t1` mapped to number 109
# at 429
--3.7、:第七个event事件解析:DELETE_ROWS_EVENT, 用于row模式的事件,记录修改的数据的值(如果大于8k,会再生成一个新的DELETE_ROWS_EVENT事件,老的DELETE_ROWS写入到binlog cache中)
000001a0 74 31 00 03 03 03 03 00 06 43 7f c7 c4 74 c7 e9 |t1.......C...t..|
000001b0 5d 20 de 00 00 00 30 00 00 00 dd 01 00 00 00 00 |] ....0.........|
000001c0 6d 00 00 00 00 00 01 00 02 00 03 ff f8 02 00 00 |m...............|
000001d0 00 e7 03 00 00 02 00 00 00 92 db 84 85 74 c7 e9 |.............t..|
--3.7.1、DELETE_ROWS_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x20 转换为十进制是log_event_type为32,是DELETE_ROWS_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x30 00 00 00 小端显示为00000030,转换为十进制是48。这个DELETE_ROWS_EVENT的事件 从429开始,加上48 ,下个事件为477开始。
next_position 4 0xdd 01 00 00 小端显示为000001dd,转换为十进制是477。下个事件从477开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.7.2、DELETE_ROWS_EVENT的event data的部分解析如下: 参考官网:https://dev.mysql.com/doc/internals/en/rows-event.html
Name Size 16进制 Remarks
table id 6 0x6d 00 00 00 00 00 表ID, 小端显示为00000000006d,转换为十进制是109。 表id为109
flags 2 0x01 00 flags,参照如下flags:
m_extra_row_data 2 0x02 00 extra-data-length
column-count 可变 0x03 列的数量 3个列,是id、a、b三个列
columns-present-bitmap 0xff 列的当前位图 todo...
null_bitmap INT((n+8)/7) 0xf8 当前值是否为null的位图。每一位代表一个列。转换为bitmap:11111000, 目前第一、二、三列的值都不为null。对应mysqlbinlog的is_null=0
value 可变 0x02 00 00 00 第一个列的值。小端显示为00000002,转换为十进制是2。
value 可变 0xe7 03 00 00 第二个列的值。小端显示为000003e7,转换为十进制是999。
value 可变 0x02 00 00 00 第三个列的值。小端显示为00000002,转换为十进制是2。
CRC32 4 0x92 db 84 85 CRC32校验位
flags (2) --
Hex Name
0x0001 end of statement
0x0002 no foreign key checks
0x0004 no unique key checks
0x0008 row has a columns
--3.7.3、mysqlbinlog解析的 第七个event事件(429-477字节) 如下:
# at 429
#191206 11:13:56 server id 222 end_log_pos 477 CRC32 0x8584db92 Delete_rows: table id 109 flags: STMT_END_F
BINLOG '
dMfpXR3eAAAAMQAAAH0BAACAABlkZWxldGUgZnJvbSB0MSB3aGVyZSBpZD0yew8Sew==
dMfpXRPeAAAAMAAAAK0BAAAAAG0AAAAAAAEABWZseWRiAAJ0MQADAwMDAAZDf8fE
dMfpXSDeAAAAMAAAAN0BAAAAAG0AAAAAAAEAAgAD//gCAAAA5wMAAAIAAACS24SF
'/*!*/;
### DELETE FROM `flydb`.`t1`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2=999 /* INT meta=0 nullable=1 is_null=0 */
### @3=2 /* INT meta=0 nullable=1 is_null=0 */
# at 477
--3.8、:第八个event事件解析:XID_EVENT,记录xid,用于二阶段提交时 redo log 来查看binlog的事务是否完成的标识(出现了xid说明存储引擎redo log已提交完成)。 是事务的最后一个事件
000001d0 00 e7 03 00 00 02 00 00 00 92 db 84 85 74 c7 e9 |.............t..|
000001e0 5d 10 de 00 00 00 1f 00 00 00 fc 01 00 00 00 00 |]...............|
000001f0 27 00 00 00 00 00 00 00 ca 4b 6d 6a 76 c7 e9 5d |'........Kmjv..]|
--3.8.1、XID_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x74 c7 e9 5d 小端显示为5DE9C774,转换为十进制是1575602036。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602036'
Fri Dec 6 11:13:56 CST 2019
type_code 1 0x10 转换为十进制是log_event_type为16,是XID_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x1f 00 00 00 小端显示为0000001f,转换为十进制是31。这个XID_EVENT的事件 从477开始,加上31 ,下个事件为508开始。
next_position 4 0xfc 01 00 00 小端显示为000001fc,转换为十进制是508。下个事件从508开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.8.2、XID_EVENT的event data的部分解析如下:
Name Size 16进制 Remarks
xid 8 0x27 00 00 00 00 00 00 00 xid。 小端显示为0000000000000027,转换为十进制是39, xid为39。
CRC32 4 0xca 4b 6d 6a CRC32校验位
--3.8.3、mysqlbinlog解析的 第八个event事件(477-508字节) 如下:
# at 477
#191206 11:13:56 server id 222 end_log_pos 508 CRC32 0x6a6d4bca Xid = 39
COMMIT/*!*/;
# at 508
--3.9、:第九个event事件解析: ROTATE_EVENT,当前binlog的最后一个event事件 来告知下一个binlog二进制文件的name和pos
000001f0 27 00 00 00 00 00 00 00 ca 4b 6d 6a 76 c7 e9 5d |'........Kmjv..]|
00000200 04 de 00 00 00 2f 00 00 00 2b 02 00 00 00 00 04 |...../...+......|
00000210 00 00 00 00 00 00 00 6d 79 73 71 6c 2d 62 69 6e |.......mysql-bin|
00000220 2e 30 30 30 30 34 32 8d 46 93 00 |.000042.F..|
--3.9.1、ROTATE_EVENT的event header的6个部分解析如下:
Name Size 16进制 Remarks
timestamp 4 0x76 c7 e9 5d 小端显示为5DE9C776,转换为十进制是1575602038。查看该时间: [root@hostmysql80 mysql]# date -d'@1575602038'
Fri Dec 6 03:13:58 UTC 2019
type_code 1 0x04 转换为十进制是log_event_type为16,是ROTATE_EVENT事件,枚举详见如下《附1、log_event_type枚举》
server_id 4 0xde 00 00 00 小端显示为000000de,转换为十进制是222。是mysql的server_id。 show variables like '%server%'; 查看为222。 相同 没问题
event_length 4 0x2f 00 00 00 小端显示为0000002f,转换为十进制是47。这个ROTATE_EVENT的事件 从508开始,加上47 ,下个事件为555开始。
next_position 4 0x2b 02 00 00 小端显示为0000022b,转换为十进制是555。下个事件从555开始,和上面的可以对应上
flags 2 0x00 00 详见如下《附2、flags 标识》
--3.9.2、ROTATE_EVENT的event data的部分解析如下: 参考官网:https://dev.mysql.com/doc/internals/en/rotate-event.html
Name Size 16进制 Remarks
pos(next binlog) 8 0x04 00 00 00 00 00 00 00 小端显示为0000000000000004,转换为十进制是4。下一个binlog二进制日志的起始字节位置: 4,从第4个字节开始 (前4字节是魔法字)
name(next binlog) 可变 0x6d 79 73 71 ..到.. 30 34 32 下一个binlog二进制日志的文件名称:16进制转字符:mysql-bin.000042
CRC32 4 0x8d 46 93 00 CRC32校验位
--3.9.3、mysqlbinlog解析的 第九个event事件(508-555字节) 如下:
# at 508
#191206 11:13:58 server id 222 end_log_pos 555 CRC32 0x0093468d Rotate to mysql-bin.000042 pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
--附1、log_event_type枚举
参考官网:https://dev.mysql.com/doc/internals/en/event-classes-and-types.html
enum Log_event_type {
UNKNOWN_EVENT= 0,
START_EVENT_V3= 1,
QUERY_EVENT= 2,
STOP_EVENT= 3,
ROTATE_EVENT= 4,
INTVAR_EVENT= 5,
LOAD_EVENT= 6,
SLAVE_EVENT= 7,
CREATE_FILE_EVENT= 8,
APPEND_BLOCK_EVENT= 9,
EXEC_LOAD_EVENT= 10,
DELETE_FILE_EVENT= 11,
NEW_LOAD_EVENT= 12,
RAND_EVENT= 13,
USER_VAR_EVENT= 14,
FORMAT_DESCRIPTION_EVENT= 15,
XID_EVENT= 16,
BEGIN_LOAD_QUERY_EVENT= 17,
EXECUTE_LOAD_QUERY_EVENT= 18,
TABLE_MAP_EVENT = 19,
PRE_GA_WRITE_ROWS_EVENT = 20,
PRE_GA_UPDATE_ROWS_EVENT = 21,
PRE_GA_DELETE_ROWS_EVENT = 22,
WRITE_ROWS_EVENT = 23,
UPDATE_ROWS_EVENT = 24,
DELETE_ROWS_EVENT = 25,
INCIDENT_EVENT= 26,
HEARTBEAT_LOG_EVENT= 27,
IGNORABLE_LOG_EVENT= 28,
ROWS_QUERY_LOG_EVENT= 29,
WRITE_ROWS_EVENT = 30,
UPDATE_ROWS_EVENT = 31,
DELETE_ROWS_EVENT = 32,
GTID_LOG_EVENT= 33,
ANONYMOUS_GTID_LOG_EVENT= 34,
PREVIOUS_GTIDS_LOG_EVENT= 35,
ENUM_END_EVENT
/* end marker */
};
--附2、 flags 标识
参考官网:https://dev.mysql.com/doc/internals/en/event-flags.html
Current event flags:
LOG_EVENT_BINLOG_IN_USE_F = 0x1 //这个flags表示是否binlog正确的关闭了,这个标示只出现在Format_description_log_event中
LOG_EVENT_THREAD_SPECIFIC_F = 0x4 //是否查询基于了临时表,如果基于了临时表MYSQLBINLOG必须设置 @@PSEUDO_THREAD_ID=xx
LOG_EVENT_SUPPRESS_USE_F = 0x8 //和--binlog-do-db 、 --replicated-do-db有关
......等等
--附3、 field_types类型
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;
--附4、column_meta_def
type-specific metadata for each column
Type meta-len
Protocol::MYSQL_TYPE_STRING 2
Protocol::MYSQL_TYPE_VAR_STRING 2
Protocol::MYSQL_TYPE_VARCHAR 2
Protocol::MYSQL_TYPE_BLOB 1
Protocol::MYSQL_TYPE_DECIMAL 2
Protocol::MYSQL_TYPE_NEWDECIMAL 2
Protocol::MYSQL_TYPE_DOUBLE 1
Protocol::MYSQL_TYPE_FLOAT 1
Protocol::MYSQL_TYPE_ENUM 2
Protocol::MYSQL_TYPE_SET see MYSQL_TYPE_ENUM
Protocol::MYSQL_TYPE_BIT 0
Protocol::MYSQL_TYPE_DATE 0
Protocol::MYSQL_TYPE_DATETIME 0
Protocol::MYSQL_TYPE_TIMESTAMP 0
Protocol::MYSQL_TYPE_TIME --
Protocol::MYSQL_TYPE_TINY 0
Protocol::MYSQL_TYPE_SHORT 0
Protocol::MYSQL_TYPE_INT24 0
Protocol::MYSQL_TYPE_LONG 0
Protocol::MYSQL_TYPE_LONGLONG 0
[root@hostmysql80 mysql]# mysqlbinlog -vv mysql-bin.000041
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#191206 11:13:51 server id 222 end_log_pos 123 CRC32 0xf38e9103 Start: binlog v 4, server v 5.7.27-log created 191206 11:13:51
BINLOG '
b8fpXQ/eAAAAdwAAAHsAAAAAAAQANS43LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AQORjvM=
'/*!*/;
# at 123
#191206 11:13:51 server id 222 end_log_pos 194 CRC32 0xb49b6a2e Previous-GTIDs
# f7b23f20-f3ea-11e9-bdb9-080027781379:1183166
# at 194
#191206 11:13:56 server id 222 end_log_pos 259 CRC32 0xcf18638b GTID last_committed=0 sequence_number=1 rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'f7b23f20-f3ea-11e9-bdb9-080027781379:1183167'/*!*/;
# at 259
#191206 11:13:56 server id 222 end_log_pos 332 CRC32 0xc5d64681 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1575602036/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549120/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=83/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 332
#191206 11:13:56 server id 222 end_log_pos 381 CRC32 0x7b120f7b Rows_query
# delete from t1 where id=2
# at 381
#191206 11:13:56 server id 222 end_log_pos 429 CRC32 0xc4c77f43 Table_map: `flydb`.`t1` mapped to number 109
# at 429
#191206 11:13:56 server id 222 end_log_pos 477 CRC32 0x8584db92 Delete_rows: table id 109 flags: STMT_END_F
BINLOG '
dMfpXR3eAAAAMQAAAH0BAACAABlkZWxldGUgZnJvbSB0MSB3aGVyZSBpZD0yew8Sew==
dMfpXRPeAAAAMAAAAK0BAAAAAG0AAAAAAAEABWZseWRiAAJ0MQADAwMDAAZDf8fE
dMfpXSDeAAAAMAAAAN0BAAAAAG0AAAAAAAEAAgAD//gCAAAA5wMAAAIAAACS24SF
'/*!*/;
### DELETE FROM `flydb`.`t1`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2=999 /* INT meta=0 nullable=1 is_null=0 */
### @3=2 /* INT meta=0 nullable=1 is_null=0 */
# at 477
#191206 11:13:56 server id 222 end_log_pos 508 CRC32 0x6a6d4bca Xid = 39
COMMIT/*!*/;
# at 508
#191206 11:13:58 server id 222 end_log_pos 555 CRC32 0x0093468d Rotate to mysql-bin.000042 pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;