mysql如何查看当前正在执行的sql_mysql运行状态排查

1次阅读

使用 SHOW PROCEsslIST 或查询 information_schema.PROCESSLIST 可查看当前执行的 sql 和状态;配合 performance_schema.data_lock_waits 等表可定位锁等待与阻塞源头。

mysql如何查看当前正在执行的sql_mysql运行状态排查

要查看 mysql 当前正在执行的 SQL 语句和运行状态,核心是使用 SHOW PROCESSLIST 或查询 information_schema.PROCESSLIST 表,配合性能视图(如 performance_schema)可进一步定位慢查询、锁等待等问题。

查看实时连接与正在执行的SQL

执行以下命令即可列出当前所有连接及其正在运行的语句:

SHOW PROCESSLIST;

若需查看全部(包括 Sleep 状态及其他用户看不到的线程),需有 PROCESS 权限:

SHOW FULL PROCESSLIST;

常用字段说明:

  • Id:线程唯一标识
  • User:客户端连接用户名
  • Host:客户端 IP 和端口
  • db:当前默认数据库
  • Command:当前命令类型(如 Query、Sleep、Connect)
  • Time:该线程持续时间(秒),对排查长时间运行 SQL 很关键
  • State:线程状态(如 Sending data、Locked、Waiting for table metadata lock)
  • Info:正在执行或最近执行的 SQL(可能被截断,FULL 可显示完整)

用系统表查询更灵活的会话信息

推荐使用 information_schema.PROCESSLIST,便于加条件过滤:

SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO  FROM information_schema.PROCESSLIST  WHERE COMMAND = 'Query' AND TIME > 30;

这个例子找出运行超 30 秒的活跃查询。还可结合 STATE 过滤锁相关状态,例如:

mysql如何查看当前正在执行的sql_mysql运行状态排查

Linfo.ai

Linfo AI 是一款AI驱动的 Chrome 扩展程序,可以将网页文章、行业报告、YouTube 视频和 PDF 文档转换为结构化摘要。

mysql如何查看当前正在执行的sql_mysql运行状态排查 145

查看详情 mysql如何查看当前正在执行的sql_mysql运行状态排查

WHERE STATE IN ('Sending data', 'sorting result', 'Copying to tmp table');

定位锁等待与阻塞源头

当出现响应变慢或事务卡住时,重点看是否被锁:

  • 检查 STATE 是否为 Waiting for ... lockLocked
  • 结合 performance_schema.data_locksdata_lock_waits(MySQL 8.0+)查锁冲突:
SELECT * FROM performance_schema.data_lock_waits;

该表能直接显示哪个线程在等哪个线程持有的锁,是排查死锁和长事务阻塞的关键依据。

辅助诊断:常用状态与含义速查

几个高频 State 值及应对建议:

  • Sending data:查询正在处理结果集(可能是大表扫描、未加索引的 JOIN,也可能是正常返回大数据量)
  • Creating sort index:ORDER BY 或 GROUP BY 触发了文件排序,考虑优化索引或减少排序字段
  • Copying to tmp table:查询使用了临时表(如 union、GROUP BY + 非索引字段),检查是否可改写或加索引
  • Waiting for table metadata lock:DDL(如 ALTER TABLE)被其他长事务阻塞,需先 kill 掉持有元数据锁的旧连接
  • Locked:MyISAM 表级锁或 InnoDB 行锁争用,InnoDB 下更常见的是行锁等待,需结合 innodb_trx 查事务

必要时可连查事务表:

SELECT * FROM information_schema.INNODB_TRX ORDER BY TRX_STARTED;

重点关注 TRX_STATE(是否 RUNNING/LOCK WAIT)、TRX_STARTED(运行时长)、TRX_QUERY(当前 SQL)。

text=ZqhQzanResources