当我在MySQL数据库中运行SHOW PROCESSLIST时,我得到了这个输出:
mysql> show full processlist;
+--------+------+-----------+--------+---------+-------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+------+-----------+-------+---------+-------+-------+-----------------------+
| 411665 | root | localhost | somedb | Sleep | 11388 | | NULL |
| 412109 | root | localhost | somedb | Query | 0 | NULL | show full processlist |
+--------+------+-----------+-------+---------+-------+-------+------------------------+
我想知道命令下的“睡眠”过程。这是什么意思?为什么它长时间运行并显示NULL?它使数据库变慢,当我终止进程时,它正常工作。请帮帮我。
答案 0 :(得分:54)
这不是等待连接的查询;它是一个等待超时终止的连接指针。
它对性能没有影响。它唯一使用的是每个连接都有的几个字节。
最糟糕的情况:它正在使用你的游泳池的一个连接;如果您通过控制台客户端多次连接并且只关闭客户端而不关闭连接,则可能会耗尽所有连接并且必须等待超时才能再次连接...但这不太可能:-)
有关详细信息,请参阅MySql Proccesslist filled with "Sleep" Entries leading to "Too many Connections"?和https://dba.stackexchange.com/questions/1558/how-long-is-too-long-for-mysql-connections-to-sleep。
答案 1 :(得分:19)
“Sleep”状态连接通常由维护与数据库的持久连接的代码创建。
这可能包括由应用程序框架或客户端数据库管理工具创建的连接池。
正如上面评论中所提到的,没有理由担心这些联系......除非您当然不知道连接的来源。
(CAVEAT:如果您有这么多类型的连接列表,可能会出现同时连接不足的危险。)
答案 2 :(得分:0)
睡眠意味着线程什么都不做。 时间太大因为anthor线程查询,但不能断开服务器, 默认wait_timeout = 28800;因此您可以设置较小的值,例如10。 你也可以杀死线程。
答案 3 :(得分:0)
我在这里找到了这个答案:https://dba.stackexchange.com/questions/1558。简而言之,使用以下(或在my.cnf中)将删除超时问题。
SET GLOBAL interactive_timeout = 180;
SET GLOBAL wait_timeout = 180;
如果连接处于睡眠状态3分钟(或您定义的任何内容),则允许连接结束。