mysql死锁排查

news2024/11/28 6:38:31
  • 查看正在进行中的事务
SELECT * FROM information_schema.INNODB_TRX;
字段解释
trx_id唯一事务id号,只读事务和非锁事务是不会创建id的
trx_state事务的执行状态,值一般分为:RUNNING, LOCK WAIT, ROLLING BACK, and COMMITTING.
trx_started事务的开始时间
trx_requested_lock_id如果trx_state是lock wait,显示事务当前等待锁的id,不是则为空。想要获取锁的信息,根据该lock_id,以innodb_locks表中lock_id列匹配条件进行查询,获取相关信息。
trx_wait_started如果trx_state是lock wait,该值代表事务开始等待锁的时间;否则为空。
trx_weight事务的高度,代表修改的行数(不一定准确)和被事务锁住的行数。为了解决死锁,innodb会选择一个高度最小的事务来当做牺牲品进行回滚。已经被更改的非交易型表的事务权重比其他事务高,即使改变的行和锁住的行比其他事务低。
trx_mysql_thread_idmysql线程id。想要获取该线程的信息,根据该thread_id,以information_schema.processlist表的id列为匹配条件进行查询。
trx_query事务正在执行的sql语句。
trx_operation_state事务当前的操作状态,没有则为空。
trx_tables_in_use事务在处理当前sql语句使用innodb引擎表的数量。
trx_tables_locked当前sql语句有行锁的innodb表的数量。(因为只是行锁,不是表锁,表仍然可以被多个事务读和写)
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最新一个外键错误信息,没有则为空。
trx_adaptive_hash_latched自适应哈希索引是否被当前事务阻塞。当自适应哈希索引查找系统分区,一个单独的事务不会阻塞全部的自适应hash索引。自适应hash索引分区通过 innodb_adaptive_hash_index_parts参数控制,默认值为8。
trx_adaptive_hash_timeout是否为了自适应hash索引立即放弃查询锁,或者通过调用mysql函数保留它。当没有自适应hash索引冲突,该值为0并且语句保持锁直到结束。在冲突过程中,该值被计数为0,每句查询完之后立即释放门闩。当自适应hash索引查询系统被分区(由 innodb_adaptive_hash_index_parts参数控制),值保持为0。
trx_is_read_only值为1表示事务是read only。
trx_autocommit_non_locking值为1表示事务是一个select语句,该语句没有使用for update或者shared mode锁,并且执行开启了autocommit,因此事务只包含一个语句。当TRX_AUTOCOMMIT_NON_LOCKING和TRX_IS_READ_ONLY同时为1,innodb通过降低事务开销和改变表数据库来优化事务。
  • 查看正在锁的事务
SELECT * FROM information_schema.INNODB_LOCKS;
字段解释
lock_idinnodb唯一lock id。把他当做一个不透明的字符串。虽然lock_id当前包含trx_id,lock_id的数据格式在任何时间都肯能改变。不要写用于解析lock_id值得应用程序。
lock_trx_id持有锁的事务id。查询事务信息,与innodb_trx表中trx_id列匹配。
lock_mode锁请求。该值包括: S, X, IS, IX, GAP, AUTO_INC, and UNKNOWN。锁模式标识符可以组合用于识别特定的锁模式。查看更多信息,点击此处
lock_type锁类型。行锁为record,表锁为table。
lock_table被锁的表名,或者包含锁记录的表名。
lock_indexlock_type为行锁时,该值为索引名,否则为空。
lock_spacelock_type为行锁时,该值为锁记录的表空间的id,否则为空。
lock_pagelock_type为行锁时,该值为锁记录页数量,否则为空。
lock_reclock_type为行锁时,页内锁记录的堆数,否则为空。
lock_data与锁相关的数据。如果lock_type为行锁时,该值是锁记录的主键值,否则为空。这列包含锁定行的主键列的值,转化为一个有效的字符串,如果没有主键,lock_data是唯一innodb内部行id号。如果是键值或者范围大于索引的最大值会使用间隙锁,lock_data表示为supremum pseudo-record。当包含锁记录的页不在buffer pool内,innodb不去从磁盘获取页,为了避免不必要的磁盘操作,lock_data为空。
  • 查看等待锁的事务
