Назад | Перейти на главную страницу

Как я могу удалить пользователя MySQL, имя которого содержит непечатаемые символы?

У меня есть пользователь в MySQL 5.6, который каким-то образом был создан с непечатаемым символом в имени пользователя. Как мне удалить этого пользователя?

mysql> select user,host from mysql.user where user like 'wiki%';
+-----------------+------+
| user            | host |
+-----------------+------+
| wiki4thech@rch
 | %    |
+-----------------+------+
1 row in set (0.00 sec)

Что ж, это не выглядит хорошо. Давайте вставим префикс и суффикс, чтобы мы могли видеть, добавляет ли MySQL какие-либо отступы к выходным данным:

# mysql -E --disable-column-names -u root -p mysql --execute "select concat('START',user,'END') from user where user like 'wiki%'"
Enter password: 
*************************** 1. row ***************************
STARTwiki4thech@rch
END

Это похоже на новую строку, но на всякий случай:

# mysql -E --disable-column-names -u root -p mysql --execute \
  "select concat('START',user,'END') from user where user like 'wiki%'" | od -t x1c
Enter password: 
0000000    2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a
           *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
0000020    2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  20  31  2e  20  72
           *   *   *   *   *   *   *   *   *   *   *       1   .       r
0000040    6f  77  20  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a
           o   w       *   *   *   *   *   *   *   *   *   *   *   *   *
0000060    2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  2a  0a  53
           *   *   *   *   *   *   *   *   *   *   *   *   *   *  \n   S
0000100    54  41  52  54  77  69  6b  69  34  74  68  65  63  68  40  72
           T   A   R   T   w   i   k   i   4   t   h   e   c   h   @   r
0000120    63  68  0a  45  4e  44  0a                                    
           c   h  \n   E   N   D  \n                                    
0000127

Хорошо, это определенно новая строка. Пробуем очевидное:

mysql> drop user 'wiki4thech@rch\n'@'%';
ERROR 1396 (HY000): Operation DROP USER failed for 'wiki4thech@rch'@'%'

Чуть менее очевидно:

mysql> drop user 'wiki4thech@rch
    '> '@'%';
ERROR 1396 (HY000): Operation DROP USER failed for 'wiki4thech@rch'@'%'

я вижу Другой вопрос или два который предлагает редактировать пользовательскую таблицу непосредственно в аналогичных ситуациях, но неясно, действительно ли это хорошая идея (например, какие побочные эффекты это может вызвать или насколько рискованно вмешиваться в системные таблицы?).

В качестве альтернативы, есть ли безопасный способ сделать это с помощью DROP USER?

Если вы редактируете таблицу mysql.user напрямую, побочных эффектов не будет, кроме одного: вам нужно создать

FLUSH PRIVILEGES;

после того, как вы это сделаете (чтобы перечитать таблицы привилегий и поместить свои изменения в онлайн) Итак, самый простой способ - удалить саму запись от пользователя mysql, например

DELETE FROM mysql.user WHERE user ='wiki%';

если нет другого пользователя, имя которого начинается с вики (как было упомянуто ранее). Если был, попробуйте найти другое выбираемое значение, например пароль и т. д. Если есть другие пользователи с таким же именем, не беспокойтесь, вы можете удалить их все и воссоздать те, которые будут использоваться (поскольку изменения вступят в силу только после того, как вы сбросите эти привилегии - как я уже говорил ранее). Если вы хотите быстро восстановить пользователя, вам следует установить Percona инструментарий сначала выгрузите всех пользователей с

  pt-show-grants > users.sql

и перезагрузите нужных пользователей из этого дампа.

Надеюсь, поможет.

Как насчет этого?

DELETE FROM mysql.user where user like "wiki4te%" and host like "rch%";

попробуй это:

используйте mysql;

удалить из mysql, где user = "wiki%";

сбросить привилегии;

EDIT: предполагается, что нет других пользователей mysql, чьи имена начинаются с "wiki"