Mysql - InnoDB 锁等待,死锁的排查语句

本文介绍了如何排查MySQL InnoDB存储引擎的锁等待和死锁问题,包括使用SHOW OPEN TABLES、SHOW FULL PROCESSLIST、SELECT FROM INFORMATION_SCHEMA.INNODB_TRX等命令,以及解析INNODB_LOCK_WAITS和INNODB_STATUS的日志信息,帮助数据库管理员有效诊断和解决并发事务中的锁冲突。
摘要由CSDN通过智能技术生成

导航


1. SHOW OPEN TABLES where In_use > 0

这条语句主要用于查看表的锁竞争情况,where 条件限制了只有存在锁竞争才会显示数据。
显示字段如下:

  • Database
    数据库名称

  • Table
    表名

  • In_use
    表锁会使这个值+1,每个请求行锁而阻塞的线程也会使这个值+1

  • Name_locked
    表名是否被锁定。名称锁定用于诸如删除或重命名表的操作

2. SHOW FULL PROCESSLIST

这条语句显示当前正在运行的线程连接,如果你的权限足够,那么你可以看到全部的用户的线程,否则只能看到你当前用户的线程。
显示字段如下:

  • Id
    线程id,可以使用 kill id 来杀死这条线程。

  • Host
    创建连接的主机地址

  • db
    使用的数据库

  • Command
    线程正在执行的命令的类型。
    具体信息查看 Mysql官网Commom描述

  • Time
    线程处于当前状态的时间(以秒未单位)

  • State
    线程正在执行的操作,事件或者状态
    大多数状态对应于非常快速的操作。如果线程在给定状态下停留许多秒钟,则可能存在需要调查的问题。
    具体信息查看Mysql官网State描述

  • Info
    线程当前正在执行的语句

3.SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX

这条语句显示InnoDb中正在开启的非只读事务的相关信息。
这条语句我们重点关注它是否正在等待锁,以及事务的开始时间。
显示字段如下:

  • TRX_ID
    事务Id

  • TRX_WEIGHT
    事务的权重,反映(未必是准确的)已更改的行和该事务锁定的行数。出现死锁时,InnoDb通常会回滚权重较小的事务。

  • TRX_STATE
    事务执行状态。允许值是 RUNNING,LOCK WAIT, ROLLING BACK,和 COMMITTING。

  • TRX_STARTED
    事务的开始时间

  • TRX_REQUESTED_LOCK_ID
    事务当前正在等待的锁的ID

  • TRX_WAIT_STARTED
    事务等待锁的时间

  • TRX_MYSQL_THREAD_ID
    Mysql的线程id

  • TRX_QUERY
    事务正在执行的SQL语句

  • TRX_OPERATION_STATE
    事务当前的操作状态

  • TRX_TABLES_IN_USE
    事务使用到的表的数量

  • TRX_TABLES_LOCKED
    事务从多少个表中获取了锁

  • TRX_LOCK_STRUCTS
    事务保留的锁数。

  • TRX_LOCK_MEMORY_BYTES
    内存中此事务的锁结构占用的总大小。

  • TRX_ROWS_LOCKED
    此事务的锁定行数

  • TRX_ROWS_MODIFIED
    此事务中已修改和已插入的行数。

  • TRX_CONCURRENCY_TICKETS
    由innodb_concurrency_tickets 系统变量指定的值,该值指示当前事务在被换出之前可以完成多少工作

  • TRX_ISOLATION_LEVEL
    当前事务的隔离级别。

  • TRX_UNIQUE_CHECKS
    当前事务是打开还是关闭唯一检查。例如,它们可能在批量数据加载期间关闭。

  • TRX_FOREIGN_KEY_CHECKS
    当前事务是打开还是关闭唯一检查。例如,它们可能在批量数据加载期间关闭。

  • TRX_LAST_FOREIGN_KEY_ERROR
    最后一个外键错误的详细错误消息(如果有);否则NULL。

  • TRX_ADAPTIVE_HASH_LATCHED
    自适应哈希索引是否被当前事务锁定。(一次仅一个事务可以修改自适应哈希索引。)

  • TRX_ADAPTIVE_HASH_TIMEOUT
    是立即放弃搜索锁存器以获取自适应哈希索引,还是在MySQL的调用之间保留它。当没有自适应哈希索引争用时,此值保持为零,并且语句保留闩锁,直到它们完成为止。在争用期间,它递减计数为零,并且语句在每次查询行后立即释放锁存器。

  • TRX_IS_READ_ONLY
    值为1表示事务是只读的。

  • TRX_AUTOCOMMIT_NON_LOCKING
    值为1表示事务是 SELECT不使用 FOR UPDATE 或者LOCK IN SHARED MODE子句的语句,并且正在autocommit启用状态下执行, 因此事务将仅包含此一条语句。当此列和TRX_IS_READ_ONLY均为1时,InnoDB优化事务以减少与更改表数据的事务相关的开销。

4. SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS

这条语句显示 InnoDB 中产生锁等待的事务信息。
一个锁等待至少会产生两行的数据,分别是等待锁的事务,以及持有锁的事务。
显示字段如下:

  • LOCK_ID
    内部唯一的锁ID号

  • LOCK_TRX_ID
    请求或者持有锁的事务的ID

  • LOCK_MODE
    请求或者持有的锁。允许值S,X, IS,IX, GAP,AUTO_INC,和 UNKNOWN

  • LOCK_TYPE
    锁的类型。允许的值 RECORD用于行级锁定, TABLE表级锁定

  • LOCK_TABLE
    已锁定或包含锁定记录的表的名称

  • LOCK_INDEX
    索引的名称,如果LOCK_TYPE 为 RECORD 则显示;否则NULL

  • LOCK_SPACE
    锁定记录的表空间ID,如果LOCK_TYPE 为 RECORD 则显示;否则NULL

  • LOCK_PAGE
    锁定记录的页码,如果LOCK_TYPE 为 RECORD 则显示;否则NULL

  • LOCK_REC
    页面内锁定记录的堆号,如果LOCK_TYPE 为 RECORD 则显示;否则NULL

  • LOCK_DATA
    与锁关联的数据(如果有)。如果LOCK_TYPE为RECORD,则显示一个值,否则为NULL。
    如果锁定的是唯一索引,则显示的是二级索引的值。
    如果显示的是二级索引,则显示二级索引值并附加主键值。

5.SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS

这条语句显示锁等待的事务的对应信息。
显示字段如下:

  • REQUESTING_TRX_ID
    请求锁的事务id

  • REQUESTED_LOCK_ID
    请求的锁id

  • BLOCKING_TRX_ID
    持有锁的事务id

  • BLOCKING_LOCK_ID
    持有的锁id

6.SHOW ENGINE INNODB STATUS

这条语句显示的是Innodb过去一段时间的运行日志(这里是每一段时间刷新一次,因此未必是最新的)。
排除死锁的时候,我们重点关注 LATEST DETECTED DEADLOCK 这部分内容就好,这部分内容记录的是最近一次死锁的信息。

这部分的内容解析如下,如果需要更详细的 innodb status 内容的解析,可以查看这篇博客

------------------------
LATEST DETECTED DEADLOCK
------------------------
16
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值