SHOW FULL PROCESSLIST可查看完整SQL,但需SUPER或PROCESS权限才能看到其他用户线程;State和Time比Info更关键,持续Locked且Time>60基本判定卡死;mysqladmin -i 1 processlist可替代手动刷新,配合grep过滤更高效;general_log生产环境慎用,临时启用需指定独立路径并及时清理。

直接看 SHOW FULL PROCESSLIST,但别指望它“实时监控”——它只是快照,且默认只显示前100字符的SQL,没权限还只能看到自己的线程。
为什么 show processlist 看不到完整 SQL?
MySQL 默认截断 Info 字段(通常限100字),遇到带长条件的 SELECT、参数化预编译语句或嵌套子查询,就只剩个开头。比如你看到的是 SELECT id, name FROM users WHE...,根本没法判断实际过滤逻辑。
- 用
SHOW FULL PROCESSLIST强制输出完整语句,不加FULL就是自欺欺人 - 必须有
SUPER或PROCESS权限才能看到其他用户的线程;普通账号执行后只返回自己发起的连接 - 结果里
State和Time比Info更关键:持续Locked且Time > 60,基本可判定卡死
mysqladmin -i 1 processlist 能否替代手动刷新?
能,而且更实用——它每秒自动拉一次快照,滚动观察比反复敲命令强得多。
- 执行
mysqladmin -u root -p -i 1 processlist,Ctrl+C 退出 - 如果报错
Access denied; you need (at least one of) the PROCESS privilege(s),说明账号没授权,得先GRANT PROCESS ON *.* TO 'user'@'host'; FLUSH PRIVILEGES; - 输出格式紧凑,适合终端快速扫视;但不支持高亮或列筛选,想过滤特定用户得配合
grep,比如mysqladmin -i 1 processlist | grep 'myapp'
要不要开 general_log 记所有 SQL?
生产环境慎开——不是不能开,是开了容易崩盘。日志文件几小时内就能涨到 GB 级,IO 扛不住,磁盘可能写满。
- 临时排查务必指定独立路径:
SET GLOBAL general_log_file = '/tmp/mysql_general.log';,别写进/var/lib/mysql/ - 开之前先
ls -lh /tmp/mysql_general.log确认为空或已备份;开之后用tail -f /tmp/mysql_general.log | grep -E "(SELECT|UPDATE|DELETE)"过滤关注操作 - 关只需
SET GLOBAL general_log = 'OFF',不用重启;但记得手动rm /tmp/mysql_general.log清空间
真正难搞的不是“怎么看到”,而是“看到之后怎么判断是不是真问题”——State 是 Sending data 还是 Creating sort index,Time 是刚起步还是卡了5分钟,这些细节决定你该等、该杀、还是该去查应用层重试逻辑。











