MySQL线程状态详解
前言: 我们常用 show processlist
或 show full processlist
查看数据库连接状态,其中比较关注的是 State 列,此列表示该连接此刻所在的状态。那么你真的了解不同 State 值所表示的状态吗?下面我们参考官方文档来一探究竟 。
以MySQL 5.7版本为例
官方文档地址:
https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html
简单翻译下:
After create
当线程在创建表的函数末尾创建表(包括内部临时表)时,会发生这种情况。即使由于某些错误而无法创建表,也会使用此状态。
Analyzing
线程正在计算
MyISAM
表键分布(例如,for
ANALYZE TABLE
)。
checking permissions
线程正在检查服务器是否具有执行语句所需的权限。
Checking table
该线程正在执行表检查操作。
cleaning up
该线程已经处理了一个命令,并准备释放内存并重置某些状态变量。
closing tables
该线程正在将更改的表数据刷新到磁盘并关闭已使用的表。这应该是一个快速的操作。如果没有,请验证您的磁盘空间剩余。
converting HEAP to ondisk
该线程正在将内部临时表从
MEMORY
表转换为磁盘表。
copy to tmp table
线程正在处理一个
ALTER TABLE
语句。在创建具有新结构的表但在将行复制到其中之前,将发生此状态。对于处于此状态的线程,可以使用性能模式来获取有关复制操作的进度。
Copying to group table
如果语句具有不同的条件
ORDER BY
和
GROUP BY
标准,则按组对行进行排序并将其复制到临时表。
Copying to tmp table
服务器正在复制到内存中的临时表。
altering table
服务器正在执行就地
ALTER TABLE
。
Copying to tmp table on disk
服务器正在复制到磁盘上的临时表。
Creating index
线程正在处理
ALTER TABLE ... ENABLE KEYS
一个
MyISAM
表。
Creating sort index
线程正在处理
SELECT
使用内部临时表解析的线程 。
creating table
线程正在创建一个表。这包括创建临时表。
Creating tmp table
该线程正在内存或磁盘上创建临时表。如果表在内存中创建但稍后转换为磁盘表,则该操作期间的状态将为
Copying to tmp table on disk
。
committing alter table to storage engine
服务器已完成就地
ALTER TABLE
并提交结果。
deleting from main table
服务器正在执行多表删除的第一部分。它仅从第一个表中删除,并保存用于从其他(引用)表中删除的列和偏移量。
deleting from reference tables
服务器正在执行多表删除的第二部分,并从其他表中删除匹配的行。
discard_or_import_tablespace
线程正在处理
ALTER TABLE ... DISCARD TABLESPACE
或
ALTER TABLE ... IMPORT TABLESPACE
声明。
end
这发生在结束,但的清理之前
ALTER TABLE
,
CREATE VIEW
,
DELETE
,
INSERT
,
SELECT
,或
UPDATE
语句。
executing
该线程已开始执行语句。
Execution of init_command
线程正在执行
init_command
系统变量值中的语句 。
freeing items
线程执行了一个命令。在此状态期间完成的一些项目的释放涉及查询缓存。这种状态通常紧随其后
cleaning up
。
FULLTEXT initialization
服务器正准备执行自然语言全文搜索。
init
出现这种情况的初始化之前
ALTER TABLE
,
DELETE
,
INSERT
,
SELECT
,或
UPDATE
语句。服务器在此状态下采取的操作包括刷新二进制日志,
InnoDB
日志和一些查询缓存清理操作。对于
end
状态,可能会发生以下操作:- 删除表中的数据后删除查询缓存条目
- 将事件写入二进制日志
- 释放内存缓冲区,包括blob
Killed
有人
KILL
向线程发送了一个语句,它应该在下次检查kill标志时中止。在MySQL的每个主循环中检查该标志,但在某些情况下,线程可能仍然需要很短的时间才能死掉。如果线程被某个其他线程锁定,则一旦另一个线程释放其锁定,kill就会生效。
logging slow query
该线程正在向慢查询日志写一条语句。
login
连接线程的初始状态,直到客户端成功通过身份验证。
manage keys
服务器正在启用或禁用表索引。
NULL
该状态用于该
SHOW PROCESSLIST
状态。
Opening tables
线程正在尝试打开一个表。这应该是非常快的程序,除非有什么东西阻止打开。例如,一个
ALTER TABLE
或一个
LOCK TABLE
语句可以阻止在语句结束之前打开表。
optimizing
服务器正在对查询执行初始优化。
preparing
在查询优化期间发生此状态。
Purging old relay logs
该线程正在删除不需要的中继日志文件。
query end
处理查询后但在
freeing items
状态之前发生此 状态。
Receiving from client
服务器正在从客户端读取数据包。
Reading from net
在MySQL 5.7.8之前调用此状态。
Removing duplicates
该查询使用
SELECT DISTINCT
的方式是MySQL无法在早期阶段优化掉不同的操作。因此,在将结果发送到客户端之前,MySQL需要额外的阶段来删除所有重复的行。
removing tmp table
该线程在处理
SELECT
语句后删除内部临时表。如果未创建临时表,则不使用此状态。
rename
该线程正在重命名一个表。
rename result table
线程正在处理一个
ALTER TABLE
语句,创建了新表,并重命名它以替换原始表。
Reopen tables
该线程获得了表的锁定,但在获取锁定之后注意到基础表结构发生了变化。它释放了锁,关闭了桌子,并试图重新打开它。
Repair by sorting
修复代码使用排序来创建索引。
preparing for alter table
服务器正准备执行就地
ALTER TABLE
。
Repair done
该线程已完成对
MyISAM
表的多线程修复 。
Repair with keycache
修复代码通过密钥缓存逐个创建密钥。这比慢得多
Repair by sorting
。
Rolling back
该线程正在回滚一个事务。
Saving state
对于
MyISAM
诸如修复或分析的表操作,线程将新表状态保存到
.MYI
文件头。状态包括诸如行数,
AUTO_INCREMENT
计数器和密钥分发之类的信息。
Searching rows for update
该线程正在进行第一阶段以在更新之前查找所有匹配的行。如果
UPDATE
要更改用于查找所涉及行的索引,则必须执行此操作。
Sending data
线程正在读取和处理
SELECT
语句的行 ,并将数据发送到客户端。由于在此状态期间发生的操作往往会执行大量磁盘访问(读取),因此它通常是给定查询生命周期中运行时间最长的状态。
Sending to client
服务器正在向客户端写入数据包。
Writing to net
在MySQL 5.7.8之前调用此状态。
setup
线程正在开始一个
ALTER TABLE
操作。
Sorting for group
线程正在进行排序以满足
GROUP BY
。
Sorting for order
线程正在进行排序以满足
ORDER BY
。
Sorting index
该线程正在对索引页面进行排序,以便在
MyISAM
表优化操作期间进行更有效的访
Sorting result
对于
SELECT
声明,这类似于
Creating sort index
非临时表。
statistics
服务器正在计算统计信息以开发查询执行计划。如果线程长时间处于此状态,则服务器可能是磁盘绑定执行其他工作。
System lock
线程已经调用
mysql_lock_tables()
,并且线程状态尚未更新。这是一个非常普遍的状态,可能由于多种原因而发生。例如,线程将请求或正在等待表的内部或外部系统锁定。
InnoDB
在执行期间等待表级锁定时会 发生这种情况
LOCK TABLES
。如果此状态是由外部锁的请求引起的,并且您没有使用多个访问相同 表的
mysqld
服务器,则
MyISAM
可以使用该
--skip-external-locking
选项禁用外部系统锁 。但是,默认情况下禁用外部锁定,因此该选项很可能无效。对于
SHOW PROFILE
,这个状态意味着线程正在请求锁定(不等待它)。
update
线程正准备开始更新表。
Updating
线程正在搜索要更新的行并正在更新它们。
updating main table
服务器正在执行多表更新的第一部分。它仅更新第一个表,并保存用于更新其他(引用)表的列和偏移量。
updating reference tables
服务器正在执行多表更新的第二部分,并更新其他表中的匹配行。
User lock
该线程将要求或正在等待通过
GET_LOCK()
呼叫请求的咨询锁 。对于
SHOW PROFILE
,此状态表示线程正在请求锁定(不等待它)。
User sleep
线程已经调用了一个
SLEEP()
调用。
Waiting for commit lock
FLUSH TABLES WITH READ LOCK
正在等待提交锁定。
Waiting for global read lock
FLUSH TABLES WITH READ LOCK
正在等待全局读锁定或
read_only
正在设置全局 系统变量。
Waiting for tables
线程得到一个通知,表明表的底层结构已经改变,它需要重新打开表以获得新结构。但是,要重新打开表,它必须等到所有其他线程关闭了相关表。
Waiting for table flush
线程正在执行
FLUSH TABLES
并且正在等待所有线程关闭它们的表,或者线程得到一个表的基础结构已经更改的通知,并且它需要重新打开表以获取新结构。但是,要重新打开表,它必须等到所有其他线程关闭了相关表。
Waiting for *lock_type* lock
服务器正在等待
THR_LOCK
从元数据锁定子系统获取 锁定或锁定,其中
lock_type
指示锁定的类型。此状态表示等待
THR_LOCK
:
Waiting for table level lock
这些状态表示等待元数据锁定:
Waiting for event metadata lock
Waiting for global read lock
Waiting for schema metadata lock
Waiting for stored function metadata lock
Waiting for stored procedure metadata lock
Waiting for table metadata lock
Waiting for trigger metadata lock
Waiting on cond
线程正在等待条件变为真的通用状态。没有具体的州信息。
Writing to net
服务器正在将数据包写入网络。
Sending to client
从MySQL 5.7.8开始调用此状态。
MySQL线程状态详解的更多相关文章
- “全栈2019”Java多线程第十章:Thread.State线程状态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- java 线程状态 详解
线程被创建后,有一个生命周期,下图是线程的生命周期详解. java api java.lang.Thread.State 这个枚举中给出了六种线程状态,分别是: 线程状态 导致状态发生条件 NEW(新 ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- MySQL关闭过程详解和安全关闭MySQL的方法
MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...
- MySQL日志功能详解
MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...
- (转)MySQL备份原理详解
MySQL备份原理详解 原文:http://www.cnblogs.com/cchust/p/5452557.html 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之 ...
- MySQL数据库备份详解
原文:MySQL数据库备份详解 对于任何数据库来说,备份都是非常重要的 数据库复制不能取代备份的作用 比如我们由于误操作,在主数据库上删除了一些数据,由于主从复制的时间很短,在发现时,从数据库上的数据 ...
- Mysql 三大特性详解
Mysql 三大特性详解 Mysql Innodb后台线程 工作方式 首先Mysql进程模型是单进程多线程的.所以我们通过ps查找mysqld进程是只有一个. 体系架构 InnoDB存储引擎的架构如下 ...
- (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解
原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: ...
随机推荐
- 实现RTSP摄像机硬盘录像机NVR网站网页微信H5直播方案EasyNVR部署问题之:ERR_CONTENT_LENGTH_MISMATCH
背景分析 接触到EasyNVR产品的开发者都知道,EasyNVR是一套功能齐全.简洁易用的流媒体解决方案,可作为能力曾前端接入摄像头,后端接入业务系统使用,也可以作为应用层,直接修改为属于企业用户自己 ...
- 单例设计模式代码-bxy
struct ConnectInfo { const QObject *sender; //发送者 const char *signal_str; //发送信号 const QObject *reci ...
- Kubernetes 控制器之 Service 讲解(七)
一.背景介绍 我们这里准备三台机器,一台master,两台node,采用kubeadm的方式进行安装的,安装过程大家可以参照我之前的博文. IP 角色 版本 192.168.1.200 master ...
- 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组
1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...
- 新手配置LNMP环境教程
回顾一下这几天自己配置LNMP环境踩得坑,希望帮助更多人 前期准备:VMtool.Linux.Nginx.Mysql.PHP.cmake 版本如下:Centos6.nginx1.6.0.mysql5. ...
- springboot添加servlet的两种方法
1.是自己继承HttpServlet. 那么在类上面加 @WebServlet(loadOnStartup=1,urlPatterns={"/xxxServlet"}) 就可以了 ...
- 2019CCPC网络赛
^&^ (HDU 6702) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- Java开发笔记(一百一十七)AWT窗口
前面介绍的所有Java代码,都只能通过日志观察运行情况,就算编译成class文件,也必须在命令行下面运行,这样的程序无疑只能给开发者做调试用,不能拿给一般人使用.因为普通用户早已习惯在窗口界面上操作, ...
- Java开发笔记(一百三十四)Swing的基本对话框
桌面程序在运行过程中,时常需要在主界面之上弹出小窗,把某种消息告知用户,以便用户及时知晓并对症处理.这类小窗口通常称作对话框,依据消息交互的过程,可将对话框分为三类:消息对话框.确认对话框.输入对话框 ...
- 【Linux】Linux目录结构及详细介绍
00. 目录 01. 常用目录介绍 /:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区 ...