Мне нужен эффективный способ отключить всех клиентов с данным именем пользователя от 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. Это должно быть реализовано по-другому для более старых версий 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. Все должно быть соединено с | символ.
mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot