Мне нужен эффективный способ отключить всех клиентов с данным именем пользователя от 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. Это должно быть реализовано по-другому для более старых версий MySQL, так как information_schema не имеет таблицы списка процессов.
Используемые параметры:
-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 вместе с идентификаторами.
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. Все должно быть соединено с | символ.
источник