返回顶部
首页 > 资讯 > 数据库 >通过查询日志定位持有锁的SQL语句
  • 679
分享到

通过查询日志定位持有锁的SQL语句

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

Mysql 版本: mysql> select version(); +------------+ | version()  | +------------+ | 5.6.27-l

Mysql 版本:
mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.27-log |
+------------+
1 row in set (0.00 sec)



1. 启用查询日志
mysql> SET GLOBAL general_log=1;
Query OK, 0 rows affected (0.02 sec)


mysql> show variables like 'general_log%';
+------------------+--------------------------------------------------+
| Variable_name    | Value                                            |
+------------------+--------------------------------------------------+
| general_log      | ON                                               |
| general_log_file | /app/oracle/oradata2/mysql-5.5.37/data/oradb.log |
+------------------+--------------------------------------------------+
2 rows in set (0.00 sec)


2. 查看MYSQL 线程信息
--MYSQL 线程1
mysql> show full processlist;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
|  1 | root | localhost | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+
1 row in set (0.00 sec)


--MYSQL 线程2
mysql> show full processlist;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
|  1 | root | localhost | NULL | Sleep   |  145 |       | NULL                  |
|  2 | root | localhost | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+
2 rows in set (0.00 sec)


--MYSQL 线程3

mysql> show full processlist;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
|  1 | root | localhost | NULL | Sleep   |  189 |       | NULL                  |
|  2 | root | localhost | NULL | Sleep   |   44 |       | NULL                  |
|  3 | root | localhost | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+
3 rows in set (0.00 sec)


--MSYQL 线程4
mysql> show full processlist;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
|  1 | root | localhost | NULL | Sleep   |  238 |       | NULL                  |
|  2 | root | localhost | NULL | Sleep   |   93 |       | NULL                  |
|  3 | root | localhost | NULL | Sleep   |   49 |       | NULL                  |
|  4 | root | localhost | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+
4 rows in set (0.00 sec)


--MYSQL 查询日志
[root@oradb data]# tail -f oradb.log
/app/oracle/oradata2/mysql-5.6.27/bin/mysqld, Version: 5.6.27-log (MySQL CommUnity Server (GPL)). started with:
tcp port: 3306  Unix Socket: /tmp/mysql.sock
Time                 Id Command    Argument
161116 10:48:57     1 Query     show variables like 'general_log%'
161116 10:50:07     1 Query     show full processlist
161116 10:52:24     2 Connect   root@localhost on
                    2 Query     select @@version_comment limit 1
161116 10:52:32     2 Query     show full processlist
161116 10:53:09     3 Connect   root@localhost on
                    3 Query     select @@version_comment limit 1
161116 10:53:16     3 Query     show full processlist
161116 10:53:57     4 Connect   root@localhost on
                    4 Query     select @@version_comment limit 1
161116 10:54:05     4 Query     show full processlist


ID:表示MYSQL 线程ID


3. 使用查询日志找出持有造成阻塞的SQL
--MYSQL 线程1 执行更新,并且不提交事务持续持有锁
use test;
START TRANSACTION;
UPDATE t1 SET NAME='test11' WHERE id<11;

--MYSQL 线程2,被阻塞
use test;
START TRANSACTION;
UPDATE t1 SET NAME='test11' WHERE id<10;

--MYSQL 线程3,被阻塞
use test;
START TRANSACTION;
UPDATE t1 SET NAME='test11' WHERE id<9;



--查看锁阻塞信息
SELECT CONCAT('thread ',b.trx_mysql_thread_id,' from ',p.host) AS who_blocks,
       IF(p.command="Sleep",p.time,0) AS idle_in_trx,
       MAX(TIMESTAMPDIFF(SECOND,r.trx_wait_started,NOW())) AS max_wait_time,
       COUNT(*) AS num_waiters
FROM infORMation_schema.`INNODB_LOCK_WAITS` AS w
INNER JOIN information_schema.`INNODB_TRX` AS b ON b.trx_id=w.`blocking_trx_id`
INNER JOIN information_schema.`INNODB_TRX` AS r ON r.`trx_id`= w.`requesting_trx_id`
LEFT JOIN   information_schema.`PROCESSLIST` AS p ON p.id= b.`trx_mysql_thread_id`
GROUP BY who_blocks ORDER BY num_waiters DESC\G

*************************** 1. row ***************************
   who_blocks: thread 1 from localhost
  idle_in_trx: 7
max_wait_time: 4
  num_waiters: 2
*************************** 2. row ***************************
   who_blocks: thread 2 from localhost
  idle_in_trx: 0
max_wait_time: 2
  num_waiters: 1
2 rows in set (0.11 sec)

我们看到 MSYQL 线程1 阻塞了 2 个 线程。


SELECT r.trx_id AS waiting_trx_id,r.`trx_mysql_thread_id` AS waiting_thread,
       TIMESTAMPDIFF(SECOND,r.trx_wait_started,CURRENT_TIMESTAMP) AS wait_time,
       r.`trx_query` AS waiting_query,l.`lock_table` AS waiting_table_lock,
       b.trx_id AS blocking_trx_id,b.`trx_mysql_thread_id` AS blocking_thread,
       SUBSTRING(p.host,1,INSTR(p.host,':')-1) AS blocking_host,
       SUBSTRING(p.host,INSTR(p.host,':')+1) AS blocking_port,
       IF(p.command="Sleep",p.time,0) AS idle_in_trx,
       b.`trx_query` AS blocking_query
