允许通配符 (%) 访问 MySQL 数据库,出现错误“访问被拒绝 '<user>'@'localhost'”

Way*_*ina 20 mysql

我创建了一个数据库和一个用户,并允许通过以下方式访问:

create user 'someuser'@'%' identified by 'password';
grant all privileges on somedb.* to 'someuser' with grant option;
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试连接到 MySQL 时,出现以下错误:

$ mysql -u someuser -p
> Enter Password:
> ERROR 1045 (28000): Access denied for user 'someuser'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)

如果“%”是通配符,那么它不会也启用本地主机吗?但是,如果我没有指定我想使用密码,那么我可以很好地连接到数据库,这是没有意义的,因为我在创建用户时指定了密码。

Zor*_*che 19

尝试与 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='%' 和 User='some_user',认为这允许您指定 localhost 从同一台机器连接。这不起作用的原因是默认权限包括一个带有 Host='localhost' 和 User='' 的条目。因为该条目的主机值 'localhost' 比 '%' 更具体,所以从 localhost 连接时,它优先于新条目使用!正确的步骤是插入第二个条目,其中 Host='localhost' 和 User='some_user',


小智 8

我很确定您需要以下内容:

使用授权选项将 somedb.* 的所有权限授予 'someuser'@'%';

您的 GRANT 语句缺少主机名声明。


小智 7

如果您无法使用 someuser@'%' 连接到 mysql,其中 '%' 是主机名的通配符,请确保您的用户表中没有 ''@localhost 条目。使用以下 SQL 语句进行确认:

    mysql> SELECT * FROM user WHERE user='' AND host='localhost';
Run Code Online (Sandbox Code Playgroud)

如果 ''@localhost 存在,则通过发出以下 SQL 语句将其删除:

    mysql> DELETE FROM user WHERE user='' AND host='localhost';
Run Code Online (Sandbox Code Playgroud)

然后最后

    FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

现在 someuser@'%' 将连接到数据库。


小智 0

flush privileges;创建用户后运行了吗?如果不这样做,则直到服务器重新启动后才会对用户/权限进行更改。

然后,检查您是否没有 '%'@'localhost' 条目。

  • 使用“创建用户”和“授予”会自动刷新权限。如果您直接操作 mysql 数据库,则只需要刷新权限。 (4认同)