mysql排查锁等待

排查锁等待步骤

最近线上碰到了几次mysql锁等待的问题,一个事务线程长期占用锁资源,导致其他事务无法获取到锁,为了快速解决问题,我们把线程kill掉了,但后面就定位不到具体的问题了,这里我总结整理一下我的方案。

如果事务刚好还处于等待状态

  1. 使用以下查询查看具体的锁等待情况,包括哪个事务持有了锁,哪个事务在等待哪个锁:
sql 复制代码
SELECT * FROM sys.innodb_lock_waits;

这里可以看到当前 锁的类型,等待锁的事务,等待时间

同时我们可以看到等待的线程id,正在执行的sql,但这个sql不全,我们可以拿这个线程id去

information_schema.PROCESSLIST 查到完整sql

sql 复制代码
select * from information_schema.PROCESSLIST WHERE ID = 12;

这里我们还可以定位到执行sql的host和端口

但这些不是我们主要关注的,等待的事务超过时间会回滚,我们需要找到阻塞线程做了什么操作,还是回到第一步,找到阻塞线程id,但我们无法定位到具体sql,因为这里只会把正在执行的sql查出来,所以如何找到阻塞线程执行过的sql成了关键。

  1. 找到阻塞线程执行过的sql

第一种:

前提是要打开 performance_schema,可以用下面sql看一下

sql 复制代码
SHOW VARIABLES LIKE 'performance_schema';

但注意,如果是OFF,改成ON的话需要重启实例,一般线上环境是不会这么操作,而且打开后,因为要多记录一些日志信息,会影响整体性能,也不推荐打开。

用阿里云的RDS,修改参数时也会提示

查找阻塞线程的详细信息:

sql 复制代码
SELECT * FROM performance_schema.threads WHERE processlist_id = 11;

查看引起阻塞的SQL语句:

sql 复制代码
SELECT * FROM performance_schema.events_statements_history WHERE thread_id = 51;

这样我们就定位到了该线程执行过的sql,再通过information_schema.PROCESSLIST 找到host和port,去我们具体的服务定位问题。

第二种方案:

上面也提到performance_schema这个参数我们一般不会打开,所以我们只能通过事务id去binlog找了

1. 查询binlog文件

首先,我们需要找到包含我们需要查询的事务id的binlog文件。可以使用以下命令查看当前正在生成的binlog文件

sql 复制代码
SHOW MASTER STATUS;

2.使用mysqlbinlog查找事务ID:

接下来,可以使用mysqlbinlog命令配合--start-position和--stop-position参数,逐步定位到含有特定事务ID的binlog记录。但是直接通过事务ID查找可能不直接支持,因为通常事务ID并不直接暴露为查询条件。一个更通用的方式是结合事务的时间戳或者其他上下文信息进行搜索。

如果你确切知道某个事务大致发生的时间,可以利用时间筛选,例如:

sql 复制代码
mysqlbinlog --start-datetime="2024-07-31 14:00:00" mysql-bin.000001 | grep "事务相关的关键词或ID"

3.将binlog解析后的SQL语句输出到一个文本文件中

sql 复制代码
mysqlbinlog mysql-bin.000001 > output.sql
mysqlbinlog --base64-output=DECODE-ROWS --verbose mysql-bin.000001 > output.sql

这样就可以从输出文件中找到我们事务的信息了

锁等待事务已经回滚

这种时候只能看看现在RUNNING的线程,看看是否像我们这种情况有事务长时间占用,通过事务id找到具体sql

sql 复制代码
SELECT * FROM information_schema.INNODB_TRX;
相关推荐
sg_knight15 分钟前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
Chan1644 分钟前
批处理优化:从稳定性、性能、数据一致性、健壮性、可观测性五大维度,优化批量操作
java·spring boot·后端·性能优化·java-ee·intellij-idea·优化
行者阿毅44 分钟前
langchain4j+DashScope (通义千问)文生图
java·ai作画
Bug退退退1231 小时前
Java 网络流式编程
java·服务器·spring·sse
IT机器猫1 小时前
RabbitMQ
java·rabbitmq·java-rabbitmq
小杨的全栈之路1 小时前
冒泡、插入、选择、归并、堆排序:从名字由来到Java实现,一篇讲透
java·排序算法
yinke小琪1 小时前
面试官:谈谈为什么要拆分数据库?有哪些方法?
java·后端·面试
自由的疯1 小时前
java DWG文件转图片
java·后端·架构
小兔崽子去哪了1 小时前
EasyExcel 使用
java·excel
青云交1 小时前
Java 大视界 -- Java 大数据机器学习模型的对抗攻击与防御技术研究
java·机器学习模型·对抗攻击·java 大数据·防御技术·对抗训练·i - fgsm