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

要查看 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 过滤锁相关状态,例如:
WHERE STATE IN ('Sending data', 'sorting result', 'Copying to tmp table');
定位锁等待与阻塞源头
当出现响应变慢或事务卡住时,重点看是否被锁:
- 检查
STATE是否为Waiting for ... lock或Locked - 结合
performance_schema.data_locks和data_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)。