SELECT * FROM information_schema.INNODB_LOCK_WAITS;
字段解释
requesting_trx_id请求(阻止)事务的ID。
requested_lock_id事务正在等待的锁的ID。
blocking_trx_id阻止事务的ID。
blocking_lock_id由阻止另一个事务继续进行的事务所持有的锁的ID
  • 显示当前被锁定的表的列表
SHOW OPEN TABLES where In_use > 0;
字段解释
Database数据库名称
Table表名称
In_use表示有多少线程正在使用某张表
Name_locked表名是否被锁,这一般发生在Drop或Rename命令操作这张表时
  • 查看InnoDB存储引擎的状态信息,包括在途事务、锁、缓冲池和日志文件等。
show engine innodb status;
字段解释
InnoDB存储引擎
Name
Status最近一次事务、锁、缓存池的日志信息
  • 显示用户正在运行的线程
show processlist;
字段解释
Id这个线程的唯一标识,当我们发现这个线程有问题的时候,可以通过 kill 命令,加上这个Id值将这个线程杀掉。
User指启动这个线程的用户。
Host记录了发送请求的客户端的 IP 和 端口号。通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的哪个进程发送的请求。
db当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。
Command指此刻该线程正在执行的命令。
Time表示该线程处于当前状态的时间。
State线程的状态,和Command对应。
Info一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。

死锁的内部处理方案:

  • 死锁探测机制 innodb_deadlock_detect 默认开启,会自动回滚其中一个事务
  • 锁等待超时机制 innodb_lock_wait_timeout 默认50s锁超时自定释放

死锁分析:

表中数据:student

idnameage
1linging20
2zhangsan30
3lisi15
事务14360事务14361
beginbegin
①select *from student where id = 2 for update;
②select *from student where id = 3 for update;
③select *from student where id = 3 for update;
④select *from student where id = 2 for update;

执行完①②语句时:

查看事务:SELECT * FROM information_schema.INNODB_TRX

在这里插入图片描述

接着执行③:

查看正在运行的事务:SELECT * FROM information_schema.INNODB_TRX

在这里插入图片描述

查看正在锁的事务:SELECT * FROM information_schema.INNODB_LOCKS

在这里插入图片描述

查看等待锁的事务:SELECT * FROM information_schema.INNODB_LOCK_WAITS

在这里插入图片描述

显示当前被锁定的表的列表:SHOW OPEN TABLES where In_use > 0

在这里插入图片描述

查看线程列表:show processlist;

在这里插入图片描述

如果此时什么也不做,那么事务14360的语句③在等待事务14361的语句②释放X锁,等待50s之后,锁超时释放:

在这里插入图片描述

这时如果执行事务14361的语句④,那么出现死锁,mysql自动进行死锁检测,检测之后回滚其中的一个事务

在这里插入图片描述

查看正在运行的事务:SELECT * FROM information_schema.INNODB_TRX

在这里插入图片描述

可以看到,事务14361被回滚了。

查看最近一次死锁的日志:show engine innodb status;

=====================================
2024-01-04 22:14:15 0x7f5b44b28700 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 0 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 14 srv_active, 0 srv_shutdown, 3577 srv_idle
srv_master_thread log flush and writes: 3591
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 14
OS WAIT ARRAY INFO: signal count 14
Mutex spin waits 0, rounds 0, OS waits 0
RW-shared spins 13, rounds 25, OS waits 12
RW-excl spins 0, rounds 22543, OS waits 0
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 0.00 mutex, 1.92 RW-shared, 22543.00 RW-excl, 0.00 RW-sx
------------------------
LATEST DETECTED DEADLOCK
------------------------
2024-01-04 22:10:57 0x7f5b44ae7700
*** (1) TRANSACTION:
TRANSACTION 14360, ACTIVE 484 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 4 row lock(s)
MySQL thread id 1, OS thread handle 140029971568384, query id 940 192.168.159.1 root statistics
select *from student where id = 3 for update
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 71 page no 3 n bits 72 index `PRIMARY` of table `ssm`.`student` trx id 14360 lock_mode X locks rec but not gap waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
 0: len 8; hex 8000000000000003; asc         ;;
 1: len 6; hex 000000003808; asc     8 ;;
 2: len 7; hex 260000019214e8; asc &      ;;
 3: len 4; hex 6c697369; asc lisi;;
 4: len 4; hex 8000000f; asc     ;;
 5: len 8; hex 3132333133313233; asc 12313123;;
 6: len 8; hex 7368656e7a68656e; asc shenzhen;;

