环球科创网

2022年01月09日整理发布:详解MySQL线程状态

更新时间:2022-01-09 14:26:52

导读 我想跟大家说一下MySQL线程状态的详细说明。相信朋友们也应该密切关注这个话题。现在,我给各位朋友详细讲解一下MySQL线程状态。边肖还收集

我想跟大家说一下MySQL线程状态的详细说明。相信朋友们也应该密切关注这个话题。现在,我给各位朋友详细讲解一下MySQL线程状态。边肖还收集了关于MySQL线程状态的详细解释的相关信息。我希望你看到后会喜欢。

文章目录

1.显示进程列表2、命令命令类型3、用户线程状态4、转储线程状态5、IO线程状态6、SQL线程状态7、主从连接线程状态8、事件调度线程状态

相关免费学习推荐:mysql视频教程

I .显示进程列表

Id:连接进程标识符。是CONNECTION_ID函数User:语句的MySQL用户名返回的值。如果显示“系统用户”,则表示MySQL生成的非客户端线程正在执行内部任务。例如,主从复制中从库中使用的输入/输出或SQL线程,或者延迟线路处理程序的线程。“未经身份验证的用户”是指客户端已经与服务器建立了TCP/IP连接,但尚未对客户端用户的用户密码进行身份验证的线程。“event_scheduler”指的是监视计划任务的计划事件的线程。Host:执行该语句的客户端的主机名显示为host _ name: client _ port(如果启用了skip_name_resolve参数,则采用ip:client_port的格式)Db:客户端连接的默认数据库(如果在连接时指定了库名);否则,它将显示为空。命令:线程正在执行的命令类型。时间:线程处于当前状态的次数(秒)。对于从属SQL线程,该值是从上次复制事件的时间到从属线程的实际时间之间的秒数。状态:指示线程正在执行哪种操作事件或状态。信息:线程正在执行的语句。二、命令命令类型

Binlog Dump:主库线程用于将二进制日志内容发送给从库change用户:线程正在执行Change用户操作Close stmt:线程正在关闭预编译语句Connect:从库线程已连接到主库Connect Out:从库正在连接到主库Create DB:线程正在执行库构建操作Daemon:这是服务器内部的线程,不是客户端连接的线程。调试:线程正在生成调试信息。延迟插入:这是一个延迟插入处理程序的线程。删除数据库:线程正在执行删除数据库操作。执行:线程正在执行预编译语句。提取:线程正在执行语句并从中获取结果集字段。列表:线程正在检索表列的信息。Init DB:线程正在选择默认数据库Kill:线程正在杀死其他线程。长数据:线程正在执行语句,并检索和返回长字段(大字段)类型的数据结果集。Ping:线程正在处理服务器ping请求。准备:线程正在预编译一条语句。Processlist:线程正在分娩。关于服务器线程的信息查询:线程正在执行查询语句退出:线程正在终止刷新:线程正在刷新表日志或缓存或重置状态变量或复制服务器信息注册从属:线程正在注册从属库重置主库上的stmt:线程正在重置预编译语句设置选项:线程正在设置或重置客户端语句执行选项关闭:线程正在执行关闭服务器睡眠: 该线程正在等待客户端向其发送请求Statistics的新语句:该线程正在生成服务器状态信息Table Dump:该线程正在向从库III发送表内容。 用户线程状态

创建后:该状态将在线程完成创建表(包括内部临时表)时出现。即使由于某些错误导致创建表时出现最终错误,也会出现这种状态。分析:线程正在分析表检查权限:检查线程是否具有在服务器中执行语句的必要权限。检查表:线程正在执行表检查操作清理:线程已经完成一个。命令并准备释放占用的内存并重置一些状态变量关闭表:线程正在将表的更改数据刷新到磁盘并关闭表。将HEAP转换为MyISAM:线程正在将内部临时表从MEMORY引擎表转换为临时表副本到磁盘的tmp表MyISAM:线程正在执行ALTER TABLE语句。这种状态发生在创建新结构的表之后,在将旧表数据复制到新表之前,将出现复制到组表:如果语句使用不同的ORDER BY和group by条件列,则根据GROUP BY对行数据进行排序,并将排序结果复制到临时表复制到tmp表:服务器正在将数据复制到内存临时表alteringtable:服务器正在执行ALTER TABLE就地复制到磁盘上的tmp表的过程:服务器正在将数据复制到磁盘临时表。由于临时结果集太大,线程正在将内存临时表转换为基于磁盘的临时表,以节省内存Cr。

