怎么获取mysql binlog日志中的start-position,end-position,start-datetime 和end-datetime

这是开始的样本:SET @@session.collation_database=DEFAULT/*!*/;/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;BEGIN/*!*/;# at 212244989#260318  0:29:58 server id 10...

这是开始的样本:


SET @@session.collation_database=DEFAULT/*!*/;

/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;

BEGIN

/*!*/;

# at 212244989

#260318  0:29:58 server id 1000000  end_log_pos 212245088 CRC32 0xe754fb89      Table_map: `minipos`.`es_print_record` mapped to number 7477

# at 212245088

#260318  0:29:58 server id 1000000  end_log_pos 212247727 CRC32 0x5661dada      Update_rows: table id 7477 flags: STMT_END_F


BINLOG '


UlFBZElRQUtHMFVBSFNFQUcyRUFJQ0FnSUNEUXU5Qzd1OTI1eTZPc3U3YlRyYy9DdE02NTRzSFpJ

Q0FnSUNBS0cwVUFIU0VBQ2h0RkFCMGhBQW9iUlFBZElRQUtHMjA9IQAwMjYwMzE4MDAwMDAzNzkw

MDF0czE3NzM3NjQ5OTc3NzUBAAAAAQAwPwDmiZPljIXotLkgMiDlhYN4IDEgIOm7hOmHkeeCuOib

i3ggMSAg5LqU5b2p6YW45rGk54mb6IKJ6Z2ieCAxICACMTESMDI2MDMxODAwMDAwMzc5MDAxBQAw

MDAxIAAAAACZuWQHetraYVY=

'/*!*/;

# at 212247727

#260318  0:29:58 server id 1000000  end_log_pos 212247758 CRC32 0x19f21ede      Xid = 531363364

COMMIT/*!*/;

# at 212247758

# at 212247838

#260318  0:29:58 server id 1000000  end_log_pos 212247925 CRC32 0xdfdaf4b3      Query   thread_id=15756 exec_time=0     error_code=0

SET TIMESTAMP=1773764998/*!*/;

BEGIN

/*!*/;

# at 212247925

#260318  0:29:58 server id 1000000  end_log_pos 212248023 CRC32 0xc2742c9e      Table_map: `minipos`.`comm_catering_materials` mapped to number 7488

# at 212248023

#260318  0:29:58 server id 1000000  end_log_pos 212256049 CRC32 0x92d18c3d      Update_rows: table id 7488

# at 212256049

#260318  0:29:58 server id 1000000  end_log_pos 212264137 CRC32 0x676c8f32      Update_rows: table id 7488

# at 212264137

#260318  0:29:58 server id 1000000  end_log_pos 212272057 CRC32 0x5cded404      Update_rows: table id 7488


结束事务的样本:



AACZuWNw8Zm5Y3DxAAKD6gQAAAAAAJEdQgAAAAAAAgAAACIbAAAAAAAAmbljcPGZuWNw8QACkOoE

AAAAAADuHUIAAAAAAAIAAAApGwAAAAAAAJm5Y3dsmbljd2wAApHqBAAAAAAA8R1CAAAAAAACAAAA

KRsAAAAAAACZuWN3kJm5Y3eQAAKS6gQAAAAAAOsdQgAAAAAAAgAAACkbAAAAAAAAmbljd5iZuWN3

mAACpeoEAAAAAACrDkIAAAAAAAIAAAAhGwAAAAAAAJm5Y3r3mbljevcAAqbqBAAAAAAAqw5CAAAA

AAACAAAAIhsAAAAAAACZuWN695m5Y3r3AIRMOZ8=

'/*!*/;

# at 216327481

#260318  0:29:59 server id 1000000  end_log_pos 216327575 CRC32 0x7719e67f      Table_map: `minipos`.`comm_catering_materials_group` mapped to number 7497

# at 216327575

#260318  0:29:59 server id 1000000  end_log_pos 216327707 CRC32 0xea0ae85c      Update_rows: table id 7497 flags: STMT_END_F


BINLOG '

h4G5aRNAQg8AXgAAAJfl5AwAAEkdAAAAAAEAB21pbmlwb3MAHWNvbW1fY2F0ZXJpbmdfbWF0ZXJp

YWxzX2dyb3VwAAgICA8DAxISAwSQAQAAQAEBAAID/P8Af+YZdw==

h4G5aR9AQg8AhAAAABvm5AwAAEkdAAAAAAEAAgAI//9AKAEAAAAAAADxGAAAAAAAAAwA6buY6K6k

5YiG57uEAAAAAAEAAACZuWQHdwAAAABAKAEAAAAAAADxGAAAAAAAAAwA6buY6K6k5YiG57uEAAAA

AAEAAACZuWQHdwEAAABc6Arq

'/*!*/;

# at 216327707

#260318  0:29:59 server id 1000000  end_log_pos 216327738 CRC32 0x820dd556      Xid = 531363360

COMMIT/*!*/;

DELIMITER ;

# End of log file

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;



先说上面结论:


✔ start-position

212247758

✔ end-position

216327738

✔ start-datetime

2026-03-18 00:29:58

✔ end-datetime

2026-03-18 00:29:59


容易踩坑地方:

❗坑1:# at 212247838 不是 start-position

很多人会选这个:

# at 212247838
SET TIMESTAMP


BEGIN

❌ 错误

 正确必须取:

# at 212247758

 原因:

binlog position 永远取 事件起点(event header)
而不是 SQL 行


❗坑2:

end-position 为什么不是at 216327707 而是end_log_pos 216327738 后面这个216327738 

1️⃣ # at  vs  end_log_pos 的区别


在 binlog 中,每一个事件(Event)都有两个核心位置:

# at 216327707事件的起始位置,也就是这个事件在 binlog 文件里的偏移量
end_log_pos 216327738事件的结束位置,下一个事件的起始位置(逻辑上事件的“边界”)

✅ 举例说明:


# at 100
... event body ...
end_log_pos 150
  • 事件体从偏移 100 开始,到偏移 149 结束

  • 下一个事件从 150 开始

2️⃣ 为什么事务结束取 end_log_pos

事务结束的标志是 Xid / COMMIT event

你日志里:

# at 216327707
Xid = 531363360
COMMIT
end_log_pos 216327738
  • # at 216327707 → Xid 事件开始

  • end_log_pos 216327738 → Xid 事件结束

  • 事务真正占用的 binlog 范围是:


start-position = 212247758
end-position = 216327738

⚠️ 注意:
如果你取 # at 216327707 作为 end-position,实际上会 少取最后几字节,在回放或回滚时可能导致 binlog 解析错误或事务不完整。


3️⃣ 形象比喻

把 binlog 看成 “书页”:

# at = 书页起始页码
end_log_pos = 下一页的起始页码
  • 一个事件跨越的页 = end_log_pos - # at

  • 事务跨越的页 = 最后一个事件的 end_log_pos - 第一个事件的 # at

所以:

事务结束位置必须取最后一个事件的 end_log_pos,而不是 # at

4️⃣ 小结

  • 事务开始取第一个事件的 # at(通常是 上一个COMMIT之后的第一个#at)

  • 事务结束取最后一个事件的 end_log_pos(通常是 Xid / COMMIT event)

  • 不要取最后事件的 # at,否则会少掉事件尾部,回放或闪回可能报错


  • 发表于 2026-03-18 19:58
  • 阅读 ( 10 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章