一文教你学会定位线上MySQL锁超时问题

以下是“一文教你学会定位线上MySQL锁超时问题”的完整攻略。

问题背景

在MySQL中,为了保证并发性,当某个事务要修改数据时,会自动为要修改的行加上锁,防止其他事务同时访问,这种锁就叫做行锁。而当一些事务互相等待对方释放锁时,就会产生死锁,这时MySQL会自动检测到死锁,并选择其中一个事务进行回滚以解锁。

然而,在极端情况下,如果某个事务一直无法获得所需要的锁,就会出现锁超时,导致事务无法继续执行。本文将介绍如何定位线上MySQL锁超时问题。

方案

第一步:查看MySQL进程列表

通过show processlist命令查看MySQL当前的进程列表,找到正在执行的等待状态的进程,记录下它的ID。

示例1:

mysql> show processlist;
+----+------+-----------+------+---------+------+---------------------------------+
| Id | User | Host      | db   | Command | Time | State                           |
+----+------+-----------+------+---------+------+---------------------------------+
| 1  | root | localhost | NULL | Query   | 0    | starting                       |
| 2  | root | localhost | db1  | Sleep   | 0    |                                 |
| 3  | root | localhost | db1  | Sleep   | 0    |                                 |
| 4  | root | localhost | db1  | Query   | 10   | Waiting for table metadata lock |
+----+------+-----------+------+---------+------+---------------------------------+

其中,进程ID为4的进程处于等待表元数据锁的状态。如果长期处于等待状态,则极有可能出现锁超时问题。

第二步:查看进程的等待状态

通过show engine innodb status\G命令查看该进程的详细信息,找到“LATEST DETECTED DEADLOCK”一节,查看到达死锁的时间和死锁关键词(lock_key)。

示例2:

--------LATEST DETECTED DEADLOCK--------
2018-08-30 15:09:53 7f663d8f5700
*** (1) TRANSACTION:
TRANSACTION 996221511, ACTIVE 19 sec starting index read
mysql tables in use 7, locked 7
LOCK WAIT 6 lock struct(s), heap size 2936, 3 row lock(s)
MySQL thread id 108483233, OS thread handle 5115, query id 17460124 localhost root Sending data
SELECT COUNT(*) FROM table1 WHERE `name` LIKE '%xxx%'

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1843 page no 5691 n bits 1280 index PRIMARY of table `db1`.`table1` trx id 996221511 lock_mode X locks rec but not gap waiting
Record lock, heap no 6 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
...

*** (2) TRANSACTION:
TRANSACTION 996221500, ACTIVE 19 sec starting index read
mysql tables in use 7, locked 7
6 lock struct(s), heap size 2936, 3 row lock(s)
MySQL thread id 108482626, OS thread handle 5109, query id 17460108 localhost root Sending data
SELECT COUNT(*) FROM table2 WHERE `name` LIKE '%xxx%'

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1843 page no 35042 n bits 1280 index PRIMARY of table `db1`.`table2` trx id 996221500 lock_mode X locks rec but not gap
Record lock, heap no 9 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
...

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1843 page no 4578 n bits 1280 index PRIMARY of table `db1`.`table1` trx id 996221500 lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 9; compact format; info bits 0
...

可以看到,该进程正在执行SELECT COUNT(*) FROM table1 WHEREnameLIKE '%xxx%'这条查询语句,而同时也需要获取db1.table1表上的行锁。然而,该锁已经被进程ID为996221500的事务占用,导致出现锁等待,最终导致了死锁。

第三步:查看锁等待的时间

通过查看该进程的状态机(State Machine)可以得知该进程等待锁的时间,如果等待时间过长(如10秒以上),就有可能出现锁超时问题。还可以通过innodb_lock_wait_timeout系统变量来设置锁等待超时时间,以避免出现锁等待时间过长的情况。

结束语

在以上攻略的指引下,相信读者可以更好地定位线上MySQL锁超时问题,及时解决问题,保证系统的稳定性和高可用性。

