当前位置: 首页 > news >正文

深入解析:MySQL中,binlog文件开头的Previous_gtids_log_event是如何计算的

目录

      • 1. 它是什么?
      • 2. 它的作用和重要性
      • 3. 它是如何计算的?
        • 计算公式:
        • 详细示例:
      • 4. 如何查看它?
      • 特殊情况
      • 总结

1. 它是什么?

Previous_gtids_log_event 是一个二进制日志事件,它位于每个 binlog 文件的开头(在 FORMAT_DESCRIPTION_EVENT 之后)。

它的作用是 记录在当前的 binlog 文件之前,所有已经执行过的 GTID 集合

可以把它理解为 “本文件之前所有 binlog 的 GTID 目录”“GTID 上下文”


2. 它的作用和重要性

在 MySQL 启用了 GTID(全局事务标识符) 复制后,Previous_gtids_log_event 变得至关重要。它的主要作用有:

  1. 确定复制起点:当一个新的从库连接到主库,或者一个已经存在的从库需要重新获取日志时,它会告诉主库“我已经执行过的 GTID 集合是 X”。主库通过对比自己的 Previous_gtids_log_eventGtid_log_event,就能精确地知道应该从哪个 binlog 文件、哪个位置开始发送数据,确保不会重复发送已经执行过的事务,也不会漏掉任何事务。
  2. 保证数据一致性:它构成了 GTID 的连续性。通过检查所有 binlog 文件的 Previous_gtids_log_event 和文件内部的 Gtid_log_event,可以验证整个复制链的 GTID 集合是否完整、无空洞。
  3. Purge 操作的依据:MySQL 在自动清理(purge)旧的 binlog 文件时,会确保不会删除任何还包含有从库未执行事务的 binlog 文件。Previous_gtids_log_event 是判断这些依赖关系的关键信息。

3. 它是如何计算的?

Previous_gtids_log_event 的内容是一个 GTID 集合,其计算逻辑非常直观:

它等于上一个 binlog 文件中的 Previous_gtids_log_event 的内容,加上上一个 binlog 文件自身记录的所有 Gtid_log_event

我们可以用一个公式和例子来理解:

计算公式:

当前文件_N 的 Previous_gtids_log_event = 文件_(N-1) 的 Previous_gtids_log_event + 文件_(N-1) 中所有的 GTID

详细示例:

假设我们有三个 binlog 文件:binlog.000001, binlog.000002, binlog.000003

  • binlog.000001

    • Previous_gtids_log_event: 空集合 {}
      • 解释:因为它是第一个文件,在它之前没有任何 GTID 事务。
    • 文件内容:
      • Gtid_log_event: server_uuid:1-1 (事务1)
      • Gtid_log_event: server_uuid:1-2 (事务2)
    • 文件结束时,其包含的完整 GTID 集合为:{server_uuid:1-1, server_uuid:1-2}
  • binlog.000002

    • Previous_gtids_log_event: {server_uuid:1-1, server_uuid:1-2}
      • 解释:这个集合就是上一个文件(binlog.000001)的 Previous_gtids_log_event(空)加上它自己包含的所有 GTID(1-1, 1-2)。
    • 文件内容:
      • Gtid_log_event: server_uuid:1-3 (事务3)
      • Gtid_log_event: server_uuid:1-4 (事务4)
    • 文件结束时,其包含的完整 GTID 集合为:{server_uuid:1-1, server_uuid:1-2, server_uuid:1-3, server_uuid:1-4}
  • binlog.000003

    • Previous_gtids_log_event: {server_uuid:1-1, server_uuid:1-2, server_uuid:1-3, server_uuid:1-4}
      • 解释:这个集合就是上一个文件(binlog.000002)的 Previous_gtids_log_event(1-1, 1-2)加上它自己包含的所有 GTID(1-3, 1-4)。
    • 文件内容:
      • Gtid_log_event: server_uuid:1-5 (事务5)
  • 执行purge binlog to binlog.000003

    • binlog.0000001, binlog.000002被删除
  • binlog.000004

    • 创建新binlog文件
    • Previous_gtids_log_event: {server_uuid:1-1, server_uuid:1-2, server_uuid:1-3, server_uuid:1-4}
      • 解释:这个集合就是上一个文件(binlog.000003)的 Previous_gtids_log_event(1-1, 1-2, 1-3, 1-4)加上它自己包含的所有 GTID(1-5)。
    • 文件内容:(新的 GTID 事务会记录在这里)

4. 如何查看它?

你可以使用 MySQL 官方提供的 mysqlbinlog 工具来查看这个事件。

mysqlbinlog binlog.000002 | head -20

