mysql死锁排查

Mysql 查询是否存在锁表有多种方式,这里只介绍一种最常用的
1、查看正在进行中的事务
SELECT * FROM information_schema.INNODB_TRX
2、查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3、查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
4、查询是否锁表
SHOW OPEN TABLES where In_use > 0;
在发生死锁时,这几种方式都可以查询到和当前死锁相关的信息。
5、查看最近死锁的日志
show engine innodb status
解除死锁
如果需要解除死锁,有一种最简单粗暴的方式,那就是找到进程id之后,直接干掉。
查看当前正在进行中的进程
show processlist
// 也可以使用
SELECT * FROM information_schema.INNODB_TRX;
这两个命令找出来的进程id 是同一个 ,杀掉进程对应的进程 id kill id
验证(kill后再看是否还有锁)
SHOW OPEN TABLES where In_use > 0;
在这里插入图片描述

详解

MySQL死锁的排查是一个涉及多个步骤的过程,主要包括查看死锁信息、分析锁等待情况、优化事务和SQL语句等。以下是一些详细的排查步骤:
1.查看死锁信息
使用SHOW ENGINE INNODB STATUS命令
运行SHOW ENGINE INNODB STATUS;命令可以查看InnoDB存储引擎的状态信息,包括最近检测到的死锁信息。在输出结果中,找到LATEST DETECTED DEADLOCK部分,这里会列出最近发生的死锁信息,包括涉及的事务、它们持有的锁以及等待的锁等。
查看死锁日志
如果MySQL配置了死锁日志(通过innodb_print_all_deadlocks = 1在配置文件中启用),死锁日志会记录在MySQL的错误日志文件中。可以通过查看错误日志文件来获取死锁的详细信息。
2.分析锁等待情况
使用information_schema数据库中的表
INNODB_LOCKS:显示当前持有的锁。
INNODB_LOCK_WAITS:显示锁等待关系。
查询这些表可以获取当前锁的详细信息,包括哪些事务正在等待锁以及哪些锁被其他事务持有。
使用performance_schema数据库
MySQL的performance_schema提供了丰富的性能监控信息,包括锁的等待信息。可以查询performance_schema.data_locks和performance_schema.data_lock_waits表来获取锁的详细信息和等待关系。
3.分析SQL语句和事务
查看当前运行的事务
使用SELECT * FROM information_schema.INNODB_TRX;命令可以查看当前运行的所有事务及其状态,包括事务ID、事务状态、执行时间、执行的SQL语句等。
分析SQL语句的执行计划
使用EXPLAIN命令分析可能导致死锁的SQL语句的执行计划。通过分析执行计划,可以了解SQL语句是如何执行的,包括使用的索引、锁的类型等,从而发现可能导致死锁的问题。
4.优化事务和SQL语句
优化事务设计
减少事务的粒度:将大事务拆分为多个小事务,减少锁的持有时间。
优化事务的执行顺序:确保多个事务以相同的顺序请求相同的资源。
减少事务的并发度:通过调整事务的并发度,减少资源竞争。
优化SQL语句
使用合适的索引:通过使用合适的索引,减少锁的粒度。
减少锁的持有时间:通过优化SQL语句,减少锁的持有时间。
避免全表扫描:通过避免全表扫描,减少锁的竞争。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值