返回顶部
首页 > 资讯 > 数据库 >mysql锁等待查询分析
  • 457
分享到

mysql锁等待查询分析

2024-04-02 19:04:59 457人浏览 泡泡鱼
摘要

Mysql锁等待分析 1、简单说明 使用innodb存储引擎后,mysql有三张表来分析锁及阻塞的问题,在infORMation_schema下面有三张表:INNODB_TRX、INNODB_LO

Mysql等待分析

1、简单说明
使用innodb存储引擎后,mysql有三张表来分析锁及阻塞的问题,在infORMation_schema下面有三张表:INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WaiTS,通过这三张表,可以更简单地监控当前的事务并分析可能存在的问题。
mysql> show tables like '%INNODB%';
+-----------------------------------------+
| Tables_in_information_schema (%INNODB%) |
+-----------------------------------------+
| INNODB_LOCKS                            |
| INNODB_TRX                              |
| INNODB_LOCK_WAITS                       |
INNODB_TRX表及结构
比较常用的列:
trx_id:InnoDB存储引擎内部唯一的事物ID
trx_status:当前事务的状态
trx_requested_lock_id:等待事务的锁ID
trx_wait_started:事务等待的开始时间
trx_weight:事务的权重,反应一个事务修改和锁定的行数,当发现死锁需要回滚时,权重越小的值被回滚
trx_mysql_thread_id:MySQL中的进程ID,与show processlist中的ID值相对应
trx_query:事务运行的SQL语句

其余两个表字段相对较少 
INNODB_LOCKS
INNODB_LOCK_WAITS

2、锁定测试
mysql> use test;
Database changed
mysql> create table mytest1 (id int(4),pername char(10),bithday date,telphone char(11));
Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| mytest1        |
+----------------+
1 row in set, 1 warning (0.00 sec)
--以mytest1表进行测试,里面的记录如下:
mysql> select * from mytest1;
+------+---------+------------+----------+
| id   | pername | bithday    | telphone |
+------+---------+------------+----------+
|    1 | Jone    | 1994-01-02 | 11111111 |
|    2 | Tom     | 1994-04-23 | 11214115 |
|    3 | Rose    | 1993-05-02 | 21214719 |
|    4 | Jack    | 1992-07-18 | 41218613 |
|    5 | Block   | 1991-09-21 | 75294651 |
|    6 | Block   | 1990-10-21 | 65364671 |
+------+---------+------------+----------+
6 rows in set (0.00 sec)

--将自动提交改为手动提交
mysql> show variables like '%commit%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| autocommit                     | ON    |
| binlog_order_commits           | ON    |
| innodb_api_bk_commit_interval  | 5     |
| innodb_commit_concurrency      | 0     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
5 rows in set (0.00 sec)

mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%commit%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| autocommit                     | OFF   |
| binlog_order_commits           | ON    |
| innodb_api_bk_commit_interval  | 5     |
| innodb_commit_concurrency      | 0     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
5 rows in set (0.00 sec)

--将表进行加锁
mysql> select * from mytest1 for update;
+------+---------+------------+----------+
| id   | pername | bithday    | telphone |
+------+---------+------------+----------+
|    1 | Jone    | 1994-01-02 | 11111111 |
|    2 | Tom     | 1994-04-23 | 11214115 |
|    3 | Rose    | 1993-05-02 | 21214719 |
|    4 | Jack    | 1992-07-18 | 41218613 |
|    5 | Block   | 1991-09-21 | 75294651 |
|    6 | Block   | 1990-10-21 | 65364671 |
+------+---------+------------+----------+
6 rows in set (0.00 sec)

--重新开一个窗口执行另一个语句
mysql> select count(*) from test.mytest1 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

3、查看锁定情况

mysql> select r.trx_id waiting_trx_id,r.trx_mysql_thread_Id waiting_thread,r.trx_query waiting_query,b.trx_id blocking_trx_id,
b.trx_mysql_thread_id blocking_thread,b.trx_query blocking_query
from information_schema.innodb_lock_waits w inner join information_schema.innodb_trx b
on b.trx_id = w.blocking_trx_id  inner join information_schema.innodb_trx r on r.trx_id = w.requesting_trx_id;
+----------------+----------------+----------------------------------------------+-----------------+-----------------+----------------+
| waiting_trx_id | waiting_thread | waiting_query                                | blocking_trx_id | blocking_thread | blocking_query |
+----------------+----------------+----------------------------------------------+-----------------+-----------------+----------------+
| 5458           |              4 | select count(*) from test.mytest1 for update | 5450            |               3 | NULL           |
+----------------+----------------+----------------------------------------------+-----------------+-----------------+----------------+
1 row in set (0.01 sec)
这里可以很清楚的看到阻塞的thread 3,被阻塞的thread 4

