如何断开客户端与MySQL的连接?


9

我需要一种有效的方法来从MySQL断开具有给定用户名的所有客户端的连接。我考虑过更改用户密码,但我认为只有在建立连接后才能检查。

有想法吗?

Answers:


7

您可以在下面使用“ SQL to SQL”方法(只需根据需要将额外的连接选项传递给mysql客户端):

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv

注意:这适用于MySQL 5.1和5.5。由于information_schema没有processlist表,因此对于旧的MySQL版本,必须采用不同的实现方式。

使用的选项:

-N means that you do not want to get column names back.
-B puts it into batch mode, so that you do not get MySQL's table layout.
-e executes the following statement.
-v controls the verbosity, could be used up to three times.

解释其工作原理:

首先,将生成KILL语句以及ID。

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';"

样本输出:

KILL 1061;
KILL 1059;
KILL 1057;

然后执行这些语句。

shell> mysql -NBe "SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist WHERE user = 'some_username';" | mysql -vv

样本输出:

--------------
KILL 1061
--------------

Query OK, 0 rows affected

--------------
KILL 1059
--------------

Query OK, 0 rows affected

--------------
KILL 1057
--------------

Query OK, 0 rows affected

对于MySQL 5.5而言,这更为直接。+1 !!!
RolandoMySQLDBA 2011年

1

在Linux上,您可以使用类似的方法。

我的方法很简单。第一步,我们将“ show processlist”发送到我们的数据库。结果是包含所有已连接用户的列表。在下一步中,我们使用旧的grep命令来过滤用户名。使用awk,我们生成“ kill命令”。在最后一步中,我们将所有kill命令发送到mysql。一切都必须与|连接起来。符号。

mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot

为此代码添加一些简短的解释将是很好的。
RLF 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.