首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL死锁问题定位思路

MySQL死锁问题定位思路

原创
作者头像
用户1272933
发布于 2020-03-18 11:56:39
发布于 2020-03-18 11:56:39
3.7K00
代码可运行
举报
文章被收录于专栏:DPDK性能优化DPDK性能优化
运行总次数:0
代码可运行

1.如何知道系统有没有发生过死锁,如何去查看发生过的锁

show status like ‘innodb_row_lock%'; 从系统启动到现在的数据

Innodb_row_lock_current_waits:当前正在等待锁的数量;

Innodb_row_lock_time :锁定的总时间长度,单位ms;

Innodb_row_lock_time_avg :每次等待所花平均时间;

Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间;

Innodb_row_lock_waits :从系统启动到现在总共等待的次数。

平均时间和锁等待次数比较大的话,说明可能会存在锁争用情况

2. show engine innodb status

展示innodb存储引擎的运行状态

通过这个命令显示的内容比较多,其中有一项lasted detected deadlock 显示最近发生的死锁。

图中红色线条标注的是执行的SQL,以及加了什么锁,可以看出是在这行记录上加了X锁,没有gap锁。

3. 错误日志中查看历史发生过的死锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set global innodb_print_all_deadlocks=1;

上一个命令,只能看到最近发生的锁,如果我想看历史发生的锁怎么办? 执行这一句,更改innodb 的一个配置,innodb_print_all_deadlocks,打印所有的死锁。会将死锁的信息输出到mysql的错误日志中,默认是不输出,格式和show engine innodb status 是差不多的。

4. information_schema.innodb_locks

information_schema 数据库是mysql自带的,保存着关于MySQL服务器所维护的所有其他数据库的信息。其中innodb_locks表,记录了事务请求但是还没获得的锁,即等待获得的锁。

lock_id:锁的id,由锁住的空间id编号、页编号、行编号组成

lock_trx_id:锁的事务id。

lock_mode:锁的模式。S[,GAP], X[,GAP], IS[,GAP], IX[,GAP]

lock_type:锁的类型,表锁还是行锁

lock_table:要加锁的表。

lock_index:锁住的索引。

lock_space:innodb存储引擎表空间的id号码

lock_page:被锁住的页的数量,如果是表锁,则为null值。

lock_rec:被锁住的行的数量,如果表锁,则为null值。

lock_data:被锁住的行的主键值,如果表锁,则为null值。

5. information_schema.innodb_lock_waits

查看等待中的锁

requesting_trx_id:申请锁资源的事务id。

requested_lock_id:申请的锁的id。

blocking_trx_id:阻塞的事务id,当前拥有锁的事务ID。

blocking_lock_id:阻塞的锁的id,当前拥有锁的锁ID

6. information_schema.innodb_trx

查看已开启的事务

trx_id:innodb存储引擎内部事务唯一的事务id。

trx_state:当前事务的状态。

trx_started:事务开始的时间。

trx_requested_lock_id:等待事务的锁id,如trx_state的状态为LOCK WAIT,那么该值代表当前事务之前占用锁资源的id,如果trx_state不是LOCK WAIT的话,这个值为null。

trx_wait_started:事务等待开始的时间。

trx_weight:事务的权重,反映了一个事务修改和锁住的行数。在innodb的存储引擎中,当发生死锁需要回滚时,innodb存储引擎会选择该值最小的事务进行回滚。

trx_mysql_thread_id:正在运行的mysql中的线程id,show full processlist显示的记录中的thread_id。

trx_query:事务运行的sql语句

写在最后:

出现死锁问题时,可以查看系统设置的隔离级别,RR与RC在加锁粒度上存在很大区别,RR隔离级别因为加锁粒度更大,在并发更新表的场景下容易产生思索,通常是因为UPDATE语句的where条件所带的字段是普通索引,通常变更成唯一索引可以解决死锁问题。也可以评估业务系统是否兼容RC隔离级别,直接切换隔离级别。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 死锁的详细分析方法
用数据库的时候,偶尔会出现死锁,针对我们的业务系统,出现死锁的直接结果就是系统卡顿、客户找事儿,所以我们也在想尽全力的消除掉数据库的死锁。出现死锁的时候,如果只是想解锁,用show full processlist看下kill掉就好了,如果想查找到详细的问题,一个办法是用show engine innodb status来查看简略信息或者开死锁日志,后期在MySQL日志里面慢慢分析。以上这写方法我们都用过,最近在看Innodb的书的时候发现另一种实时的分析方法,能最大限度的分析死锁的原因。
星哥玩云
2022/08/17
5630
解决死锁之路(终结篇)- 再见死锁
在遇到线上死锁问题时,我们应该第一时间获取相关的死锁日志。我们可以通过 show engine innodb status 命令来获取死锁信息,但是它有个限制,只能拿到最近一次的死锁日志。MySQL 提供了一套 InnoDb 的监控机制,用于周期性(每隔 15 秒)输出 InnoDb 的运行状态到 mysqld 服务的标准错误输出(stderr)。默认情况下监控是关闭的,只有当需要分析问题时再开启,并且在分析问题之后,建议将监控关闭,因为它对数据库的性能有一定影响,另外每 15 秒输出一次日志,会使日志文件变得特别大。
用户2781897
2019/08/29
2.7K0
解决死锁之路(终结篇)- 再见死锁
一文理解MySQL的锁机制与死锁排查
MySQL的并发控制是在数据安全性和并发处理能力之间的权衡,通过不同的锁策略来决定对系统开销和性能的影响。
全菜工程师小辉
2021/06/25
2.7K0
一文理解MySQL的锁机制与死锁排查
MySQL锁
  MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。
