Мені потрібен ефективний спосіб відключити всіх клієнтів із заданим іменем користувача від MySQL. Я думав про зміну пароля користувачів, але думаю, що це перевіряється лише тоді, коли з'єднання встановлено.
Ідеї?
Мені потрібен ефективний спосіб відключити всіх клієнтів із заданим іменем користувача від MySQL. Я думав про зміну пароля користувачів, але думаю, що це перевіряється лише тоді, коли з'єднання встановлено.
Ідеї?
Відповіді:
Ви можете використовувати метод "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
У Linux можна використовувати щось подібне.
Мій підхід дуже простий. На першому кроці ми надсилаємо "показати список переліку" до нашої бази даних. Результат - список із усіма підключеними користувачами. На наступному кроці ми використовуємо стару добру команду grep для фільтрації імен користувачів. З awk ми генеруємо команду 'kill'. На останньому кроці ми відправляємо всі команди вбити в mysql. Все повинно бути з'єднане з | символ.
mysql -uroot -e 'show processlist' | grep username | awk {'print "kill "$1";"'}| mysql -uroot