一文教你学会定位线上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日

相关文章

  • php中关于mysqli和mysql区别的一些知识点分析

    mysqli与mysql的区别 MySQLi是MySQL的一种改进版本,和MySQL相比,MySQLi提供了更好的性能、更好的功能,还支持面向对象和过程式API。 MySQLi相对于MySQL来说有以下的不同: MySQLi支持面向对象和过程式的接口,而MySQL仅支持过程式的接口。 MySQLi包含了MySQL的所有功能,还新增加了一些特有的功能和优化。 …

    MySQL 2023年5月19日
    00
  • oracle和mysql几点差异对比

    Oracle与mysql差异性总结 之前有个项目是用oracle数据库进行开发,需要把数据库改成mysql,遇到了一些地方需要注意的,就简单记了下来。 备注: 再把oracle转成mysql的时候,表中字段的类型转换是比较头疼的,比如oracle中的number转成mysql的时候,你要从“FLOAT、DOUBLE、TINYINT、 SMALLINT、MED…

    MySQL 2023年4月13日
    00
  • 一天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。 比如字段 userInfo: 广东省 10086′ …

    MySQL 2023年4月14日
    00
  • mysql5.7.21启动异常的修复方法

    以下是详细讲解“mysql5.7.21启动异常的修复方法”的完整攻略: 问题背景 在使用mysql5.7.21版本时,有时会出现启动异常的情况,通常表现为启动过程中抛出异常并退出,如下所示: [ERROR] [MY-012569] [InnoDB] Unable to create temporary file; errno: 2 [ERROR] [MY-0…

    MySQL 2023年5月18日
    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 1303错误的解决方法(navicat)

    下面是详细的MySQL 1303错误的解决方法(navicat)攻略: 1. 什么是MySQL 1303错误? MySQL 1303错误指的是当用户账户拥有的权限不足以访问或修改某个数据库中的表或数据时,导致的错误。该错误通常会在使用navicat等MySQL管理工具进行数据库操作时出现。 2. 解决MySQL 1303错误的方法 下面是解决MySQL 13…

    MySQL 2023年5月18日
    00
  • MySQL权限控制实现原理

    MySQL权限控制是指对MySQL服务器上的用户和资源进行访问限制的控制机制。它由MySQL特定的权限表决定并且允许管理员为每个MySQL值创建一个或多个帐户,并且要求他们在访问MySQL数据时提供身份验证信息。本篇文章将详细介绍MySQL权限控制的实现原理。 MySQL权限表 MySQL存储权限表系统的信息,其中包括用户和他们的权限。这些信息存储在MySQ…

    MySQL 2023年3月10日
    00
  • MySQL8.0 创建用户及授权 – 看这篇就足够了

    MySQL8.0 创建用户及授权 – 看这篇就足够了 什么时候会用到 对接外系统时,需要给其余系统开放访问权限 本系统中,分权限管理数据,防止root权限删库跑路? mysql版本 MySql8.0+ 具体步骤 1.命令行进入MySql 使用 mysql -u#UserName -p#PassWord 命令进入MySql #UserName 代表你的MySq…

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