*** (2) TRANSACTION:
TRANSACTION 14361, ACTIVE 481 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 3, OS thread handle 140029971035904, query id 951 192.168.159.1 root statistics
select *from student where id = 2 for update
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 71 page no 3 n bits 72 index `PRIMARY` of table `ssm`.`student` trx id 14361 lock_mode X locks rec but not gap
Record lock, heap no 4 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
 0: len 8; hex 8000000000000003; asc         ;;
 1: len 6; hex 000000003808; asc     8 ;;
 2: len 7; hex 260000019214e8; asc &      ;;
 3: len 4; hex 6c697369; asc lisi;;
 4: len 4; hex 8000000f; asc     ;;
 5: len 8; hex 3132333133313233; asc 12313123;;
 6: len 8; hex 7368656e7a68656e; asc shenzhen;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 71 page no 3 n bits 72 index `PRIMARY` of table `ssm`.`student` trx id 14361 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
 0: len 8; hex 8000000000000002; asc         ;;
 1: len 6; hex 00000000380a; asc     8 ;;
 2: len 7; hex 27000001932072; asc '     r;;
 3: len 8; hex 7a68616e6773616e; asc zhangsan;;
 4: len 4; hex 8000001e; asc     ;;
 5: len 8; hex 3132333133313233; asc 12313123;;
 6: len 8; hex 7368656e7a68656e; asc shenzhen;;

*** WE ROLL BACK TRANSACTION (2)
------------
TRANSACTIONS
------------
Trx id counter 14362
Purge done for trx's n:o < 14350 undo n:o < 0 state: running but idle
History list length 392
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421505098215608, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 421505098214760, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 421505098213912, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 14360, ACTIVE 682 sec
3 lock struct(s), heap size 1136, 4 row lock(s)
MySQL thread id 1, OS thread handle 140029971568384, query id 958 192.168.159.1 root cleaning up
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
670 OS file reads, 187 OS file writes, 54 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 276671, node heap has 2 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 8937219
Log flushed up to   8937219
Pages flushed up to 8937219
Last checkpoint at  8937210
0 pending log flushes, 0 pending chkp writes
38 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137494528
Dictionary memory allocated 361089
Buffer pool size   8191
Free buffers       7785
Database pages     404
Old database pages 0
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 369, created 35, written 135
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 404, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=1, Main thread ID=140029846894336, state: sleeping
Number of rows inserted 3, updated 3, deleted 0, read 51
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

分析日志:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1356915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java SSM框架实现中国古诗词学习平台项目【项目源码】

基于java的SSM框架实现中国古诗词学习平台系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用…

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统 随着油气工业的发展&#xff0c;管道泄漏成为一个严峻的安全问题。本文介绍了一种基于LabVIEW的分布式光纤油气管道泄漏检测及预警系统的设计思路和组成结构。系统包括硬件和软件两部分&#xff0c;其中硬件部分详细阐述了分…

进程的介绍及相关命令

首先&#xff0c;先了解一下计算机五大性能的命令 cpu top w 内存 top free 硬盘剩余 df 硬盘读写性能 iostat 网络带宽 iftop 一&#xff0c;进程与程序 1&#xff0c;什么是程序 &#xff1a; 硬盘上躺着&#xff0c;执行特点任务的一串代码 2&am…

AI边缘计算智能分析网关V4如何配置周界入侵检测算法

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛&#xff0c;如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告…

动态分区分配算法-第四十四天

目录 前言 首次适应算法&#xff08;First Fit&#xff09; 最佳适应算法&#xff08;Best Fit&#xff09; 最坏适应算法&#xff08;Worst Fit&#xff09; 临近适应算法&#xff08;Next Fit&#xff09; 本节思维导图 前言 动态分区分配算法&#xff1a;在动态分区分…

C#使用switch多路选择语句判断何为季节

目录 一、 switch语句 二、示例 三、生成 一、 switch语句 switch语句是多路选择语句&#xff0c;它通过一个表达式的值来使程序从多个分支中选取一个用于执行的分支。 switch表达式的值只可以是整型、字符串、枚举和布尔类型。 switch语句中多个case可以使用一个break。 在…

移动通信原理与关键技术学习(2)

