如何从 SHOW PROCESSLIST 查看完整查询

Posted

技术标签:

【中文标题】如何从 SHOW PROCESSLIST 查看完整查询【英文标题】:How to see full query from SHOW PROCESSLIST 【发布时间】:2011-04-08 00:15:22 【问题描述】:

当我发出 SHOW PROCESSLIST 查询时,info 列中只返回正在运行的 SQL 查询的前 100 个字符。

是否可以更改 mysql 配置或发出不同类型的请求以查看完整的查询(我正在查看的查询超过 100 个字符)

【问题讨论】:

【参考方案1】:
SHOW FULL PROCESSLIST

如果你不使用FULL,"only the first 100 characters of each statement are shown in the Info field"。

使用 phpMyAdmin 时,您还应该单击“全文”选项(结果表左上角的“← T →”)以查看未截断的结果。

【讨论】:

看来phpmyadmin并不关心这个,仍然显示截断的信息。 @giorgio79:如果我没记错的话,phpMyAdmin 会截断所有字符串结果。不过,我已经四年没有做任何 Web 开发了,所以我很可能会弄错。 我看到查询在一定长度后被截断,即使使用 SHOW FULL PROCESSLIST。我可以让它更饱满吗? 命令SHOW FULL PROCESSLIST末尾需要一个分号;对吗? @R.Haq 如果这是您要执行的唯一查询,则不需要分号。如果您想执行多个查询,那么您确实需要在每个查询后面加上分号。【参考方案2】:

我刚刚在MySQL documentation 中读到SHOW FULL PROCESSLIST 默认只列出来自您当前用户连接的线程

引自 MySQL SHOW FULL PROCESSLIST 文档:

如果你有 PROCESS 权限,你可以看到所有线程。

因此您可以在mysql.user 表中启用Process_priv 列。记得之后执行FLUSH PRIVILEGES :)

【讨论】:

如果您是root,则不是这样。【参考方案3】:

Show Processlist 从另一个表中获取信息。以下是如何提取数据并查看包含整个查询的“INFO”列:

select * from INFORMATION_SCHEMA.PROCESSLIST where db = 'somedb';

您可以根据需要添加任何条件或忽略。

查询的输出结果为:

+-------+------+-----------------+--------+---------+------+-----------+----------------------------------------------------------+
| ID    | USER | HOST            | DB     | COMMAND | TIME | STATE     | INFO                                                     |
+-------+------+-----------------+--------+---------+------+-----------+----------------------------------------------------------+
|     5 | ssss | localhost:41060 | somedb | Sleep   |    3 |           | NULL                                                     |
| 58169 | root | localhost       | somedb | Query   |    0 | executing | select * from sometable where tblColumnName = 'someName' |

【讨论】:

这可能是最有用的答案。 我的信息栏显示COMMIT。您知道如何查看有关实际查询的更多详细信息吗? localhost:41060 , 41060 代表什么?有什么猜测吗? 快速查询,用于显示正在运行的查询以及在 Amazon Aurora MySQL 上结束查询的能力:select id pid, user, concat('CALL mysql.rds_kill(', id, ');'), time, state, info from information_schema.processlist where info is not null order by time desc;【参考方案4】:

查看来自 SHOW PROCESSLIST 的完整查询:

SHOW FULL PROCESSLIST;

或者

 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;

【讨论】:

【参考方案5】:

如果想要在 shell 会话中不断更新进程(例如,2 秒),而无需手动与之交互,请使用:

watch -n 2 'mysql -h 127.0.0.1 -P 3306 -u some_user -psome_pass some_database -e "show full processlist;"'

show [full] processlist 唯一的坏处是您无法过滤输出结果。另一方面,发出SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST 可以从输出中删除您不想看到的任何内容:

SELECT * from INFORMATION_SCHEMA.PROCESSLIST
WHERE DB = 'somedatabase'
AND COMMAND <> 'Sleep'
AND HOST NOT LIKE '10.164.25.133%' \G

【讨论】:

以上是关于如何从 SHOW PROCESSLIST 查看完整查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中 show processlist 和 show full processlist命令详解

MySQL中 show processlist 和 show full processlist命令详解

mysql 的show processlist和show full processlist区别

mysql 显示完整的processlist中info信息

mysql慢SQL排查之show processlist和show full processlist

MySql使用show processlist查看正在执行的Sql语句