eating index:线程正在执行一个 ALTER TABLE … ENABLE KEYS 语句Creating sort index:线程正在执行 SELECT 且使用到了内部临时表creating table:线程正在创建表。包括创建临时表时也会使用此状态Creating tmp table:线程正在内存或磁盘上创建一个临时表。如果表在内存中创建但后来被转换为磁盘表则该操作期间的状态将为“Copying to tmp table on disk”committing alter table to storage engine:server 已执行完成 in-place 算法的 ALTER TABLE 语句正在提交deleting from main table:server 正在执行多表删除语句中的第一部分。看到这个 状态表示正在从第一个表中删除并保存后续用于删除其他表的列数据和偏移量deleting from reference tables:server 正在执行多表删除语句的第二部分从其他表中删除匹配的行discard_or_import_tablespace :线程正在执行 ALTER TABLE … DISCARD TABLESPACE 或 ALTER TABLE … IMPORT TABLESPACE 语句end:这发生在语句执行结束时但在清除 ALTER TABLECREATE VIEWDELETEINSERTSELECT 或 UPDATE 语句之前出现该状态executing:线程正在执行语句中Execution of init_command:线程正在执行一个初始化系统变量的语句freeing items:线程已经执行完成了一个命令。释放一些涉及到 query cache 状态 的 items。这种状态后通常紧随 cleaning up 状态之后FULLTEXT initialization:server 正在准备执行自然语言全文搜索init:这在 ALTER TABLEDELETEINSERTSELECT 或 UPDATE 语句初始化之前发生的状态。server 在此状态下执行的操作包括刷新二进制日志InnoDB 日志和一些查询缓存清理操作。对于这个状态结束时可能会有如下一些操作: 当表中的数据更改后删除查询缓存条目 将事件写入二进制日志 释放内存缓冲区包括 blobKilled:向线程发起一个 kill 操作线程应该执行终止操作。在 MySQL 的每个主循环中检查线程的 kill 标志但在某些情况下杀死线程可能只需要很短的时间。但如果被 kill 的线程被其他线程锁定则需要等待其他线程释放锁之后kill 命令才会生效并执行。logging slow query:线程正在向慢查询日志写一条语句login:连接线程的初始状态直到客户端成功通过身份验证manage keys:server 正在启用或禁用表索引NULL:此状态用于 SHOW PROCESSLIST 语句Opening tables:线程正尝试打开一个表。打开表操作应该非常快除非打开操作被阻止。例如ALTER TABLE 或 LOCK TABLE 语句可以防止打开表直到该语句完成。另外也可能是 table_open_cache 不够大导致不能打开表。optimizing:server 正在对查询执行初始优化preparing:此状态发生在查询优化期间Purging old relay logs:线程正在删除不需要的中继日志文件query end:此状态出现在执行查询语句之后但在释放该查询语句相关状态 items 之前Reading from net:server 正在从网络读取数据包。在 MySQL 5.7.8 之后该状态叫做“Receiving from client” - Receiving from client:server 正在从客户端读取数据包。在 MySQL 5.7.8 叫做“Reading from net”Removing duplicates:查询使用 SELECT DISTINCT 语句时使 MySQL 无法在早期阶段优化掉 distinct 操作。因此MySQL 需要一个额外的阶段来删除所有重复的行然后将结果发送到客户端removing tmp table:线程在 SELECT 语句执行完成后正在删除内部临时表。如果 SELECT 语句未创建临时表则不会出现此状态rename:线程正在执行 rename 语句重命名表rename result table:线程正在执行 ALTER TABLE 语句重命名表已经创建完成新表并正在使用新表替换旧表名称Reopen tables:线程获得了表锁但是获得锁后发现基础表结构已经被改变了。 于是释放表锁并关闭表尝试重新打开表Repair by sorting:修复代码正在使用排序来创建索引preparing for alter table:server 正在准备执行 in-place 算法的 ALTER TABLE 语 句 - Repair done:该线程已完成 MyISAM 表的多线程修复Repair with keycache:修复代码正在使用通过 key cache 逐个创建 key 的方法修复索引。这比通过排序索引修复的方法慢得多Rolling back:线程正在回滚事务Saving state:对于 MyISAM 表操作(如修复或分析)线程正在将新表状态保存到.MYI 文件头。状态包括:表数据行数,AUTO_INCREMENT 计数器和 key 分布之类的信息Searching rows for update:线程正在进行第一阶段查找所有匹配的行然后再更新它们。如果 UPDATE 正在更改用于查找涉及的行的索引则必须先把 update 满足匹配的行先查找出来Sending data:线程正在读取和处理 SELECT 语句产生的数据行并将数据发送到客户端。因为在此状态期间发生的操作可能产生大量的磁盘访问(读取)所以它通常是给定查询的生存期内最长的运行状态Sending to client:server 正在向客户端写入数据包。在 MySQL 5.7.8 之前叫做“Writing to net”setup:线程正在执行 ALTER TABLE 操作Sorting for group:线程正在执行一个 GROUP BY 排序操作Sorting for order:线程正在执行一个 ORDER BY 排序操作Sorting index:线程正在排序索引页面以便在 MyISAM 表优化操作期间实现更高效的访问Sorting result:对于 SELECT 语句这类似“Creating sort index”状态但是针对于非临时表statistics:server 正在计算统计信息以优化查询执行计划。如果一个线程在这个状态很长一段时间server 可能是磁盘执行其他工作而阻塞了统计信息的操作也有可能发生了锁等待。System lock:线程调用了mysql_lock_tables线程状态从未更新过。这是一个非常常见的状态出现该状态的原因有很多。例如线程将请求或正在等待表的内部或外部系统锁定。当 InnoDB 在执行 LOCK TABLES 期间等待表级锁时可能会发生这种情况。如果此状态是由外部锁请求引起的如果您不使用多个mysqld 服务器访问同一 MyISAM 表则可以使用–skip-external-locking 选项禁用外部系统锁。但是默认情况下外部锁定是禁用的因此此选项可能无效。 对于 SHOW PROFILE此状态表示线程正在请求锁定update:线程准备开始更新表Updating:线程搜索且正在更新数据行updating main table:server 正在执行多表更新语句的第一部分。该状态表示正在 更新第一个表并保存列值和偏移量以用于更新其他(引用)表updating reference tables:server 正在执行多表更新语句的第二部分更新其他表 的匹配行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:线程获取到一个通知表的底层结构已经改变它需要重新打开表以获得新的结构。但是要重新打开表它必须等待直到所有其他线 程都关闭了旧数据结构的表的访问。如果另一个线程已在表中使用 FLUSH TABLES 或下列语句之一则就会出现这个通知:FLUSH TABLES tbl_nameALTER TABLERENAME TABLE * REPAIR TABLEANALYZE TABLEOPTIMIZE TABLEWaiting for table flush:线程正在执行 FLUSH TABLES并且正在等待所有线程关闭所访问的表或者线程得到一个表的底层结构已经改变的通知它需要重新打开表以获得新的结构。但是要重新打开表它必须等待直到所有其他线程都关闭了旧表结构的访问。如果另一个线程已在表中使用 FLUSH TABLES 或下列语句之一则就会出现这个通知:FLUSH TABLES tbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLEOPTIMIZE TABLEWaiting for lock_type lock:server 正在等待获得一个 THR_LOCK 锁或者从元数据锁定子系统中获取一个 MDL 锁其中 lock_type 表示正在等待获得的 MDL 锁的类型THR_LOCK 只有一种(Waiting for table level lock)MDL 锁有如下几种:Waiting for event metadata lockWaiting for global read lockWaiting for schema metadata lockWaiting for stored function metadata lockWaiting for stored procedure metadata lockWaiting for table metadata lockWaiting for trigger metadata lockWaiting on cond:线程正在等待条件变为 true 的通用状态。没有特定的状态信息可用Writing to net:server 正在向网络写入数据包。从 MySQL 5.7.8 之后叫做“Sending to client”

