Como posso eliminar um usuário do MySQL cujo nome de usuário contenha caracteres não imprimíveis?

4

Eu tenho um usuário no MySQL 5.6 que foi criado de alguma forma com um caractere não imprimível no nome de usuário. Como posso largar esse usuário?

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

Bem, isso não parece bom. Vamos colocar um prefixo e um sufixo para que possamos ver se o MySQL está adicionando algum preenchimento à saída:

# 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

Parece uma nova linha, mas só para ter certeza:

# 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

OK, então é definitivamente uma nova linha. Tentando o óbvio:

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

Ligeiramente menos óbvio:

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

Eu vejo outra pergunta ou two que sugere editar a tabela do usuário diretamente em situações semelhantes, mas não está claro se isso é realmente uma boa idéia (ou seja, quais efeitos colaterais poderiam ou como é arriscado mexer nas tabelas do sistema?).

Como alternativa, existe uma maneira segura de fazer isso com DROP USER ?

    
por Scott Dudley 09.01.2015 / 15:57

3 respostas

2

Não há efeitos colaterais se você editar a tabela mysql.user diretamente, exceto uma: você tem que emitir um

FLUSH PRIVILEGES;

comando depois de feito (para reler as tabelas de privilégios e colocar suas alterações on-line) Então a maneira mais fácil seria se você deletasse a própria entrada do usuário mysql, como

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

se não houver outro usuário cujo nome começa com wiki (como foi mencionado antes) Se foi, tente encontrar um outro valor selecionável como a senha, etc. Se houver mais usuários com o nome semelhante, não se preocupe, você poderá excluí-los todos e recriar os que serão usados (porque as alterações só ocorrerão depois que você liberar esses privilégios - como eu disse antes. ) Se você quiser fazer a recreação do usuário rapidamente, você deve instalar o kit de ferramentas Percona primeiro, despejar todos os usuários com

  pt-show-grants > users.sql

e recarregue os usuários necessários do despejo.

Espero que ajude.

    
por 02.05.2015 / 01:47
0

tente isto:

use mysql;

delete from mysql where user = "wiki%";

flush privileges;

EDIT: isto assume que não existem outros usuários do mysql cujo nome de usuário comece com "wiki"

    
por 09.01.2015 / 18:02
0

Que tal isso?

DELETE FROM mysql.user where user like "wiki4te%" and host like "rch%";
    
por 19.01.2016 / 15:41