暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

【实战经验】Lock Wait Timeout 锁冲突业务语句抓取实战思路

356

一、背景说明

在业务联调测试或生产验证过程中,经常会遇到 Lock wait timeout 类问题。

业务侧最关心的往往不是“发生了锁冲突”,而是:

究竟是哪一个业务事务、哪一条业务语句,占用了锁资源,导致其他事务超时失败?

在 ZXCLOUD GoldenDB 的分布式架构中,业务 SQL 首先由 CN(计算节点) 接入并进行解析、路由和拆分,最终在多个数据节点上并行执行。

因此,从单一 DB 节点看到的 SQL,往往只是 分布式执行阶段的子语句,并非业务提交的原始 SQL。

本文结合 GoldenDB 的日志体系,介绍一套 从锁超时现象出发,逐层回溯并还原业务真实冲突事务 的实战思路。


二、整体排查思路

锁冲突定位整体可以拆解为四个步骤:

  1. 从 CN 错误日志中确认锁超时的业务 SQL 及分片信息
  2. 在对应分片的数据节点上查看锁冲突日志
  3. 通过锁日志获取冲突双方的线程 ID
  4. 回到 CN 日志,还原完整业务事务与 SQL 链路
  5. 核心目标只有一个:
从 DB 层的锁冲突现象,反推出业务真实事务行为


三、数据节点锁冲突日志分析

3.1 锁冲突日志配置

在 GoldenDB 数据节点侧,需要开启锁等待日志,用于记录超过阈值的锁等待与冲突信息。

配置文件路径:

DB 用户 $HOME/etc/my.cnf

关键配置项:

innodb_lock_wait_log = on
innodb_lock_wait_timeout = 8

参数说明:

  • innodb_lock_wait_log:是否开启锁等待日志
  • innodb_lock_wait_timeout:锁等待超时时间(单位:秒)

参数支持动态生效,可在问题排查期间临时开启。


3.2 锁冲突日志路径

默认日志路径如下:

DB 用户 $HOME/log/innodb_lock_wait.log

该日志专门用于记录 发生锁等待超时的冲突双方事务信息

3.3 锁冲突日志示例与字段说明

示例日志(节选):

#WARN: DESC=lock_wait_time:more than 2000ms,
req_thd_id:780442,
req_trx_id:4663955,
req_sql:[SELECT ... FOR UPDATE],
blk_thd_id:450967,
blk_trx_id:4663935,
blk_sql:[SELECT ... FOR UPDATE],
blk_key_data:[1]

关键字段说明如下:

  • req_thd_id:请求锁的线程 ID
  • req_trx_id:请求锁的事务 ID
  • req_sql:请求锁时正在执行的 SQL
  • blk_thd_id:持有锁、造成阻塞的线程 ID
  • blk_trx_id:阻塞事务对应的事务 ID
  • blk_sql:阻塞事务当前执行的 SQL
  • blk_key_data:被锁住的记录 Key(主键或索引值)

⚠️ 需要注意的是:

锁冲突日志中记录的 SQL,通常是 CN 拆分后下发到数据节点的分布式执行语句,并不一定等同于业务原始 SQL。

因此,仅依靠 DB 锁日志,无法直接定位业务层的事务逻辑

四、CN 慢日志定位业务 SQL

4.1 CN 慢日志配置

在 CN(计算节点)侧,需要开启慢日志,用于记录业务 SQL 的完整执行过程。

配置文件路径:

CN 用户 $HOME/etc/cn.ini

关键参数示例:

slow_query_log = 1
long_query_time = 100

参数说明:

  • slow_query_log:慢日志开关
  • long_query_time:慢 SQL 记录阈值(毫秒)

配置支持动态生效,适合在联调或问题定位期间开启。

4.2 CN 慢日志路径

  • 执行成功的慢 SQL:
$HOME/log/slow_query.log
  • 执行失败的 SQL(如锁超时):
$HOME/log/slow_errquery.log

4.3 通过线程 ID 精确匹配业务 SQL

在数据节点锁冲突日志中,可以拿到关键线索:

  • blk_thd_id
  • req_thd_id

回到对应 CN 节点,在慢日志中通过 DB connection_id 进行匹配,例如:

DB connection_id:450798

通过该 connection_id,可以定位到:

  • 对应的业务 SQL
  • CN 为该请求分配的全局唯一请求标识(UUID)


五、还原完整业务事务链路

5.1 利用请求 UUID 回溯事务全流程

在 CN 慢日志中,每个业务请求都会携带一个唯一标识,例如:

311-1-9300-1650787948461877

使用该 UUID,在 CN 的全量日志中进行反查:

grep '311-1-9300-1650787948461877' general_query.log

即可获取该业务事务的完整执行链路,包括:

  • 事务内所有 SQL
  • SQL 执行顺序
  • 是否存在长事务或延迟提交

5.2 常见锁超时根因分析方向

通过还原完整事务后,通常可以快速判断锁超时的根因:

  • 事务执行时间过长,迟迟未提交
  • 范围更新或删除,锁定记录过多
  • 事务内 SQL 顺序不合理
  • 业务并发模型与事务设计不匹配

六、总结

在 ZXCLOUD GoldenDB 分布式架构下,锁冲突问题不能只从数据节点视角分析

一套完整、有效的排查闭环应当是:

CN 错误日志 → 数据节点锁冲突日志 → CN 慢日志 → CN 全量日志

通过 CN 与数据节点日志的联动分析,才能真正定位:

  • 哪个业务事务
  • 哪些业务 SQL
  • 为什么会触发 Lock wait timeout

该方法在业务联调、生产问题定位以及 SQL 与事务设计优化中,均具有很高的实战价值。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论