四、dump线程状态

Finished reading one binlog; switching to next binlog:线程已经完成读取 binlog 文 件并切换到下一个 binlog 文件Master has sent all binlog to slave; waiting for more updates:线程已经从二进制日志中读取了所有剩余的更新日志并将它们发送到从库。线程当前处于空闲状态正在等待新的更新数据的事件写入二进制日志中Sending binlog event to slave:线程已经从二进制日志中读取了一个事件现在将其发送到从库(二进制日志由事件组成一个事件通常是由发生更新的数据和一些其他信息组成)Waiting to finalize termination:线程停止时发生的非常短暂的状态线程正在执行停止线程相关的动作

五、IO线程状态

Checking master version:在建立与主库的连接之后非常短暂的状态表示正在检查主库的版本号Connecting to master:线程尝试连接到主库Queueing master event to the relay log:线程已读取一个事件并将其复制到中继日志以便 SQL 线程进行重放Reconnecting after a failed binlog dump request:线程正在尝试重新连接到主库Reconnecting after a failed master event read:线程正在尝试重新连接到主库当重连连接成功时状态将变为“Waiting for master to send event” - Registering slave on master:在连接到主库成功之后非常短暂的状态表示正在向主库注册从库的连接信息(如从库的 IP 和端口信息等)Requesting binlog dump:在与主库建立连接成功之后非常短暂的状态使用当 前的 I/O 线程位置向主库发送从当前位置开始的二进制日志的内容的请求Waiting for its turn to commit:如果启用了 slave_preserve_commit_order 参数则 表示从库 I/O 线程正在等待较旧的工作线程提交数据Waiting for master to send event:线程已经连接到主库并且正在等待新的二进制 日志事件如果主库空闲这可能持续很长时间。如果等待时间持续超过slave_net_timeout 秒则从库 I/O 线程发生超时。此时从库 I/O 线程认为主库的连接断开会尝试重新连接主库Waiting for master update:连接到主库之前的初始状态Waiting for slave mutex on exit:线程停止时短暂发生的状态表示正在回收 I/O 线程的相关互斥资源Waiting for the slave SQL thread to free enough relay log space:如果 relay_log_space_limit 变量设置值不为 0那么当中继日志总大小增长到超过此值时。 I/O 线程会等待直到 SQL 线程通过重放中继日志内容并删除重放完成的中继日志以释放中继日志占用的空间使其满足中继日志中大小不大于 relay_log_space_limit 变量的值时I/O 线程才可以继续写入中继日志操作。Waiting to reconnect after a failed binlog dump request:如果二进制日志 dump 请求失败(由于断开连接)那么线程在进入 sleep 状态此时出现此状态然后I/O 线程定期尝试重新连接主库。重试之间的间隔时间可以使用 CHANGE MASTER TO 语句的 MASTER_CONNECT_RETRY 选项指定要注意从库的 I/O 线程连接主库是有心跳机制的当主库超过这个心跳时间没有发送新的 event 到 slave 上时I/O 线程就对主库发起一个心跳请求如果请求成功就重置心跳时间当主库有新的 event 发送到 slave 时这个心跳时 间 也 会 进 行 重 置 。 心 跳 时 间 由 change master 语句的MASTER_HEARTBEAT_PERIOD 选项设置(以秒为单位)范围 0 到 4294967 秒分辨率(毫秒)最小非零值为0.001表示 1 毫秒。将间隔设置为 0 时表示禁用心跳。默认值是slave_net_timeout 配置参数的二分之一。so理论上是不会出现主从数据库正常的情况下因为主库没有写数据而导致从库 I/O 线程断开的情况。Waiting to reconnect after a failed master event read:读取主库 binlog 时发生错误(由于断开连接)。I/O 线程在尝试重新连接主库之前线程正在以 CHANGE MASTER TO 语句的 MASTER_CONNECT_RETRY 选项(默认为 60)设置的秒数进行 sleep(该时间是重连失败之后的重试间隔时间)

