如何删除用户名包含不可打印字符的 MySQL 用户?

如何删除用户名包含不可打印字符的 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

答案1

如果你直接编辑mysql.user表,则不会有任何副作用,但有一个例外:你必须发出一个

FLUSH PRIVILEGES;

完成后的命令(重新读取权限表并将更改联机)因此,最简单的方法是从 mysql 用户中删除条目本身,例如

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

如果没有其他用户的名字以 wiki 开头(如前所述),则尝试查找另一个可选值,如密码等。如果有更多用户具有相似的名称,那么不用担心,您可以删除所有用户,然后重新创建将要使用的用户(因为更改只会在您刷新该权限后发生 - 正如我之前所说的那样。)如果您想快速进行用户重建,您应该先安装 Percona 工具包,使用以下命令转储所有用户

  pt-show-grants > users.sql

并从该转储中重新加载所需的用户。

希望能帮助到你。

答案2

这个怎么样?

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

答案3

尝试这个:

使用mysql;

从 mysql 中删除用户 =“wiki%”;

刷新权限;

编辑:假设没有其他 mysql 用户的用户名以“wiki”开头

相关内容