mysql> show full processlist;
+----+-------------+-----------+--------------------+---------+-------+---------------------------------+----------------------------------------------+
| Id | User        | Host      | db                 | Command | Time  | State                           | Info                                         |
+----+-------------+-----------+--------------------+---------+-------+---------------------------------+----------------------------------------------+
|  1 | system user |           | NULL               | Daemon  | 18882 | Waiting for ndbcluster to start | NULL                                         |
|  3 | root        | localhost | test               | Sleep   |  1025 |                                 | NULL                                         |
|  4 | root        | localhost | information_schema | Query   |    45 | Sending data                    | select count(*) from test.mytest1 for update |
|  5 | root        | localhost | information_schema | Query   |     0 | init                            | show full processlist                        |
|  6 | root        | localhost | test               | Sleep   |   212 |                                 | NULL                                         |
+----+-------------+-----------+--------------------+---------+-------+---------------------------------+----------------------------------------------+
5 rows in set (0.00 sec)

由于我这里是两个会话窗口,所以很容易判断出id 3(thread 3),为阻塞会话!
知道会话后,可以采用kill进行查杀
mysql> kill 3;                          --3指的是thread id(processlist中的id)
Query OK, 0 rows affected (0.00 sec)

查杀以后,第二个会话迅速将结果显示出来

4、总结
--以前使用processlist时,显示太多,根本找不锁的根本原因,会话少时,可以凭直觉查看
--直接使用show engine innodb status查看,可以查看到一些东西,但是不全面,显示太多
mysql> show engine innodb status;

Per second averages calculated from the last 6 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 22 srv_active, 0 srv_shutdown, 18645 srv_idle
srv_master_thread log flush and writes: 18667
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 25
OS WAIT ARRAY INFO: signal count 25
Mutex spin waits 228, rounds 723, OS waits 3
RW-shared spins 22, rounds 660, OS waits 22
RW-excl spins 0, rounds 0, OS waits 0
Spin rounds per wait: 3.17 mutex, 30.00 RW-shared, 0.00 RW-excl
------------
TRANSACTIONS
------------
Trx id counter 5458
Purge done for trx's n:o < 5441 undo n:o < 0 state: running but idle
History list length 26
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 6, OS thread handle 0x7fb3169c1700, query id 403 localhost root init
show engine innodb status
---TRANSACTION 0, not started
MySQL thread id 5, OS thread handle 0x7fb316a02700, query id 393 localhost root cleaning up
---TRANSACTION 5457, ACTIVE 3 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s)                          指出一个行锁
MySQL thread id 4, OS thread handle 0x7fb316a43700, query id 402 localhost root Sending data
select count(*) from test.mytest1 for update
------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED:                   等待时间
RECORD LOCKS space id 12 page no 3 n bits 80 index `GEN_CLUST_INDEX` of table `test`.`mytest1` trx id 5457 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
 0: len 6; hex 000000000300; asc       ;;
 1: len 6; hex 00000000152f; asc      /;;
 2: len 7; hex a30000015b0110; asc     [  ;;
 3: len 4; hex 80000001; asc     ;;
 4: len 10; hex 4a6f6e65202020202020; asc Jone      ;;
 5: len 3; hex 8f9422; asc   ";;
 6: len 11; hex 3131313131313131202020; asc 11111111   ;;
这一段说的是等待内容,包括表的内容,指出了表的内容mytest1
------------------
TABLE LOCK table `test`.`mytest1` trx id 5457 lock mode IX
RECORD LOCKS space id 12 page no 3 n bits 80 index `GEN_CLUST_INDEX` of table `test`.`mytest1` trx id 5457 lock_mode X waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 7; compact format; info bits 0
 0: len 6; hex 000000000300; asc       ;;
 1: len 6; hex 00000000152f; asc      /;;
 2: len 7; hex a30000015b0110; asc     [  ;;
 3: len 4; hex 80000001; asc     ;;
 4: len 10; hex 4a6f6e65202020202020; asc Jone      ;;
 5: len 3; hex 8f9422; asc   ";;
 6: len 11; hex 3131313131313131202020; asc 11111111   ;;

---TRANSACTION 5450, ACTIVE 813 sec
2 lock struct(s), heap size 360, 7 row lock(s)
MySQL thread id 3, OS thread handle 0x7fb316a84700, query id 388 localhost root cleaning up
TABLE LOCK table `test`.`mytest1` trx id 5450 lock mode IX
RECORD LOCKS space id 12 page no 3 n bits 80 index `GEN_CLUST_INDEX` of table `test`.`mytest1` trx id 5450 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;
而这一段正好说明了,5450正在锁定表mytest1,所以可以确定是5450(thread 3)正执有资源
如此去查看,非常耗费时间!
--使用mysqladmin debug查看,能看到所有产生锁的线程,但无法判断哪个才是根因。

所以,感觉在新的版本中,使用语句查询确实是一个好办法,能够迅速的找到阻塞的原因!

您可能感兴趣的文档:

--结束END--

本文标题: mysql锁等待查询分析

本文链接: https://lsjlt.com/news/48766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql锁等待查询分析
    mysql锁等待分析 1、简单说明 使用innodb存储引擎后,mysql有三张表来分析锁及阻塞的问题,在information_schema下面有三张表:INNODB_TRX、INNODB_LO...
    99+
    2024-04-02
  • mysql InnoDB锁等待的查看以及分析
    本篇内容主要讲解“mysql InnoDB锁等待的查看以及分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql InnoDB锁等待的查看以及分析”吧!在...
    99+
    2024-04-02
  • MySQL锁等待与死锁问题分析
    前言:  在 MySQL 运维过程中,锁等待和死锁问题是令各位 DBA 及开发同学非常头痛的事。出现此类问题会造成业务回滚、卡顿等故障,特别是业务繁忙的系统,出现死锁问题后影响会更严重。本篇文章我们一起来学...
    99+
    2022-05-22
    MySQL 锁等待 MySQL 死锁
  • MySQL 5.5 -- innodb_lock_wait 锁 等待
    记得以前,当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,要解决是一件麻烦的事情 ;特别是当一个...
    99+
    2024-04-02
  • postgresql lock 锁等待查看
    postgresql lock 锁等待查看 当SQL请求锁等待超过deadlock_timeout指定的时间时,报类似如下日志: LOG: process xxx1 acquired RowExclusiveLock on relation...
    99+
    2014-11-24
    postgresql lock 锁等待查看
  • 如何查看MySQL锁等待的原因
    这篇文章给大家分享的是有关如何查看MySQL锁等待的原因的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。--sys库的介绍    mysql...
    99+
    2024-04-02
  • 如何分辨MySQL中的死锁和锁等待
    这篇文章给大家介绍如何分辨MySQL中的死锁和锁等待,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。【数据库版本】MySQL5.7程序报错1205 Lock wat timeout ex...
    99+
    2024-04-02
  • Mysql查询正在执行的事务以及等待锁的操作方式
    使用navicat测试学习: 首先使用set autocommit = 0;(取消自动提交,则当执行语句commit或者rollback执行提交事务或者回滚) 在打开一个执行update 查...
    99+
    2024-04-02
  • innodb查询锁的示例分析
    这篇文章主要为大家展示了“innodb查询锁的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“innodb查询锁的示例分析”这篇文章吧。 ...
    99+
    2024-04-02
  • JavaScript等待文件实例分析
    这篇文章主要介绍了JavaScript等待文件实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript等待文件实例分析文章都会有所收获,下面我们一起来看看吧。...
    99+
    2024-04-02
  • 【MySQL】说透锁机制(一)行锁 加锁规则 之 等值查询
    文章目录 前言一、共享锁(S)和排它锁(X)二、行锁的3种算法Record LockGap LockNext-key Lock 三、加锁规则 之 等值查询分析数据准备3.1 聚集索引有匹配索引无匹配索引 3.2 唯一索引有...
    99+
    2023-08-18
    mysql 行锁 加锁规则 mysql锁 mysql行锁
  • 故障分析 | 有效解决 MySQL 行锁等待超时问题【建议收藏】
    作者:xuty 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 一、背景 #### 20191219 10:10:10,234 | com.alibaba.druid.filter....
    99+
    2021-08-18
    故障分析 | 有效解决 MySQL 行锁等待超时问题【建议收藏】
  • 在 Go SDK 中等待 AWS Athena 查询执行
    php小编百草在Go SDK中等待AWS Athena查询执行指南中,旨在帮助开发者优化查询性能和提高应用程序的响应速度。AWS Athena是一种无服务器查询服务,可以直接在S3存储...
    99+
    2024-02-09
  • MySQL 中行锁等待超时如何解决
    这篇文章给大家介绍MySQL 中行锁等待超时如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一、背景#### 20191219 10:10:10,...
    99+
    2024-04-02
  • Mysql事物锁等待超时Lockwaittimeoutexceeded;的解决
    目录问题场景原因分析解决方案参考信息工作中同事遇到此异常,查找解决问题时,收集整理形成此篇文章。 问题场景 问题出现环境:1、在同一事务内先后对同一条数据进行插入和更新操作;2、多台...
    99+
    2024-04-02
  • 如何解决MySQL报错:锁等待超时
    当MySQL报错锁等待超时时,可以尝试以下解决方法:1. 优化查询语句和数据库结构:锁等待超时通常是由于查询语句执行时间过长或者数据...
    99+
    2023-10-12
    MySQL
  • 分析ARCH wait on SENDREQ等待事件
    本篇内容介绍了“分析ARCH wait on SENDREQ等待事件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
  • js中等待Promises的示例分析
    这篇文章给大家分享的是有关js中等待Promises的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。等待 Promises在某些情况下,我们需要等待多个Promise结束,这里,我们使用Promise.a...
    99+
    2023-06-27
  • jQuery中EasyUI页面加载等待及页面等待层的示例分析
    这篇文章主要为大家展示了“jQuery中EasyUI页面加载等待及页面等待层的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery中EasyUI页...
    99+
    2024-04-02
  • oracle等待事件类型wait_class的分析
    oracle等待事件类型wait_class的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 Oracle 的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作