MySQLから特定のユーザー名ですべてのクライアントを切断する効率的な方法が必要です。ユーザーのパスワードを変更することを考えましたが、接続が確立されたときにのみチェックされると思います。
アイデア?
MySQLから特定のユーザー名ですべてのクライアントを切断する効率的な方法が必要です。ユーザーのパスワードを変更することを考えましたが、接続が確立されたときにのみチェックされると思います。
アイデア?
回答:
以下の「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
Linuxでは、そのようなものを使用できます。
私のアプローチは非常に簡単です。最初のステップでは、「show processlist」をデータベースに送信します。結果は、接続されているすべてのユーザーのリストです。次のステップでは、古き良きgrepコマンドを使用してユーザー名をフィルタリングします。awkを使用して、「killコマンド」を生成します。最後のステップでは、すべてのkillコマンドをmysqlに送信します。すべてを|と連結する必要があります。シンボル。
mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot