我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何找到上锁的SQL语句

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何找到上锁的SQL语句

本篇内容主要讲解“如何找到上锁的SQL语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何找到上锁的SQL语句”吧!

 问题

有的时候 SQL 语句被锁住了,可是通过 show processlist 找不到加锁的的 SQL 语句,这个时候应该怎么排查呢

前提

performance_schema = on;

实验

1、建一个表,插入三条数据

mysql> use test1; Database changed mysql> create table action1(id int); Query OK, 0 rows affected (0.11 sec)   mysql> insert into action1 values(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3  Duplicates: 0  Warnings: 0   mysql> select * from action1; +------+ | id   | +------+ |    1 | |    2 | |    3 | +------+3 rows in set (0.00 sec)

2、开启一个事务,删除掉一行记录,但不提交

mysql> begin; Query OK, 0 rows affected (0.00 sec)   mysql> delete from action1 where id = 3; Query OK, 1 row affected (0.00 sec)

3、另开启一个事务,更新这条语句,会被锁住

mysql> update action1 set id = 7 where id = 3;

4、通过 show processlist 只能看到一条正在执行的 SQL 语句

mysql> show processlist; | 22188 | root        | localhost          | test1 | Sleep   |  483 |          | NULL                                   | | 22218 | root        | localhost          | NULL  | Query   |    0 | starting | show processlist                       | | 22226 | root        | localhost          | test1 | Query   |    3 | updating | update action1 set id = 7 where id = 3 | +-------+-------------+--------------------+-------+---------+------+----------+----------------------------------------+

5、接下来就是我们知道的,通过 information_schema 库里的 INNODBTRX、INNODBLOCKS  、INNODBLOCK_WAITS 获得的一个锁信息

mysql> select * from INNODB_LOCK_WAITS; +-------------------+-------------------+-----------------+------------------+ | requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id | +-------------------+-------------------+-----------------+------------------+ | 5978292           | 5978292:542:3:2   | 5976374         | 5976374:542:3:2  | +-------------------+-------------------+-----------------+------------------+1 row in set, 1 warning (0.00 sec)   mysql> select * from INNODB_LOCKs; +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+ | lock_id         | lock_trx_id | lock_mode | lock_type | lock_table        | lock_index      | lock_space | lock_page | lock_rec | lock_data      | +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+ | 5978292:542:3:2 | 5978292     | X         | RECORD    | `test1`.`action1` | GEN_CLUST_INDEX |        542 |         3 |        2 | 0x00000029D504 | | 5976374:542:3:2 | 5976374     | X         | RECORD    | `test1`.`action1` | GEN_CLUST_INDEX |        542 |         3 |        2 | 0x00000029D504 | +-----------------+-------------+-----------+-----------+-------------------+-----------------+------------+-----------+----------+----------------+2 rows in set, 1 warning (0.00 sec)    mysql> select trx_id,trx_started,trx_requested_lock_id,trx_query,trx_mysql_thread_id from INNODB_TRX; +---------+---------------------+-----------------------+----------------------------------------+---------------------+ | trx_id  | trx_started         | trx_requested_lock_id | trx_query                              | trx_mysql_thread_id | +---------+---------------------+-----------------------+----------------------------------------+---------------------+ | 5978292 | 2020-07-26 22:55:33 | 5978292:542:3:2       | update action1 set id = 7 where id = 3 |               22226 | | 5976374 | 2020-07-26 22:47:33 | NULL                  | NULL                                   |               22188 | +---------+---------------------+-----------------------+----------------------------------------+---------------------+

6、从上面可以看出来是 thread_id 为 22188 的执行的 SQL 语句锁住了后面的更新操作,但是我们从上文中 show processlist  中并未看到这条事务,测试环境我们可以直接 kill 掉对应的线程号,但如果是生产环境中,我们需要找到对应的 SQL  语句,根据相应的语句再考虑接下来应该怎么处理

7、需要结合 performance_schema.threads 找到对应的事务号

mysql> select * from performance_schema.threads where processlist_ID = 22188\G *************************** 1. row ***************************           THREAD_ID: 22225  //perfoamance_schema中的事务计数器               NAME: thread/sql/one_connection                TYPE: FOREGROUND      PROCESSLIST_ID: 22188  //从show processlist中看到的id   PROCESSLIST_USER: root    PROCESSLIST_HOST: localhost      PROCESSLIST_DB: test1 PROCESSLIST_COMMAND: Sleep    PROCESSLIST_TIME: 1527  PROCESSLIST_STATE: NULL    PROCESSLIST_INFO: NULL    PARENT_THREAD_ID: NULL                ROLE: NULL        INSTRUMENTED: YES             HISTORY: YES     CONNECTION_TYPE: Socket        THREAD_OS_ID:8632 1 row in set (0.00 sec)

8、找到事务号,可以从 events_statements_current 找到对应的 SQL 语句:SQL_TEXT

mysql> select * from events_statements_current where THREAD_ID = 22225\G *************************** 1. row ***************************               THREAD_ID: 22225               EVENT_ID: 14           END_EVENT_ID: 14             EVENT_NAME: statement/sql/delete                  SOURCE:             TIMER_START: 546246699055725000              TIMER_END: 546246699593817000             TIMER_WAIT: 538092000              LOCK_TIME: 238000000               SQL_TEXT: delete from action1 where id = 3  //具体的sql语句                 DIGEST: 8f9cdb489c76ec0e324f947cc3faaa7c             DIGEST_TEXT: DELETE FROM `action1` WHERE `id` = ?          CURRENT_SCHEMA: test1             OBJECT_TYPE: NULL           OBJECT_SCHEMA: NULL             OBJECT_NAME: NULL   OBJECT_INSTANCE_BEGIN: NULL             MYSQL_ERRNO: 0      RETURNED_SQLSTATE: 00000           MESSAGE_TEXT: NULL                  ERRORS: 0               WARNINGS: 0          ROWS_AFFECTED: 1              ROWS_SENT: 0          ROWS_EXAMINED: 3CREATED_TMP_DISK_TABLES: 0     CREATED_TMP_TABLES: 0       SELECT_FULL_JOIN: 0 SELECT_FULL_RANGE_JOIN: 0           SELECT_RANGE: 0     SELECT_RANGE_CHECK: 0            SELECT_SCAN: 0      SORT_MERGE_PASSES: 0             SORT_RANGE: 0              SORT_ROWS: 0              SORT_SCAN: 0          NO_INDEX_USED: 0     NO_GOOD_INDEX_USED: 0       NESTING_EVENT_ID: NULL      NESTING_EVENT_TYPE: NULL     NESTING_EVENT_LEVEL: 01 row in set (0.00 sec)

9、可以看到是一条 delete 阻塞了后续的 update,生产环境中可以拿着这条 SQL 语句询问开发,是不是有 kill 的必要。

到此,相信大家对“如何找到上锁的SQL语句”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何找到上锁的SQL语句

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何把sql语句结果输出到excel

最近有一个需求,就是将数据库中某些数据整理出来制作成Excel表格,看了下数据库中的相关数据有将近六百条,如果手工一个个导出,基本上人也废了。。。 那有没有办法可以将查出来的数据直接导入到Excel中呢?我们可以使用如下SQL语句 select id,nick
2014-12-24

mysql的sql语句如何优化

要优化MySQL的SQL语句,可以采取以下几个方法:1. 使用索引:使用适当的索引可以大大提高查询性能。可以使用`EXPLAIN`命令来分析SQL语句的执行计划,以确定是否需要添加索引。2. 优化查询语句:避免使用`SELECT *`查询所
2023-09-27

如何实现MySQL中锁定表的语句?

MySQL是一个开源的关系型数据库管理系统,常用于Web应用中。在MySQL数据库中,锁定表可以帮助开发人员有效地控制并发访问。本文将介绍如何在MySQL数据库中实现锁定表的语句,并提供相应的代码示例。锁定表的语句MySQL中锁定表的语句是
如何实现MySQL中锁定表的语句?
2023-11-08

如何实现MySQL中解锁表的语句?

如何实现MySQL中解锁表的语句?在MySQL中,表锁是一种常用的锁定机制,用于保护数据的完整性和一致性。当一个事务正在对某个表进行读写操作时,其他事务就无法对该表进行修改。这种锁定机制在一定程度上保证了数据的一致性,但也可能导致其他事务的
如何实现MySQL中解锁表的语句?
2023-11-08

Laravel中如何输出完整的SQL语句

这篇文章主要介绍Laravel中如何输出完整的SQL语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!laravel 中自带的查询构建方法 toSql 得到的 sql 语句并未绑定条件参数,类似于这样 select
2023-06-14

如何优化SQL语句的心得浅谈

我们要做到不但会写SQL,还要做到写出性能优良的SQL语句
2022-11-15

如何执行基本的SQL查询语句

要执行基本的SQL查询语句,首先需要连接到数据库管理系统(如MySQL、SQL Server、Oracle等),然后打开一个SQL查询编辑器或命令行终端。接下来,可以输入SQL查询语句并执行它,以下是一个简单的例子:假设有一个名为“学生”
如何执行基本的SQL查询语句
2024-03-06

编程热搜

目录