FROM information_schema.`INNODB_LOCK_WAITS` AS w
INNER JOIN information_schema.`INNODB_TRX` AS b  ON b.trx_id=w.blocking_trx_id
INNER JOIN information_schema.`INNODB_TRX` AS r ON  r.trx_id = w.requesting_trx_id
INNER JOIN information_schema.`INNODB_LOCKS` AS l ON w.requested_lock_id=l.lock_id
LEFT JOIN information_schema.`PROCESSLIST` AS p ON p.id=b.trx_mysql_thread_id
ORDER BY wait_time DESC


*************************** 1. row ***************************
    waiting_trx_id: 17159
    waiting_thread: 2
         wait_time: 3
     waiting_query: UPDATE t1 SET NAME='test11' WHERE id<10
waiting_table_lock: `test`.`t1`
   blocking_trx_id: 17158
   blocking_thread: 1
     blocking_host:
     blocking_port: localhost
       idle_in_trx: 456
    blocking_query: NULL
*************************** 2. row ***************************
    waiting_trx_id: 17160
    waiting_thread: 3
         wait_time: 2
     waiting_query: UPDATE t1 SET NAME='test11' WHERE id<9
waiting_table_lock: `test`.`t1`
   blocking_trx_id: 17158
   blocking_thread: 1
     blocking_host:
     blocking_port: localhost
       idle_in_trx: 456
    blocking_query: NULL
*************************** 3. row ***************************
    waiting_trx_id: 17160
    waiting_thread: 3
         wait_time: 2
     waiting_query: UPDATE t1 SET NAME='test11' WHERE id<9
waiting_table_lock: `test`.`t1`
   blocking_trx_id: 17159
   blocking_thread: 2
     blocking_host:
     blocking_port: localhost
       idle_in_trx: 0
    blocking_query: UPDATE t1 SET NAME='test11' WHERE id<10
3 rows in set (0.01 sec)

等待 T1 表上的锁

--查询日志
161116 11:00:30     1 Query     SELECT DATABASE()
                    1 Init DB   test
                    1 Query     show databases
                    1 Query     show tables
                    1 Field List        t1
                    1 Query     START TRANSACTION
161116 11:00:45     2 Query     SELECT DATABASE()
                    2 Init DB   test
                    2 Query     show databases
                    2 Query     show tables
                    2 Field List        t1
                    2 Query     START TRANSACTION
161116 11:00:51     3 Query     SELECT DATABASE()
                    3 Init DB   test
                    3 Query     show databases
                    3 Query     show tables
                    3 Field List        t1
                    3 Query     START TRANSACTION
161116 11:00:54     4 Query     SELECT DATABASE()
                    4 Init DB   test
                    4 Query     show databases
                    4 Query     show tables
                    4 Field List        t1
                    4 Query     START TRANSACTION
161116 11:01:53     1 Query     UPDATE t1 SET NAME='test11' WHERE id<11
161116 11:01:56     2 Query     UPDATE t1 SET NAME='test11' WHERE id<10
161116 11:01:58     3 Query     UPDATE t1 SET NAME='test11' WHERE id<9
161116 11:02:00     4 Query     SELECT CONCAT('thread ',b.trx_mysql_thread_id,' from ',p.host) AS who_blocks,
       IF(p.command="Sleep",p.time,0) AS idle_in_trx,
       MAX(TIMESTAMPDIFF(SECOND,r.trx_wait_started,NOW())) AS max_wait_time,
       COUNT(*) AS num_waiters
FROM information_schema.`INNODB_LOCK_WAITS` AS w
INNER JOIN information_schema.`INNODB_TRX` AS b ON b.trx_id=w.`blocking_trx_id`
INNER JOIN information_schema.`INNODB_TRX` AS r ON r.`trx_id`= w.`requesting_trx_id`
LEFT JOIN   information_schema.`PROCESSLIST` AS p ON p.id= b.`trx_mysql_thread_id`
GROUP BY who_blocks ORDER BY num_waiters DESC


通过查询日志结合上面查到的锁阻塞信息可以判断是 MSYQL 线程1 执行的UPDATE t1 SET NAME='test11' WHERE id<11
语句持有锁没提交事务,阻塞了线程2、3。
从查询日志的时间上可以看出来,线程1的SQL比线程2和3的SQL先执行。
您可能感兴趣的文档:

--结束END--

本文标题: 通过查询日志定位持有锁的SQL语句

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

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

猜你喜欢
  • 通过查询日志定位持有锁的SQL语句
    MYSQL 版本: mysql> select version(); +------------+ | version()  | +------------+ | 5.6.27-l...
    99+
    2024-04-02
  • 通过SQL语句查询需要的数据
    这篇文章主要讲解了“通过SQL语句查询需要的数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“通过SQL语句查询需要的数据”吧!在main.xml中:<...
    99+
    2024-04-02
  • Oracle中sql语句如何执行日志查询
    目录oracle sql语句执行日志查询Oracle查询某天sql执行记录Oracle sql语句执行日志查询 在Oracle数据中,我们经常编写sql语句,有时我们会编写一些特别长的sql语句,而有一些意外导致sql消...
    99+
    2022-12-06
    Oraclesql语句 sql执行日志查询 Oracle执行sql语句
  • SQL语句中的日期查询
    SQL语句中的日期查询 ----YYYY --当前年份第一天的前一天 SELECT TRUNC(SYSDATE,"yyyy") - 1 + 8 / 24 FROM DUAL---2019/12/31 上午 08:00...
    99+
    2019-08-13
    SQL语句中的日期查询
  • SQL查询语句执行的过程
    目录MySQL基本架构Server 层1、连接器2、查询缓存3、分析器4、优化器5、执行器SQL语句举例: SELECT * FROM `test` WHERE `i...
    99+
    2024-04-02
  • 如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL
    如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 在 MYSQL 慢查...
    99+
    2024-04-02
  • 【MySQL】如何查询MySQL执行过的所有SQL语句
    文章目录 1 MySQL 的通常查询日志实验2 参考资料 1 MySQL 的通常查询日志实验 通过 MySQL 的通用查询日志可以找到你指定的每一条 sql 语句。很明显会有严重的性能损耗...
    99+
    2023-09-22
    mysql 数据库
  • SQL基础的查询语句有哪些
    这篇文章主要介绍“SQL基础的查询语句有哪些”,在日常操作中,相信很多人在SQL基础的查询语句有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL基础的查询语句有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
  • MySQL SQL语句查询执行过程的阶段有哪些
    这篇文章将为大家详细讲解有关MySQL SQL语句查询执行过程的阶段有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1.语法分析阶段:...
    99+
    2024-04-02
  • SQL查询语句执行的过程是什么
    这篇文章主要介绍“SQL查询语句执行的过程是什么”,在日常操作中,相信很多人在SQL查询语句执行的过程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL查询语句执行的过程是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • MyBatis中怎么禁用特定SQL语句的日志
    在MyBatis中,可以通过在配置文件中设置相应的日志级别来禁用特定SQL语句的日志输出。 在mybatis-config.xml文...
    99+
    2024-04-28
    MyBatis SQL
  • mysql通过一个sql语句查询出来的值当作条件进行循环查询
    如果你想在 MySQL 中使用一个查询的结果作为循环的条件,你可以使用一个游标。游标是一种数据库对象,它允许你在结果集中游动,并在需要时逐行处理数据。 首先,你需要声明一个游标,然后打开它。然后,你可以使用 FETCH 语句从游标中获取...
    99+
    2023-09-11
    sql 数据库
  • mysql的查询否定语句有哪些
    目录一、什么是mysql查询否定语句?1. NOT操作符:用于将条件取反。2.<>操作符:表示不等于。3. !=操作符:同样表示不等于。4. NOT IN操作符:用于排除某个范围内的值。5. NOT LIKE...
    99+
    2023-10-07
    mysql 否定语句
  • Hive HQL支持的查询语句风格有哪些
    这篇文章主要讲解了“Hive HQL支持的查询语句风格有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hive HQL支持的查询语句风格有哪些”吧!背景在平时业务运营...
    99+
    2023-07-02
  • MySQL查询语句的执行过程有哪些
    本篇文章为大家展示了MySQL查询语句的执行过程有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。查询请求的执行流程众所周知在MySQL数据库应用中查询请求是使用...
    99+
    2024-04-02
  • 通过sql语句查询出某个字段在数据库中的某个表
    新入职的小伙伴,肯定还没熟悉数据库中表于表的关系以及表中的字段的含义是什么,就需要进行需求开发,导致会出现对某个字段在哪张表里面都分辨不清,不过不要怕,可以利用已下sql语句快速找到。(要注意的是,此方法可能不适用于所有类型的数据库系统,但...
    99+
    2023-09-05
    数据库 sql mysql
  • Tk.mybatis零sql语句实现动态sql查询的方法有哪些
    这篇文章主要讲解了“Tk.mybatis零sql语句实现动态sql查询的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Tk.mybatis零sql语句实现动态sql查询的方法有哪些...
    99+
    2023-06-21
  • 如何在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过
    这期内容当中小编将会给大家带来有关如何在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在SQL Se...
    99+
    2024-04-02
  • MySQL-5.6.34通过show global status like 来查看sql语句的执行情
    需求 老大:zain啊,咱们的数据库今天有多少查询语句啊?我 :额,稍等,我看看啊; 心想,{尼玛,我怎么知道有多少select语句啊} 那么问题来了,如何查看MySQL数据库的...
    99+
    2024-04-02
  • python自动化测试通过日志3分钟定位bug的示例分析
    这篇文章主要为大家展示了“python自动化测试通过日志3分钟定位bug的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python自动化测试通过日志3分钟定位bug的示例分析”这篇文章...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作