我创建了一个数据库和一个用户,并允许通过以下方式访问:
create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;
然而,当我尝试连接到 MySQL 时出现以下错误:
$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)
如果“%”是通配符,那么它是否也会启用 localhost?但是,如果我不指定要使用密码,那么我可以正常连接到数据库,这毫无意义,因为我在创建用户时指定了密码。
答案1
尝试连接 mysql -u someuser -p -h 127.0.0.1
。
如果您无需密码即可连接,则说明您已在 .my.cnf 中保存了凭据,或者您已创建允许无需密码访问的帐户。
来自 mysql 文档的这个评论可能也相关。
http://dev.mysql.com/doc/refman/5.1/en/access-denied.html
如果您无法弄清楚为什么拒绝访问,请从用户表中删除所有 Host 值包含通配符的条目(包含“%”或“_”字符的条目)。一个非常常见的错误是插入一个新条目,其中 Host='%' 和 User='some_user',认为这允许您指定 localhost 从同一台机器进行连接。这不起作用的原因是默认权限包括一个 Host='localhost' 和 User='' 的条目。由于该条目的 Host 值“localhost”比“%”更具体,因此从 localhost 连接时优先使用它而不是新条目!正确的过程是插入第二个条目,其中 Host='localhost' 和 User='some_user',或删除 Host='localhost' 和 User='' 的条目。
答案2
我非常确定您需要以下内容:
授予“somedb.*”上的所有权限给“someuser”@“%”,并使用授权选项;
您的 GRANT 语句缺少主机名声明。
答案3
如果您无法使用 someuser@'%' 连接到 mysql,其中 '%' 是主机名的通配符,则请确保您的用户表中没有 ''@localhost 条目。使用以下 SQL 语句确认:
mysql> SELECT * FROM user WHERE user='' AND host='localhost';
如果 ''@localhost 存在,则通过发出以下 SQL 语句将其删除:
mysql> DELETE FROM user WHERE user='' AND host='localhost';
最后
FLUSH PRIVILEGES;
现在 someuser@'%' 将连接到数据库。
答案4
创建用户后您运行过吗flush privileges;
?如果没有,则用户/权限的更改要等到服务器重启后才会生效。
然后,检查您是否有“%”@“localhost”条目。