无法从mysql.user中删除匿名用户


15

我试图从mysql.users数据库中删除匿名用户。但是,我的行为一直很奇怪。当我输入命令时:

DROP User ''@'WOPR';

我收到一般错误消息。因此,我重新启动了机器,然后再次尝试。这次我得到了回应

Query OK, 0 rows affected.

但是当我把

SELECT User, Host, Password FROM mysql.user WHERE User='';

返回是:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR是我的主机名)

我运行命令

DROP User ''@'WOPR';

并得到相同的结果。

我正在Arch Linux 2.6.33版上运行MySQL 5.5的全新安装。

有谁知道会导致这种行为的原因吗?


请大声疾呼,向DBA StackExchange发送此类问题!
RolandoMySQLDBA 2011年

Answers:


15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

这应该为您做。

试试看 !!!

警告

MySQL已将某些用户预装到mysql.user中。另外,mysql.db带有两个用户,这些用户具有匿名访问权限和完全特权来测试数据库。

做这个

SELECT * FROM mysql.db \G

您将看到连接到测试的任何人或以test_开头的任何数据库都几乎可以完成测试数据库中的所有操作。这是不好的,因为可以完全访问任何测试数据库的人可以在几分钟内吞噬磁盘。

例:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

好,大不了 它使一个表具有4个字节。

现在尝试运行此SQL语句30次:

INSERT INTO junk SELECT * FROM junk;

嘿有1,073,741,824行(4GB以上文件)的即时表!!! 映像具有对测试数据库的完整权限,您可以在其中对磁盘造成这种破坏。

我对您的建议是运行此命令以清除测试用户访问权限:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

有关进一步的说明,请参见我的MySQL:为什么mysql.db中存在“测试”条目?

干杯!


嗨,罗兰多,那确实成功了,谢谢!我实际上正在修复我的测试数据库访问权限。
SirTasty 2011年

有没有办法使用drop user语法而不是mysql.user直接修改基础表?
Pacerier,2014年

1
@Pacerier请查看原始问题。真正的问题是,DROP USER当用户字段为空(空字符串)时,语法不起作用。您必须按照答案指定的方式进行操作。
RolandoMySQLDBA 2014年

@RolandoMySQLDBA,除了在mysql.user桌子上乱砍以外,还有其他解决方案吗?
Pacerier,2014年

@Pacerier如果您阅读了我的最后一个链接,您将认识到MySQL(现在为Oracle)mysql.db在安装时将两行直接放入其中,这将允许匿名用户访问测试数据库。有趣的是,有人告诉我Percona Server的安装会在安装完成之前删除这些行(dba.stackexchange.com/questions/66584/…)。由于您使用的是MySQL,因此请运行mysql_secure_installation或自行删除这两行。
RolandoMySQLDBA 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.