lyb-geek
2018/12/12
1.9K0
MySQL锁
面试系列-mysql锁机制及死锁排查
如果有事务在表里执行增删改操作,那在行级会加独占锁,此时其实同时会在表级加一个意向独占锁;如果有事务在表里执行查询操作,那么会在表级加一个意向共享锁。其实平时操作数据库,比较常见的两种表锁,反而是更新和查询操作加的意向独占锁和意向共享锁,但是可以忽略这个意向独占锁和意向共享锁,因为两种意向锁根本不会互斥;
用户4283147
2022/10/27
8120
面试系列-mysql锁机制及死锁排查
MySQL死锁详解及检测和避免
链接: 详解MySQL脏读幻读不可重复读及事务的隔离级别和MVCC、LBCC实现,还有锁的详解 在我们使用锁的时候,有一个问题是需要注意和避免的,我们知道,排它锁有互斥的特性。一个事务或者说一个线程持有锁的时候,会阻止其他的线程获取锁,这个时候会造成阻塞等待,如果循环等待,会有可能造成死锁。
向着百万年薪努力的小赵
2022/12/02
9630
MySQL死锁详解及检测和避免
MySQL 锁机制和事务
InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据。当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁
星哥玩云
2022/08/17
8730
MySQL 锁机制和事务
MySQL锁等待与死锁问题分析
在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学习下什么是锁等待及死锁,出现此类问题又应该如何分析处理呢?
MySQL技术
2021/04/13
2.2K3
MySQL探秘(五):InnoDB锁的类型和状态查询
 锁是数据库系统区分于文件系统的一个关键特性。数据库使用锁来支持对共享资源进行并发访问,提供数据的完整性和一致性。此外,数据库事务的隔离性也是通过锁实现的。InnoDB在此方面一直优于其他数据库引擎。InnoDB会在行级别上对表数据上锁,而MyISAM只能在表级别上锁,二者性能差异可想而知。
aoho求索
2018/12/12
1.1K0
MySQL探秘(五):InnoDB锁的类型和状态查询
MySQL底层概述—10.InnoDB锁机制
undo log版本链 + Read View机制实现的MVCC多版本并发控制,可以防止事务并发读写同一数据时出现的脏读+不可重复读+幻读问题。但除脏读+不可重复读+幻读问题外,并发读写同一数据还有脏写问题。就是当多个事务并发更新同一条数据时,此时就可能会出现脏写问题,如下图示:
东阳马生架构
2025/02/14
3480
MySQL事务(一)MySQL事务隔离级别、锁机制
数据库通常会同时执行多个事务,这些事务可能同时对同一批数据进行增删改查操作,可能会导致脏写、脏读、不可重复读和幻读等问题。
鳄鱼儿
2024/05/21
1.6K0
MySQL事务(一)MySQL事务隔离级别、锁机制
第15章_锁
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
2390
第15章_锁
MySQL的innoDB锁机制以及死锁处理
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,innodb正常的select ID from table where id=1;不会上任何锁,接下来详细讨论InnoDB的锁问题;
星哥玩云
2022/08/16
1K0
MySQL的innoDB锁机制以及死锁处理
MySQL 事务
SELECT * FROM user LOCK IN SHARE MODE; ** SELECT * FROM user FOR UPDATE;** ** DELETE FROM user WHERE id = 1;** |
编程之心
2022/05/10
3.2K0
MySQL 事务
【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?
在上文我们曾小小的提到过,在索引失效的情况下,MySQL会把所有聚集索引记录和间隙都锁上,我们称之为锁表,或叫行锁升表锁.
天罡gg
2022/12/29
3K0
【MySQL】说透锁机制(三)行锁升表锁如何避免? 锁表了如何排查?
MySQL 在并发场景下的问题及解决思路
对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外。尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路。
wangxl
2018/07/27
1.4K0
MySQL 在并发场景下的问题及解决思路
【MySQL入门】之MySQL数据库的锁机制(二)
上篇文章主要聊了全局锁和表锁,并详细分析MDL锁的作用以及可能带来的问题。今天我们主要来聊一聊Innodb存储引擎的行锁。MySQL的行锁是在引擎层由引擎自己实现的,并不是所有的引擎都支持行锁,MyISAM 引擎就不支持行锁。行锁,顾名思义就是针对数据表中的行记录的锁。比如事物A更新了一行,而事物B也要更新同一行,就必须等待事物A的操作完成后才能进行。下面我们就介绍下行锁的种类,针对不同的锁进行操作演示。
MySQL数据库技术栈
2020/08/05
1K0
【MySQL入门】之MySQL数据库的锁机制(二)
Mysql一分钟定位 Next-Key Lock,你需要几分钟
查看线程模型 show variables like 'thread_handling'
王清培
2020/01/27
4240
漫谈死锁
一 前言 死锁是每个MySQL DBA 都会遇到的技术问题,本文是自己针对死锁学习的一个总结,了解死锁是什么,MySQL如何检测死锁,处理死锁,死锁的案例,如何避免死锁。
用户1278550
2018/08/09
1.2K0
InnoDB 存储引擎中的锁.
InnoDB 存储引擎 lock 的对象是事务,用来锁定的是数据库中的对象,如表、页、行,并且一般 lock 的对象仅在事务 commit 或 rollback 后进行释放(不同事务隔离级别释放的时间可能不同)。
JMCui
2021/01/06
7950
相关推荐
MySQL 死锁的详细分析方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验