示例1描述了使用show processlist命令查看MySQL当前进程的列表,示例2详细讲解了通过show engine innodb status\G命令查看当前进行执行的等待状态,以及查看进程等待的时间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文教你学会定位线上MySQL锁超时问题 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 缓存与数据库双写一致性几种策略分析

    作者:京东零售 于泷 一、背景 在高并发场景中,为防止大量请求直接访问数据库,缓解数据库压力,常用的方式一般会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会涉及到缓存与数据库中数据如何保持一致性问题,本文将对几种缓存与数据库保证数据一致性的使用方式进行分析。为保证高并发性能,以下分析场景不考虑执行的原子性及加锁等强一致性要求的场景,仅追求最终一致性。…

    MySQL 2023年4月19日
    00
  • 阿里巴巴 MySQL 数据库之建表规约(一)

    建表规约 强制部分 【强制】 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否)。说明:任何字段如果为非负数,必须是 unsigned。正例:表达逻辑的字段名 is_deleted,1 表示删除,0 表示未删除。 【强制】 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁…

    MySQL 2023年4月13日
    00
  • Mysql5.5 InnoDB存储引擎配置和优化

    下面是“Mysql5.5 InnoDB存储引擎配置和优化”的完整攻略: Mysql5.5 InnoDB存储引擎配置和优化 什么是InnoDB存储引擎 InnoDB是Mysql数据库的一种存储引擎,它是一个完整的事务安全的存储引擎,支持外键约束和提交、回滚事务等功能。相对于MyISAM存储引擎,InnoDB更加稳定,支持更多的操作。 InnoDB存储引擎默认配…

    MySQL 2023年5月19日
    00
  • CentOS 6.5安装mysql5.7教程

    CentOS 6.5安装mysql5.7教程 前置条件 在安装mysql前,我们需要保证我们的系统已经安装了一些依赖项: yum -y install gcc gcc-c++ autoconf automake zlib* fiex* patch make libtool-ltdl-devel gd-devel freetype-devel libxml2-…

    MySQL 2023年5月18日
    00
  • mysql 8.0.12 解压版安装教程

    下面是“mysql 8.0.12 解压版安装教程”的完整攻略: 下载安装包 首先需要到MySQL官网下载压缩版的安装包,地址为:https://dev.mysql.com/downloads/mysql/8.0.html,选择“MySQL Community Server”,版本选择“8.0.12”,点击“Download”进行下载。 安装步骤 解压文件 下…

    MySQL 2023年5月18日
    00
  • 数据库系列:覆盖索引和规避回表

    1 介绍 在MySQL数据库查询过程中,索引覆盖和避免不必要的回表,是减少检索步骤,提高执行效率的有效手段。下面从这两个角度分析如何进行MySQL检索提效。 2 数据准备 模拟一个500w数据容量的部门表 emp,表结构如下,并通过工具模拟500w的数据: CREATE TABLE `emp` ( `id` int unsigned NOT NULL AUT…

    2023年4月8日
    00
  • MySQL针对Discuz论坛程序的基本优化教程

    MySQL针对Discuz论坛程序的基本优化教程 简介 本文将介绍如何通过对MySQL数据库进行调优来优化Discuz论坛程序性能的方法。 基本优化 调整MySQL缓存配置 在MySQL中,缓存是提高性能的一个关键。通过调整MySQL缓存配置参数,可以提高Discuz论坛程序的响应速度。 示例1: 可以通过调整以下参数来优化MySQL缓存: innodb_b…

    MySQL 2023年5月19日
    00
  • docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES

    一、前言 在数据量大的企业级实践中,Elasticsearch显得非常常见,特别是数据表超过千万级后,无论怎么优化,还是有点力不从心!使用中,最首先的问题就是怎么把千万级数据同步到Elasticsearch中,在一些开源框架中知道了,有专门进行同步的!那就是Logstash 。在思考,同步完怎么查看呢,这时Kibana映入眼帘,可视化的界面,让使用更加的得心…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部