如何从SHOW PROCESSLIST中查看完整的查询?

375

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

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

7个回答

607

3
看起来 phpmyadmin 并不在意此事,仍然显示被截断的信息。 - giorgio79
如果我没记错的话,phpMyAdmin会截断所有字符串结果。不过,我已经四年没有做过任何Web开发了,所以我可能是错的。 - James McNellis
2
我发现即使使用 SHOW FULL PROCESSLIST 命令,查询在达到一定的长度后被截断。有没有办法让它显示更完整的内容? - wizonesolutions
1
执行 SHOW FULL PROCESSLIST 命令需要在末尾加上分号 ;,对吗? - Rakibul Haq
1
@R.Haq 如果这是你唯一要执行的查询,那么分号不是必需的。如果你想执行多个查询,那么在每个查询后面都需要加上分号。 - Julio Garcia
@JulioGarcia 好的,但是我在mysql cmd界面中执行这个单行查询时没有加分号失败了,可能是我做错了什么。谢谢。 - Rakibul Haq

142

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' |

19
这可能是最有用的答案。 - dr_
我的信息列显示“COMMIT”。你知道我如何查看有关实际查询的更多详细信息吗? - m.spyratos
本地主机:41060,41060代表什么?有猜测吗? - Farveen Hassan
1
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; - spen.smith

24

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

SHOW FULL PROCESSLIST;

或者

 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;

15

如果想在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

1
这是唯一一个似乎具有回答原问题所需的关键要素的答案,即在不截断查询的情况下获取info列:使用\G而不是;来终止查询。 - Araxia
你可以尝试使用 mytop(1) - sjas

15

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

来自 MySQL SHOW FULL PROCESSLIST 文档的引用:

如果您拥有 PROCESS 权限,可以查看所有线程。

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


如果您是“root”,则这不是真的。 - Valerio Bozz

7
SHOW FULL PROCESSLIST

这将显示更多信息的完整进程列表。


对不起,这与接受的答案有什么不同吗? - darclander
我在命令的末尾加了一个 \G,就像这样 SHOW FULL PROCESSLIST \G 但现在似乎不起作用了.. 有什么变化吗? - ryadavalli

1

bash

## identify the query id
mysql -e 'SHOW processlist'

## show only the related sql query for this process omitting the other columns
## change: YOUR_QUERY_ID_YOU_LOOKED_UP
mysql -sre 'SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id=YOUR_QUERY_ID_YOU_LOOKED_UP'|tr '\n' ' ';echo

## bonus: get mysql EXPLAIN for this query (when its too long to copy properly)
## change: YOUR_DATABASE,YOUR_QUERY_ID_YOU_LOOKED_UP
mysql -e "USE YOUR_DATABASE;EXPLAIN $(mysql -sre 'SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id=YOUR_QUERY_ID_YOU_LOOKED_UP'|tr '\n' ' ';echo)"

mysql

-- identify the query id
SHOW processlist;

/*
show only the related sql query for this process omitting the other columns
change: YOUR_QUERY_ID_YOU_LOOKED_UP
*/
SELECT info FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id=YOUR_QUERY_ID_YOU_LOOKED_UP \G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接