六、SQL 线程状态

Killing slave:线程正在处理 STOP SLAVE 语句Making temporary file(append)before replaying LOAD DATA INFILE:线程正在执行 LOAD DATA INFILE 语句并将从库将要读取的数据添加到临时文件中Making temporary file(create)before replaying LOAD DATA INFILE:线程正在执行 LOAD DATA INFILE 语句且正在创建临时文件临时文件中包含了从库将要读取行数据。注意:只有在 MySQL 5.0.3 之前的版本中主库记录了原始LOAD DATA INFILE 语句时才能遇到此状态Reading event from the relay log:线程正在从中继日志中读取事件以便进行重放Slave has read all relay log; waiting for more updates:线程已重做完所有的中继日志文件中的所有事件正在等待 I/O 线程向中继日志中写入新的事件Waiting for an event from Coordinator:从库使用多线程复制时(slave_parallel_workers 大于 1)此状态表示一个 slave works 线程正在等待协调器线程(Coordinator 线程)分配日志事件Waiting for slave mutex on exit:线程停止时发生的非常短暂的状态Waiting for Slave Workers to free pending events:当 Workers 线程处理的事件的总数量大小超过 slave_pending_jobs_size_max 系统变量的大小时会发生等待操作(协调器线程不进行分配事件给 worker 线程)。当 Workers 线程处理的事件的总数量大小低于 slave_pending_jobs_size_max 限制时协调器恢复调度。只有当 slave_parallel_workers 设置为大于 0 时此状态才会出现Waiting for the next event in relay log:“Reading event from the relay log”状态之前的初始状态Waiting until MASTER_DELAY seconds after master executed event:SQL 线程已读取事件但并没有进行应用而是正在等待从库设置的延迟复制时间失效。此延迟时间使用 CHANGE MASTER TO 的 MASTER_DELAY 选项设置 ⚫ SQL 线程的 Info 列也可以显示语句的文本。这表示线程已经从中继日志中读取了一个事件并从中提取了 SQL 语句当前可能正在执行这个语句对应的事件。

七、 主从连接线程状态

Changing master:线程正在处理 CHANGE MASTER TO 语句Killing slave:线程正在处理 STOP SLAVE 语句Opening master dump table:此状态发生在主库创建 dump 表之后Reading master dump table data:"Opening master dump table"状态之后出现的状态表示正在从主库 dump 表读取数据Rebuilding the index on master dump table:“Reading master dump table data”状态之后出现的状态表示正在重建主库 dump 表索引

八、事件调度线程状态

Clearing:调度程序线程正在停止执行事件Initialized:调度程序线程已初始化完成将要执行调度事件Waiting for next activation:调度程序具有非空事件队列时正在等待未来某个时间点激活队列中的某个事件以便进行调度并执行Waiting for scheduler to stop:线程发出 SET GLOBAL event_scheduler = OFF 并等待调度程序停止Waiting on empty queue:调度程序的事件队列为空因此调度程序处于休眠状态

相关免费学习推荐:mysql数据库(视频)

以上就是详解MySQL线程状态的详细内容!

来源:php中文网

免责声明:本文由用户上传,如有侵权请联系删除!