MySQL如何查看正在运行的SQL详解

目录
  • 前言
  • processlist
  • threads
  • events_statements_current
  • 如何查看正在运行的SQL
    • 拿到正在执行的processlist_id
    • 拿到与processlist_id对应的thread_id
    • 拿到正在执行的sql语句
    • 完整SQL
  • 总结

前言

​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的数据库:mysql, sys, information_schema, performance_schema.这几个库存储了MySQL在运行过程中的配置信息,运行信息,参数配置,数据库信息,表信息等等。今天这个要查看正在运行的SQL主要用到的是information_schema和performance_schema这两个库。

processlist

processlist表位于information_schema库中,主要是存储的MySQL线程的一些基本信息。我们使用

desc information_schema.processlist来查看表结构:

  • ID: 线程的id
  • USER: 线程属于哪一个用户
  • HOST:客户端的host信息:hostname+端口
  • DB:线程在哪一个数据库下
  • COMMAND:线程使用哪一种命令在执行,空闲的线程状态为sleep
  • TIME:线程已经运行的时间,秒为单位
  • STATE:线程正在做什么:当前的状态,行为,或者事件
  • INFO:线程正在执行的语句,但是这个并不是很准确,所以需要使用其他的方式来完成我们的目标。

使用show processlist 或者 select * from information_schema.processlist查看processlist表

threads

threads 位于performance_schema库中,每一行记录的是一条服务器线程。当performance_schema初始化的时候,它会根据当时存在的线程填充线程表,之后每当服务器创建线程时,都会添加一条新数据。当线程结束线程表中也会删除这条数据。使用 desc performance_schema.threads 来查看表结构:

  • THREAD_ID:线程唯一id
  • NAME:与服务器中的线程监测代码相关联的名称
  • TYPE:线程类型。分为前台和后台。用户连线程是前台线程,与内部服务器活动相关的线程是后端线程。例如InnoDB内部线程。
  • PROCESSLIST_ID:上边的processlist的id
  • PROCESSLIST_USER:上边的processlist的user
  • PROCESSLIST_HOST:上边的processlist的host
  • PROCESSLIST_DB:上边的processlist的DB
  • PROCESSLIST_COMMAND:上边的processlist的COMMAND
  • PROCESSLIST_TIME:上边的processlist的TIME
  • PROCESSLIST_STATE:上边的processlist的STATE
  • PROCESSLIST_INFO:上边的processlist的INFO
  • PARENT_THREAD_ID:衍生线程的id值
  • ROLE:未使用
  • INSTRUMENTED:线程执行的事件是否插装,(YES or ON)
  • HISTORY:是否为线程记录历史事件
  • CONNECTION_TYPE:用于建立连接的协议,或者NULL用于后台线程。
  • THREAD_OS_ID:MySQL线程对应于操作系统的线程id

events_statements_current

events_statements_current 位于performance_schema库中,它存储的是当前的语句事件,表为每个线程存储一行,显示贤臣哥最近监视的语句事件的当前状态。使用desc performance_schema.events_statements_current查看表结构:

  • THREAD_ID:与事件关联的线程id,与上边threads的id对应
  • EVENT_ID:事件启动时的线程当前事件号

