Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL如何查看未提交的事务SQL

MySQL如何查看未提交的事务SQL

作者头像
俊才
发布于 2023-01-16 06:22:20
发布于 2023-01-16 06:22:20
3K00
代码可运行
举报
文章被收录于专栏:数据库干货铺数据库干货铺
运行总次数:0
代码可运行

MySQL中经常遇到事务中的SQL正在执行或执行完成后未提交,如何找出对应的SQL?

1. 查看正在执行的SQL

查看事务中正在执行的SQL方式有多种,例如

1.1 通过processlist查看

会话1:执行1个SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select sleep(20),now() ,id from test1;

会话2:开启另一个会话,查看对应的SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> select  id ,info  from information_schema.processlist where info is not null;
+----+------------------------------------------------------------------------------+
| id | info                                                                         |
+----+------------------------------------------------------------------------------+
| 36 | select sleep(20),now() ,id from test1                                        |
| 37 | select  id ,info  from information_schema.processlist where info is not null |
+----+------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

可以看到正在执行的SQL,包括自己的SQL的id及内容

1.2 通过events_statements_current查看

会话1:执行1个SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select sleep(20),now() ,id from test1;

会话2:查看对应的SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id\G
*************************** 1. row ***************************
       id: 36
     info: select sleep(20),now() ,id from test1
thread_id: 76
 sql_text: select sleep(20),now() ,id from test1
*************************** 2. row ***************************
       id: 37
     info: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
thread_id: 77
 sql_text: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
2 rows in set (0.01 sec)

2. 方式对比

通过processlist和通过events_statements_current区别在于,processlist中能查到的SQL是正在运行的SQL,而运行结束的SQL是看不到的。

会话1:执行1个SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select sleep(2),now() ,id from test1;
+----------+---------------------+----+
| sleep(2) | now()               | id |
+----------+---------------------+----+
|        0 | 2023-01-03 22:01:09 |  1 |
+----------+---------------------+----+
1 row in set (2.00 sec)

此时查看事务情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> select  * from information_schema.innodb_trx\G
*************************** 1. row ***************************
                    trx_id: 421227264232664
                 trx_state: RUNNING
               trx_started: 2023-01-03 22:01:09
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 0
       trx_mysql_thread_id: 36
                 trx_query: NULL
       trx_operation_state: NULL
         trx_tables_in_use: 0
         trx_tables_locked: 0
          trx_lock_structs: 0
     trx_lock_memory_bytes: 1128
           trx_rows_locked: 0
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: REPEATABLE READ
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0
       trx_schedule_weight: NULL
1 row in set (0.00 sec)

其中trx_mysql_thread_id=36的会话正是我们会话1的线程id,但是我们看不到具体的SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> select *  from information_schema.processlist where id=36;
+----+------+-----------+--------+---------+------+-------+------+
| ID | USER | HOST      | DB     | COMMAND | TIME | STATE | INFO |
+----+------+-----------+--------+---------+------+-------+------+
| 36 | root | localhost | testdb | Sleep   |  177 |       | NULL |
+----+------+-----------+--------+---------+------+-------+------+
1 row in set (0.00 sec)

但是此时通过方式2就可以查到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id\G
*************************** 1. row ***************************
       id: 36
     info: NULL
thread_id: 76
 sql_text: select sleep(2),now() ,id from test1
*************************** 2. row ***************************
       id: 37
     info: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
thread_id: 77
 sql_text: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
2 rows in set (0.00 sec)

注意:此时只能查到一个事务中的多条SQL的最后一个

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select sleep(2),now() ,id from test1;
+----------+---------------------+----+
| sleep(2) | now()               | id |
+----------+---------------------+----+
|        0 | 2023-01-03 22:01:09 |  1 |
+----------+---------------------+----+
1 row in set (2.00 sec)

mysql> select sleep(1),now() ,id from test1;
+----------+---------------------+----+
| sleep(1) | now()               | id |
+----------+---------------------+----+
|        0 | 2023-01-03 22:06:35 |  1 |
+----------+---------------------+----+

会话2查看结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

mysql> select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id\G
*************************** 1. row ***************************
       id: 36
     info: NULL
thread_id: 76
 sql_text: select sleep(1),now() ,id from test1
*************************** 2. row ***************************
       id: 37
     info: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
thread_id: 77
 sql_text: select a.id,a.info, b.thread_id, c.sql_text  from information_schema.processlist  a, performance_schema.threads b, performance_schema.events_statements_current c  where  a.id=b.processlist_id  and b.thread_id = c.thread_id
2 rows in set (0.00 sec)