在输出的开头部分,你会看到类似这样的内容:

# at 4
#240101 10:00:00 server id 1  end_log_pos 123 CRC32 0xabcdefgh
# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags
#       4 9a 8c 7b 5e   0f   01 00 00 00   77 00 00 00   7b 00 00 00   00 00
#       a4 55 0f a8
#       Previous-GTIDs
#       server_uuid:1-4

更清晰的方式是使用 --verbose 选项:

mysqlbinlog --verbose binlog.000002 | grep -A 10 "Previous-GTIDs"

输出会直接显示 GTID 集合:

# Previous-GTIDs
# server_uuid:1-4

在 MySQL 8.0 及以上版本,你还可以查询 performance_schema 中的 binary_log_transaction_compression_stats 视图(虽然不是直接查询,但可以获取相关信息),或者直接使用 SHOW BINLOG EVENTS 命令,但 mysqlbinlog 是最标准、最清晰的方式。


特殊情况

  • 服务器首次启动:第一个 binlog 文件的 Previous_gtids_log_event 是空的。
  • 服务器重启:服务器重启后,会创建一个新的 binlog 文件。这个新文件的 Previous_gtids_log_event 会严格按照上述规则计算,即等于上一个文件的所有 GTID 集合。
  • 手动执行 RESET MASTER:这个命令会清空所有 GTID 执行历史,删除所有 binlog 文件,并从一个全新的、Previous_gtids_log_event 为空的 binlog 文件开始。请在生产环境,尤其是复制环境中极其谨慎地使用此命令。

总结

特性描述
是什么一个记录“本文件之前所有 GTID”的事件。
位置每个 binlog 文件的开头。
作用确定复制起点、保证 GTID 连续性、辅助 binlog 清理。
计算规则当前文件_Previous = 上一个文件_Previous + 上一个文件_所有GTID
查看方式mysqlbinlog <binlog-file>

理解 Previous_gtids_log_event 对于深入掌握 MySQL GTID 复制的工作原理和故障排查非常有帮助。

补充说明:
Q: 新建binlog 文件时,Previous_gtids_log_event可以认为是所有已经执行过的gtid集合 executed gtid set吗?
A: NO. 因为如果事务执行时设置不记录binlog,事务gtid 虽然在executed gtid set中,但不会在binlog文件。所以两者不是等价的。

http://www.jsqmd.com/news/375287/

相关文章:

  • nc is qt
  • 基于深度学习YOLOv8的小目标车辆检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • NOIWC 2026 游继
  • 靠谱的2025板材厂家排名 - 品牌推荐(官方)
  • 市面上专业的2025板材工厂排名 - 品牌推荐(官方)
  • 2/12 状压dp枚举子集类问题练习
  • Vim命令
  • 如何解决 Vue 项目启动时出现的 “No such module: http_parser” 错误问题:从0到1避坑指南(附完整代码)
  • 《计算机是怎样跑起来的》——让程序像流水一样流动
  • 2026板材工厂排行榜 - 品牌推荐(官方)
  • 大数据诊断性分析:从数据采集到结果可视化的全流程
  • 2026 年四川优质仿真恐龙厂家推荐榜:以科技赋能文旅,凭实力领跑仿真恐龙场景体验 - 深度智识库
  • 从高低压开关柜到箱式变电站——2026中国电力工程五大优质厂家推荐 - 深度智识库
  • PromQL
  • 深入解析:基于 Spring Boot 的医院预约挂号系统(全端协同)设计与实现
  • 第1章 程序点滴-1.2 高手是怎样练成的(3)
  • 基于深度学习YOLOv10的热成像人员检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • 第1章 程序点滴-1.3 正确的入门方法(1)
  • 基于深度学习YOLOv10的麻将识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目源码+模型)
  • AI工具免费模型排名对比 (2026-02-12)
  • 果乐士米糊:跳出“水+谷物”框架,重新定义宝宝主食辅食新标准 - 速递信息
  • 行业内专业的2026板材十大品牌排名 - 品牌推荐(官方)
  • 基于深度学习YOLOv8的扑克牌识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 基于.NET Core MVC和SQL Server的在线考试系统源码包:国际化管理、多角色操...
  • 2026年企业网盘选型盘点:坚果云领衔8款主流产品实力对比
  • 构建之法(3)
  • 2026年企业级共享网盘深度盘点:15款主流产品选型指南
  • AI驱动的敏捷团队技能组:让Claude变身完整开发团队【Scrum-Skills】
  • No152:AI中国故事-对话祖冲之——圆周率与AI精度:数学直觉与极限探索
  • 哪些国产网盘适合企业私有部署场景