1.多径信道滤波器表示&#xff0c;多径信道可以认为是线性时变滤波器&#xff0c;接收信号为发送信号与信道冲激响应的卷积。 2.调制就是对信号源的信息进行处理加到载波上&#xff0c;使其变为适合于信道传输的形式的过程&#xff0c;就是使载波随信号而改变的技术。 3.进行调…

CodeWave智能开发平台--03--目标:应用创建--01模板创建依赖问题修改

摘要 本文是网易数帆CodeWave智能开发平台系列的第03篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成模板创建时的依赖问题解决。 CodeWave智能开发平台的03次接触 CodeWave参考资源 网易数帆Code…

3个.NET开源简单易用的任务调度框架

前言 今天分享3个.NET开源、简单、易用的任务调度框架&#xff0c;帮助大家在做定时任务调度框架技术选型的时候有一个参考。 Quartz.Net Quartz.NET是一个功能齐全的开源作业调度系统&#xff0c;可用于从最小的应用程序到大规模企业系统。 Quartz.NetUI Quartz.NetUI是一…

Java 泛型深入解析

Java 中的泛型是一种强大的编程特性&#xff0c;允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面&#xff0c;包括泛型类、泛型方法、泛型接口以及泛型通配符。 1. 泛型类 首先&#xff0c;让我们看一个简单的泛型类的例子。在下面的代码中&a…

功能问题:如何限制同一账号只能在一处登录?

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

C语言快速入门——基础知识

C语言基础 C语言基础C程序基本格式基本数据类型原码、反码和补码原码反码补码 整数类型浮点类型字符类型 变量变量的使用无符号数类型转换 运算符基本运算符运算符优先级自增自减运算符位运算符逻辑运算符 流程控制分支语句 - if分支语句 - switch循环语句 - for循环语句 - whi…

两种高效计算 两个经纬度之间距离的方法--解决Haversine 公式性能慢的问题

目录 前言 Haversine 原理 实现代码 优化后的距离计算 原理 代码 性能及精度对比 前言 最新开发的业务中&#xff0c;涉及到计算两个经纬度之间的距离。已知A点和B点的 经纬度&#xff0c;计算A点到B点之间的距离。最开始使用的是Haversine公式来进行计算&…

opencv期末练习题(8)附带解析

图像切片 %matplotlib inline import cv2 import matplotlib.pyplot as plt def imshow(img,grayFalse,bgr_modeFalse):if gray:img cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)plt.imshow(img,cmap"gray")else:if not bgr_mode:img cv2.cvtColor(img,cv2.COLOR_BGR2RG…

014、枚举与模式匹配

枚举类型&#xff0c;通常也被简称为枚举&#xff0c;它允许我们列举所有可能的值来定义一个类型。在本篇文章中&#xff0c;我们首先会定义并使用一个枚举&#xff0c;以向你展示枚举是如何连同数据来一起编码信息的。 接着&#xff0c;我们会讨论一个特别有用的枚举&#xff…

双碳管理系统任务需求分析(第10套)

需求规格说明书 一、引言 &#xff08;一&#xff09;项目背景 编写本需求规格说明书的目的是为了详细呈现碳足迹产品需求和系统的功能描述&#xff0c;以进一步定制应用软件系统开发的细节问题&#xff0c;便于与项目开发协调工作。本文档面向的读者主要是项目委托单位的管…

找不到vcruntime140.dll怎么处理?6个修复教程分享

本文将详细介绍vcruntime140.dll文件的相关内容&#xff0c;并提供6个不同的修复教程&#xff0c;帮助大家解决这一问题。 一、vcruntime140.dll是什么文件&#xff1f; vcruntime140.dll是Visual C Redistributable Packages的一部分&#xff0c;它是Microsoft Visual Studi…

Alice Bob推出16量子比特量子处理单元——“Helium 1”

​&#xff08;图片来源&#xff1a;网络&#xff09; 容错量子计算机硬件开发商Alice & Bob宣布已成功流片一款新芯片“Helium 1”&#xff0c;希望能借助该芯片降低随着量子比特数增加而提高的错误率&#xff0c;这是该公司第一个纠错逻辑量子比特&#xff08;纠错量子计…

MySQL Enterprise版本各系统安装包下载

一、官方下载地址 oracle下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 使用oracle账号登录进去 Category选择Download Package(下载安装包)&#xff0c;搜索栏输入mysql Enterprise关键字点search进行搜索。选项结果第一个MySQL Enterprise Edition&a…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…