MySQL识别一个binlog中的一个事物(2)

所以我们认为一个事物的binlog是504到764
如果写为733会出现这种情况
mysqlbinlog testsla.000003  --start-position=504 --stop-position=733 -vv  --base64-output=decode-rows

........
# at 689
#170609 15:32:58 server id 933310  end_log_pos 733 CRC32 0xd907a353    Write_rows: table id 142 flags: STMT_END_F
### INSERT INTO `test`.`test`
### SET
###  @1=1 /* INT meta=0 nullable=1 is_null=0 */
###  @2=2 /* INT meta=0 nullable=1 is_null=0 */
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;  --很明显没有xid event 没有commit而mysqlbinlog自己家了一个rollback而回滚掉了
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETI

好这里我们简单介绍一个事物binlog event的流程,正如我工具所展示的
>Gtid Event :事物开始
-->Query Event:begin
---->Map Event :表映射
------>Insert Event:正真的数据二进制格式
>Xid Event: commit
这事一个事物需要经历的event,在5.7中不开启GTID,GTID EVENT任然存在那叫匿名gtid event及NONYMOUS_GTID_LOG_EVENT,在5.6中
最多gtid event有变动,因为5.6的并行slave不依靠binlog group commit。
如果想了解这些event和infobin工具请参考的文章:
解析MYSQL BINLOG 二进制格式(1)--准备工作
解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT
解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT
解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT
解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT
解析MYSQL BINLOG 二进制格式(6)--UPDATE_ROW_EVENT/DELETE_ROW_EVENT 
解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT
解析MYSQL BINLOG 二进制格式(8)--GTID_LOG_EVENT/ANONYMOUS_GTID_LOG_EVENT及其他
解析MYSQL BINLOG 二进制格式(9)--infobin解析binlog帮助文档
解析MYSQL BINLOG 二进制格式(10)--问题解答


最后看看语句模式的一个事物,虽然很少人用但是我们做一个对比
>Gtid Event:Pos:194(0Xc2) N_pos:259(0X103) Time:1496998879 Event_size:65(bytes)
Gtid:89dfa8a4-cb13-11e6-b54-0c29a879a3:5
-->Query Event:Pos:259(0X103) N_Pos:338(0X152) Time:1496998879 Event_size:79(bytes)
Exe_time:0  Use_db:test Statment(35b-trun):BEGIN /*!Trx begin!*/ Gno:5
-->Query Event:Pos:338(0X152) N_Pos:428(0X1ac) Time:1496998879 Event_size:90(bytes)
Exe_time:0  Use_db:test Statment(35b-trun):delete from test Gno:5
>Xid Event:Pos:428(0X1ac) N_Pos:459(0X1cb) Time:1496998879 Event_size:31(bytes)
COMMIT; /*!Trx end*/ Gno:5

>GTID EVENT :事物开始
-->Query Event :begin
-->Query Event :正真的语句
>Xid Event: commit
没有Map Event和Insert Event,当然记录的是语句就节约空间了。
下面是mysqlbinlog输出

# at 194 --GTID EVENT开始
#170609 17:01:19 server id 933310  end_log_pos 259 CRC32 0x6a408c33    GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '89dfa8a4-cb13-11e6-b504-000c29a879a3:5'/*!*/;
# at 259  --Query Event BEGIN
#170609 17:01:19 server id 933310  end_log_pos 338 CRC32 0x9b25b2af    Query  thread_id=2    exec_time=0    error_code=0
SET TIMESTAMP=1496998879/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=83,@@session.collation_connection=83,@@session.collation_server=83/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 338  --Query Event 正真的语句
#170609 17:01:19 server id 933310  end_log_pos 428 CRC32 0x4e4230f8    Query  thread_id=2    exec_time=0    error_code=0
use `test`/*!*/;
SET TIMESTAMP=1496998879/*!*/;
delete from test
/*!*/;
# at 428 -- XID EVENT结束
#170609 17:01:19 server id 933310  end_log_pos 459 CRC32 0x38079d60    Xid = 159
COMMIT/*!*/;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e950d1b7b298abb2a803bc2ebd6b4385.html