[pymysqlbinlog] 解析binlog中的gtid (GTID_LOG_EVENT,PREVIOUS_GTIDS_LOG_EVENT)

2024年 4月 19日 29.9k 0

导读

binlog中事务以GTID_EVENT开始, 以XID_EVENT结束, 很多信息都藏在gtid_event中, 比如事务大小, 提交时间等. MTS也会查看gtid中的信息, 还涉及到两阶段提交, 但不是本文的重点, 就不讲了.

注:

  1. immediate_ 开头的表示是当前数据库执行的相关信息

  2. original_ 开头的表示是主库数据库执行的信息

  3. 5.7同步到8.0的时候, original_ 开头的信息会被置为0

GTID_LOG_EVENT

gtid_event是一个事务开始的标记.(虽然是提交的时候才获取的…). 主要分为gtid(GTID_LOG_EVENT= 33)和匿名gtid(ANONYMOUS_GTID_LOG_EVENT= 34). 格式是一样的. 这里就只看gtid了

对象 大小(字节) 描述
GTID_FLAGS 1
SID 16 server_uuid
GNO 8 gtid no. 就是看到的那个数字
lt_type 1 logical timestamp flag
last_committed 8 if lt_type == 2 else 0 上一个事务提交的编号, 一样的话, 就表示是一组的(就可以并行回放)
sequence_number 8 if lt_type == 2 else 0 当前事务的编号
immediate_commit_timestamp 8 当前提交时间(产生这个binlog的时间)
original_commit_timestamp 0/8 主库的提交时间(原始数据的提交时间)
transaction_length 45300 事务大小(含gtid&xid)
immediate_server_version 4 当前数据库的版本(产生这个Binlog的库的版本信息)
original_server_version 0/4 主库的版本信息(原始数据的数据库版本信息)

没错, gtid_event到这里就完了. 包含的信息还是很多的.

original_ 计算方式

original_commit_timestamp 的计算方式为: immediate_commit_timestamp 第一bit为1时, 就有immediate_commit_timestamp

否则 immediate_commit_timestamp 就是 immediate_commit_timestamp

说白了, 就是从库回放的时候, 把主库的immediate_commit_timestamp写为original_commit_timestamp , 然后把自己的immediate_commit_timestamp 加了个(1

相关文章

最新发布!MySQL 9.0 的向量 (VECTOR) 类型文档更新
国产数据库中级认证HCIP-openGauss经验分享
保障数据完整性与稳定性:数据库一致性
OceanBase 里的 DDL 超时时间
OceanBase v3.1.x 将不再更新版本 | 社区月报2024.6
openGauss Developer Day 2024 | SIG组工作会议亮点回看!

发布评论