如何解读MySQL死锁日志中记录锁段的len、hex等字段含义
InnoDB死锁日志片段逐字段解读
锁申请上下文行逐字段说明
对应日志第一行:RECORD LOCKS space id 89 page no 3 n bits 120 index PRIMARY of table ot.ta trx id 6331 lock_mode X waiting
space id 89:该锁所属的InnoDB表空间ID,为物理存储层面的分区标识,对应ot.ta表的存储位置page no 3:锁挂载的索引页编号,该页为表的主键聚簇索引的第3个数据页n bits 120:该索引页的锁位图长度为120位,代表页内最多可同时记录120条记录的锁持有状态index PRIMARY of tableot.ta``:锁的挂载对象为ot库下ta表的聚簇主键索引trx id 6331:发起本次加锁请求的事务唯一ID为6331lock_mode X waiting:当前事务正处于阻塞状态,等待在目标记录上申请排他X锁,尚未获得锁持有权限
目标记录元信息行逐字段说明
对应日志第二行:Record lock, heap no 50 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
Record lock:锁类型为纯记录锁,不包含间隙锁、临键锁范围heap no 50:目标记录在当前索引页内的堆存储槽位为第50位,与业务主键值无直接对应关系n_fields 9:这条聚簇索引记录物理存储共包含9个字段compact format:记录采用InnoDB紧凑行格式存储info bits 0:记录头部标记位为0,代表这是有效业务记录,无删除标记等特殊状态
物理记录字段逐行解读
聚簇索引的字段存储顺序是InnoDB固定规则:用户定义的主键列 → 两个InnoDB内置隐藏列 → 用户定义的其余业务列。每个字段的三个标识含义统一为:
len:当前字段的物理存储字节长度hex:字段存储的原始二进制值的十六进制编码asc:将十六进制值转换为可打印ASCII字符的展示结果,遇到不可打印的二进制内容时显示为空格,仅作辅助展示,无核心排查价值
逐字段对应关系:
- 0号字段:
len 4; hex 80000031; asc 1;;—— 用户定义的主键列,长度4字节。MySQL存储整数类型时会翻转最高位符号位避免正负值二进制冲突,该值减去正整数基数80000000后得到十进制值49,即目标记录的主键值为49 - 1号字段:
len 6; hex 0000000018ba; asc ;;—— InnoDB内置隐藏列trx_id,固定长度6字节,存储最近一次修改该记录的事务ID,转十进制值为6330 - 2号字段:
len 7; hex 330000019c1f2f; asc 3 /;;—— InnoDB内置隐藏列roll_pointer,固定长度7字节,存储指向回滚段的指针,用于事务回滚、MVCC版本链构建 - 3号字段:
len 4; hex 80000004; asc ;;—— 用户定义的第一列非主键业务列,长度4字节,对应整数值为4 - 4号字段:
len 1; hex 44; asc D;;—— 用户定义的第二列非主键业务列,长度1字节,对应ASCII字符'D' - 5号字段:
len 4; hex 80000009; asc ;;—— 用户定义的第三列非主键业务列,长度4字节,对应整数值为9 - 6号字段:
len 1; hex 81; asc ;;—— 用户定义的第四列非主键业务列,长度1字节,根据列类型定义,若为有符号类型则值为0,若为无符号类型则值为129 - 7号、8号字段:各为6字节长度的十六进制值 —— 用户定义的第五、六列非主键业务列,结合长度判断为InnoDB存储的日期时间类型值,可通过MySQL时间类型的十六进制转换规则得到具体时间值
备注:日志不会直接输出业务列名,若需匹配具体列含义,需结合
ot.ta表的建表语句,按照列定义顺序与上述物理存储字段一一对应即可。权威参考规则可查阅InnoDB官方文档中锁日志输出格式、聚簇索引物理结构的相关章节说明。
内容的提问来源于stack exchange,提问作者linlowa
相关产品推荐
相关产品推荐