THREAD_ID和EVENT_ID一起标志唯一一行,没有两行具有相同的键值对

  • END_EVENT_ID:在事件开始时设置null,并在事件结束时更新为线程当前事件号
  • EVENT_NAME:事件的名称
  • SOURCE:包含生成事件的监测代码的源文件名称和监测发生所在文件的行号
  • TIMER_START,TIMER_END,TIMER_WAIT:事件的时间信息,开始时间,结束时间,事件的运行时间,单位是皮秒(万分之一秒)。
  • LOCK_TIME:等待表锁花费的时间。微妙为单位
  • SQL_TEXT:SQL语句的文本,对于没有关联SQL语句的命令为null
  • DIGEST:MD5的32个字符
  • DIGEST_TEXT:规范化语句摘要文本。
  • CURRENT_SCHEMA:语句的默认数据库
  • OBJECT_TYPE,OBJECT_SCHEMA,OBJECT_NAME :对于嵌套语句这些列包含有关父语句的信息
  • OBJECT_INSTANCE_BEGIN:语句在内存的对象地址
  • MYSQL_ERRNO:语句错误号
  • RETURNED_SQLSTATE:sql状态返回
  • MESSAGE_TEXT:错误信息
  • ERRORS:该语句是否发生错误。
  • WARNINGS:警告次数
  • ROWS_AFFECTED:受语句影响的行数
  • ROWS_SENT:语句返回的行数
  • ROWS_EXAMINED:服务器层检查的行数
    • CREATED_TMP_DISK_TABLES
    • CREATED_TMP_TABLES
    • SELECT_FULL_JOIN
    • SELECT_FULL_RANGE_JOIN
    • SELECT_RANGE
    • SELECT_RANGE_CHECK
    • SELECT_SCAN
    • SORT_MERGE_PASSES
    • SORT_RANGE
    • SORT_ROWS
    • SORT_SCAN
    • NO_INDEX_USED
    • NO_GOOD_INDEX_USED
    • NESTING_EVENT_ID
    • NESTING_EVENT_TYPE
    • NESTING_EVENT_LEVEL

如何查看正在运行的SQL

1、processlist表记录的是MySQL正在运行的线程信息,而每一个线程在threads表中都有用线程的一个唯一id >>> thread_id。events_statements_current表中记录着唯一线程id和该线程对应的SQL语句sql_text.

2、所以我们可以先在processlist拿到processlist对应的id

3、通过threads表的字段分析,我们之后一个processlist_id和thread_id一一对应,所以之后在threads表中通过processlist_id拿到thread_id

4、最后一步就是关键,我们通过thread_id在events_statements_current表中拿到sql_text,也就是我们需要拿到的sql语句。

拿到正在执行的processlist_id

select id from information_schema.processlist

拿到与processlist_id对应的thread_id

select thread_id from performance_schema.threads where processlist_id in (上一步拿到的processlist_id列表)

拿到正在执行的sql语句

select thread_id, sql_text from performance_schema.events_statements_current where thread_id in (上一步拿到的thread_id列表)

完整SQL

SELECT a.*, c.thread_id, c.sql_text from information_schema.processlist a
LEFT JOIN performance_schema.threads b on a.id = b.PROCESSLIST_ID
LEFT JOIN performance_schema.events_statements_current c on c.THREAD_ID = b.THREAD_ID

总结

