错误1130(HY000):主机“”不被允许连接到此MySQL服务器。

171

为什么我无法连接到MySQL?

mysql -u root -ptest101 -h xxx.xxx.xxx.xxx
ERROR 1130 (HY000): Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server

我在my.cnf文件中有以下内容

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 0.0.0.0

我也运行了以下代码...

'UPDATE mysql.user SET Password = PASSWORD('test101') WHERE User = 'root';
FLUSH PRIVILEGES;

我可以使用mysql -u root -ptest101在主机上访问,但无法使用mysql -u root -ptest101 -h xxx.xxx.xxx.xxx访问。

哇...为什么会发生这种情况?我是Ubuntu 12.04。

mysql> SELECT host FROM mysql.user WHERE User = 'root';
+---------------------------------------------+
| host                                        |
+---------------------------------------------+
| %                                           |
| 127.0.0.1                                   |
| ::1                                         | |
| localhost                                   |
+---------------------------------------------+
5 rows in set (0.00 sec)

1
请记住,mysql账户不仅仅是用户名。它们是user@host对,其中任何一方都可以是通配符。您可能正在使用正确的用户名,但您是否也授予了正确的主机权限呢? - Marc B
7个回答

417

你的root账户,以及任何账户,只能使用本地主机访问(建议如此)。

您可以使用以下命令进行检查:

SELECT host FROM mysql.user WHERE User = 'root';

如果您只看到 localhost127.0.0.1 的结果,那么您无法从外部源连接。如果您看到其他IP地址,但不是您正在连接的地址 - 这也是一种指示。

您需要添加每个想要授权访问的系统的IP地址,然后授予权限:

CREATE USER 'root'@'ip_address' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'ip_address';

如果你看到%,那么,那是“任何远程来源”的另一个问题。 然而,如果你确实希望所有系统通过root连接,使用%通配符授予访问权限:

如果您看到的是%,那么这意味着存在一个完全不同的问题,因为它代表着“任何远程来源”。但是,如果您确实想让所有系统通过root连接,请使用%通配符来授予访问权限:

CREATE USER 'root'@'%' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

最后,重新加载权限,这样您就应该能够进行远程访问:

FLUSH PRIVILEGES;

5
这篇文章很有用 http://bucktownbell.com/?p=653 - Tampa
3
那个SQL语句 "GRANT ALL PRIVILEGES ON . TO 'root'@'%'" 需要在它后面加上一个 ";"。 - bronze man
2
现在它只是抱怨“用户访问被拒绝”。 - user3338098
6
之后,您应该执行SET PASSWORD FOR 'root'@'%' = PASSWORD('MyNewPass');。MySQL文档仅建议将'root'@'localhost'更新为“更改root密码”,这会让人们误以为已经更改了root密码,但实际上并没有。 - user3338098
1
@JazzCat %符号在http://dev.mysql.com/doc/refman/5.7/en/request-access.html文档中有正确的说明。 - user3338098
显示剩余9条评论

30

以下两个步骤对我来说非常完美:

  1. 在文件/etc/mysql/my.cnf中注释掉绑定地址:

    #bind-address = 127.0.0.1

  2. 在phpMyAdmin中运行以下查询:

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;


9
"sudo service mysql restart" 可以翻译成“使用sudo命令重启MySQL服务”。 - sromku
3
解除绑定将使服务器在所有 IP 上开放... 这是一个安全问题! - Alex Frenkel
可以用。谢谢,伙计。 - Syafiqur__
@AlexFrenkel 但是我们不是可以通过权限进行密码验证吗?否则,为了调试目的,如何从动态IP访问它。我可以在生产环境中稍后更改它。 - Joel G Mathew

22
$mysql -u root --host=127.0.0.1 -p

mysql>use mysql

mysql>GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'redhat@123';

mysql>FLUSH PRIVILEGES;

mysql> SELECT host FROM mysql.user WHERE User = 'root';

sudo service mysql restart 需要在此之后运行 谢谢 - Adnan Zaheer

2

mysql> 创建用户 'name'@'%',密码为'passWord'; 查询成功,0行受影响(0.00秒)

mysql> 授予'name'@'%'所有权限; 查询成功,0行受影响(0.00秒)

mysql> 刷新权限; 查询成功,0行受影响(0.00秒)

mysql>

  1. 请确保您的用户名和%符号的位置正确
  2. 请确保已将端口3306添加到可能正在运行的任何防火墙中(尽管这将给出不同的错误消息)

希望这能帮助某些人...


-1

对于那些能够访问cpanel的人来说,有一种更简单的方法可以绕过它。

  1. 登录cpanel => 数据库部分下的"远程MySQL":

  2. 添加您正在访问的IP地址/主机名

  3. 完成!!!


cPanel是一个第三方的图形用户界面工具。 - Joel G Mathew

-7

前往PhpMyAdmin,点击所需数据库, 进入权限选项卡并创建新用户“remote”,并赋予他所有权限, 在主机字段中设置“任何主机”选项(%)。


-13

有一种简单的方法可以解决这个错误

只需将文件夹中的文件替换为:C:\xampp\mysql\data\mysql

使用以下文件替换:C:\xampp\mysql\backup\mysql


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接