Як я можу відключити клієнтів від MySQL?


9

Мені потрібен ефективний спосіб відключити всіх клієнтів із заданим іменем користувача від MySQL. Я думав про зміну пароля користувачів, але думаю, що це перевіряється лише тоді, коли з'єднання встановлено.

Ідеї?

Відповіді:


7

Ви можете використовувати метод "SQL до 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 це повинно бути реалізовано по-різному, оскільки інформація_схеми не має таблиці списків процесів.

Використовувані параметри:

-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

Це набагато пряміше для MySQL 5.5. +1 !!!
RolandoMySQLDBA

1

У Linux можна використовувати щось подібне.

Мій підхід дуже простий. На першому кроці ми надсилаємо "показати список переліку" до нашої бази даних. Результат - список із усіма підключеними користувачами. На наступному кроці ми використовуємо стару добру команду grep для фільтрації імен користувачів. З awk ми генеруємо команду 'kill'. На останньому кроці ми відправляємо всі команди вбити в mysql. Все повинно бути з'єднане з | символ.

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

Було б добре додати коротке пояснення цього коду.
RLF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.