到此这篇关于MySQL如何查看正在运行的SQL的文章就介绍到这了,更多相关MySQL查看正在运行SQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 探讨:MySQL中如何查询当前正在运行的SQL语句

    通过status命令,查看Slow queries这一项,如果值长时间>0,说明有查询执行时间过长 复制代码 代码如下: 以下为引用的内容:mysql> status; -------------- mysql Ver 11.18 Distrib 3.23.58, for redhat-linux-gnu (i386) Connection id: 53 Current database: (null) Current user: root@localhost Current pager: s

  • 一条sql详解MYSQL的架构设计详情

    目录 1 前言 2 应用层 2.1 连接线程处理 3 服务层 3.1 SQL 接口 3.2 SQL解析器 3.3 SQL优化器 3.4 执行器 3.5 查询缓存 4 存储引擎层 4.1 概述 4.2 缓冲池(buffer pool) 4.2.1 数据页.缓存页和脏页 4.2.2 元数据 4.2.3 free链表 4.2.4 flush链表 4.2.5 LRU链表 4.2.6 小结 4.3 undo log 4.4 redo log 5 总结 1 前言 对于一个服务端开发来说 MYSQL 可能是他

  • JDBC连接mysql处理中文时乱码解决办法详解

    JDBC连接mysql处理中文时乱码解决办法详解 近日,整合的项目需要跟一个比较老版本的mysql服务器连接,使用navicat查看,发现此mysql服务器貌似没有设置默认编码,而且从操作此mysql的部分php文件看,应该是使用的gb2312的编码,但是,直接使用jdbc操作,从库中读取出来的中文全都是乱码. 一开始,使用类似entity.setDepartName(new String(rs.getString("hg").getBytes("gbk"), &q

  • MySQL数据库完全备份与增量备份详解

    目录 定义 完全备份与恢复演示 定义 完全备份就是将数据库中的数据及所有对象全部备份. 由于 MySQL 服务器中的数据文件是基于磁盘的文本文件,所以完全备份就是复制数据库文件,是最简单也是最快速的方式. 但 MySQL 服务器的数据文件在服务器运行期间,总是处于打开状态,为实现真正的完全备份,需要先停止 MySQL 数据库服务器. 为了保障数据的完整性,在停止 MySQL 服务器之前,需要先执行 flush tables 语句将所有数据写入到数据文件中.对于该方法同学们只需了解,因为将生产环境

  • Mysql 5.7.9 shutdown 语法实例详解

    mysql-5.7.9 终于提供shutdown 语法啦: 之前如果想关闭一个mysql数据库可以通过kill 命令.mysqladmin shutdown .service mysqld stop 等这样的方式. 然而在mysql-5.7.9之后mysql终于提供了SQL接口的shutdown语法啦! SQL接口下的shutdown语法: 语法 shutdown ; -- 这个shutdown要执行成功要有shutdown权限才行. shutdown的一个例子: [root@workstudi

  • MySQL数据备份之mysqldump的使用详解

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文件(转储文件)中,比如: mysqldump -uroot -p123 test > test.dump 生成的test.dump文件中包含建表语句(生成数据库结构哦)和插入数据的insert语句. B. --opt 如果加上--opt参数则生成的du

  • windows 64位下MySQL 8.0.15安装教程图文详解

    先去官网下载点击的MySQL的下载 下载完成后解压  解压完是这个样子 配置系统环境变量 复制解压后的mysql到C盘或者其他磁盘下 我们去系统的环境变量的path里添加一个mysql的配置  指向mysql的bin目录   配置初始化的my.ini文件的文件 解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置: [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录

  • SparkSQL读取hive数据本地idea运行的方法详解

    环境准备: hadoop版本:2.6.5 spark版本:2.3.0 hive版本:1.2.2 master主机:192.168.100.201 slave1主机:192.168.100.201 pom.xml依赖如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

  • GoAdminGroup/go-admin的安装和运行的教程详解

    使用这个GoAdminGroup/go-admin框架的最简单的例子就可以把项目运行起来 , go-admin 是以扩展库的形式使用的. 建一个main.go package main import ( "io/ioutil" "log" "os" "os/signal" _ "github.com/GoAdminGroup/go-admin/adapter/gin" _ "github.com/

  • MySQL教程数据定义语言DDL示例详解

    目录 1.SQL语言的基本功能介绍 2.数据定义语言的用途 3.数据库的创建和销毁 4.数据库表的操作(所有演示都以student表为例) 1)创建表 2)修改表 3)销毁表 如果你是刚刚学习MySQL的小白,在你看这篇文章之前,请先看看下面这些文章.有些知识你可能掌握起来有点困难,但请相信我,按照我提供的这个学习流程,反复去看,肯定可以看明白的,这样就不至于到了最后某些知识不懂却不知道从哪里下手去查. <MySQL详细安装教程> <MySQL完整卸载教程> <这点基础都不懂

  • MySQL中replace into与replace区别详解

    目录 0.故事的背景 1.replace into 的使用方法 2.有唯一索引时—replace into & 与replace 效果 3.没有唯一索引时—replace into 与 replace 1).replace函数的具体情况 2).replace into 函数的具体情况 4.replace的用法 本篇为抛砖引玉篇,之前没关注过replace into 与replace 的区别.经过多个场景测试,居然没找到在插入数据的时候两者有什么本质的区别?如果了解详情的伙伴们,请告知留言告知一二

随机推荐

其他