可见,查到的是最后一个SQL了,如果事务手动commit提交了,则显示的是commit

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据库干货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql长事务总结
在结果中idletime是计算产生的,也是事务的持续时间。但事务的trxquery是NUL,这并不是说事务什么也没执行,一个事务可能包含多个SQL,如果SQL执行完毕就不再显示了。当前事务正在执行,innodb也不知道这个事务后续还有没有sql,啥时候会commit。 因此trx_query不能提供有意义的信息。
mingjie
2022/05/12
8780
Mysql长事务总结
20个MySQL运维案例,请查收!
墨墨导读:日常MySQL运维中,会遇到各种各样的问题,下面分享二十个MySQL运维案例,附有问题的分析和解决办法,希望你遇到同样的问题的时候,可以淡定地处理。
数据和云
2020/10/27
1.3K0
20个MySQL运维案例,请查收!
什么是大事务?以及大事务产生的问题
我这里按公司实际场景,规定了,每次操作/获取数据量应该少于5000条,结果集应该小于2M
终有救赎
2023/12/14
7020
MySQL找出未提交事务的信息
我们经常会碰到这样的情况,某个事务执行完了未提交,后续再来一个DDL和DML操作,导致后面的session要么处于waiting for metadata lock,要么是锁等待超时。这时我们往往只能找到这个未提交的事务的事务id和session id,但是一般都处于sleep状态,不好分析事务内容到底是什么,所以通常都是粗鲁地kill这个session后解决问题,但是应用层的研发人员往往找不到到底是哪个事务引起的,后面再出现问题时还要重复kill。
用户1148526
2020/03/31
5.1K0
MySQL数据库故障分析-锁等待(一)
有一张权限表,同时执行了delete和truncate操作,并且长时间没有提交,导致metadata lock无法释放,应用登录时无法正常读取权限表,导致应用无法登录。
PHP开发工程师
2022/06/17
1.2K0
【转】MySQL生产堵塞严重,定位堵塞源头
原文地址 https://www.modb.pro/db/1718151901849133056
保持热爱奔赴山海
2025/02/12
680
[MYSQL] show engine innodb status中的死锁 分析
很久以前(也才2年)写过一个解析innodb_status的脚本. 看起来像那么回事, 其实就是做了个翻译和总结.
大大刺猬
2024/08/26
7280
[MYSQL] show engine innodb status中的死锁 分析
MySQL 5.6中如何定位DDL被阻塞的问题
在上一篇文章《MySQL 5.7中如何定位DDL被阻塞的问题》中,对于DDL被阻塞问题的定位,我们主要是基于MySQL 5.7新引入的performance_schema.metadata_locks表。提出的定位方法,颇有种"锦上添花"的意味,而且,也只适用于MySQL 5.7开始的版本。
星哥玩云
2022/08/17
4490
MySQL-长事务详解
『入门MySQL』系列文章已经完结,今后我的文章还是会以MySQL为主,主要记录下近期工作及学习遇到的场景或者自己的感悟想法,可能后续的文章不是那么连贯,但还是希望大家多多支持。言归正传,本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章将给你答案。
MySQL技术
2019/09/23
3.4K0
【MySQL】metadata lock问题
MySQL使用DML来管理对数据库对象的并发访问,并确保数据一致性。DML不仅适用于表,还适用于模式和存储程序(过程、函数、触发器和计划的事件)
用户5522200
2020/06/11
1.5K0
Waiting for global read lock的查杀
生产环境,假如不小心有个Waiting for global read lock 锁出现(例如flink cdc全量抽取数据),很容易造成生产事故。
保持热爱奔赴山海
2024/09/25
3030
【说站】Mysql长事务有什么影响
1、长事务意味着系统中会有一个非常旧的事务视图。在提交此事务之前,应保留回滚记录,这将导致大量的存储空间。
很酷的站长
2022/11/24
6380
【说站】Mysql长事务有什么影响
MySQL5.7+查看Waiting for table metadata lock 锁情况
Waiting for table metadata lock 这个mdl锁,我们最常见,这篇先拿它开刀。
保持热爱奔赴山海
2020/07/27
3.6K0
MySQL5.7+查看Waiting for table metadata lock  锁情况
为什么要避免大事务以及大事务如何解决?
https://juejin.im/post/5d837d2c6fb9a06b05182737
lyb-geek
2022/03/04
7410
有趣的statement stack
在使用events_statements_current的过程中发现,同一线程在同一时刻,可能有多条记录,与直观感觉不太一样,于是跟踪了一下内部实现,有了本文。
老叶茶馆
2023/02/18
3130
有趣的statement stack
MOP 系列|MOP 三种主流数据库常用 SQL(二)
MOP 不用多说,指的就是 MySQL、Oracle、PostgreSQL 三种目前最主流的数据库,MOP 系列打算更新 MOP 三种数据库的索引知识、高可用架构及常用 SQL 语句等等,上面已经更新了 MOP 索引相关的文章,今天打算整理一下这三种数据库的常用 SQL 知识,由于文章过长,今天更新中间的一篇之 MySQL 篇。第一篇 Oracle 相关的详见下方链接:MOP 系列|MOP 三种主流数据库常用 SQL(一)。
JiekeXu之路
2024/05/28
1080
MOP 系列|MOP 三种主流数据库常用 SQL(二)
MYSQL 监控 performance_schema 拿得起 不放下(1))
随着MYSQL的脚步越来越快,(更新的速度),觉得原来的监控的方式是不是也需要进行进一步的探索,当然现在的监控市场云龙混杂,成型的模式例如 percona pmm, 还有国产的蓝鲸,但这些监控在好,方式在炫酷,但也不能阻挡对数据库底层的监控的知识掌握,否则就只能看图说话,让人心里不踏实。另外很多公司的监控指标还需要灵活对待,不知道底层的监控参数输出,有怎么能开发出自己的监控系统。
AustinDatabases
2020/07/30
9130
MYSQL 监控  performance_schema  拿得起 不放下(1))
[MYSQL案例][023] 从库查询操作导致主从延迟增大
发现是执行DDL操作, 状态是Waiting for table metadata lock 也就是有人拿着mdl不放.
大大刺猬
2023/11/17
3170
[MYSQL案例][023] 从库查询操作导致主从延迟增大
技术分享 | MySQL 的 MDL 锁解惑
网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE ,腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号"bisal的个人杂货铺",长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区
2022/05/23
1.1K0
技术分享 | MySQL 的 MDL 锁解惑
为什么MySQL没有负载,但交易却跑不动?
在MySQL的数据库中,我们有时会发现MySQL数据库明明没有负载,CPU、硬盘、内存和网络等资源都很空闲,但很多SQL都pending在哪儿,MySQL数据库无法处理交易。这是怎么回事呢?
姚远OracleACE
2023/11/01
3180
为什么MySQL没有负载,但交易却跑不动?
相关推荐
Mysql长事务总结
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验