![SQLSTATE[HY000] [1130] 主机 xx.xxx.x.xxx 不允许连接到此 MySQL 服务器](https://linux22.com/image/676153/SQLSTATE%5BHY000%5D%20%5B1130%5D%20%E4%B8%BB%E6%9C%BA%20xx.xxx.x.xxx%20%E4%B8%8D%E5%85%81%E8%AE%B8%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%AD%A4%20MySQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有 2 台带有 digitalocean 的服务器 - Web(nginx)和数据库(mysql)服务器 - 并且无法从 Web 连接到 mysql 服务器。
从我阅读的有关该主题的其他 SO 帖子来看,我收到的错误是“好的”,因为它显示 mysql 正在尝试验证连接,并且该问题很可能与 mysql 用户有关,特别是主机或授予选项相关。
这是mysql.user:
mysql> SELECT User,Host FROM mysql.user;
+-------+--------------+------------+
| User | Host | Grant_priv |
+-------+--------------+------------+
| root | localhost | Y |
| root | dev-db01 | Y |
| root | 127.0.0.1 | Y |
| root | ::1 | Y |
| | localhost | N |
| | dev-db01 | N |
| admin | % | N |
| admin | localhost | N |
| admin | xx.xxx.x.xxx | N |
+-------+--------------+------------+
有些教程指出远程用户只需要输入远程主机,其他教程则需要输入通配符“%”,还有一些需要输入“%”和本地主机。我宁愿不使用通配符主机,而只使用 Web 服务器的内部 IP xx.xxx.x.xxx。如上所示,我已经尝试了所有三种方式,在此之前,我已经分别尝试了每一种方式。
我还授予管理员用户类似 root 的权限:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'xx.xxx.x.xxx' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
我不确定 Grant_priv 列的确切含义,特别是针对管理员用户的 No - 这是否意味着“WITH GRANT OPTION”不起作用?即便如此,我也不指望这会阻止用户进行身份验证。
我还没有设置防火墙,因此可以从 Web 服务器 telnet 到 mysql 服务器,并在被拒绝之前进行连接:
telnet xx.xxx.x.xx 3306
Trying xx.xxx.x.xx...
Connected to xx.xxx.x.xx.
Escape character is '^]'.
EHost 'xx.xxx.x.xx' is not allowed to connect to this MySQL serverConnection closed by foreign host.
我的目标是使用 doctrine 作为 symfony 应用程序的一部分,通过从 web 服务器到 mysql 服务器的远程连接创建数据库。如果有帮助,以下是 app/config/parameters.yml 的相关部分:
sudo vi app/config/parameters.yml
parameters:
database_driver: pdo_mysql
database_host: xx.xxx.x.xx
database_port: 3306
database_name: appdatabasename
database_user: admin
database_password: ~
如您所见,我将密码留空(~ 被解释为空),但也尝试使用密码(同时使用相同的密码更新 mysql 中的管理员用户)。
设置详细信息:
- VPS:DigitalOcean
- MySQL 服务器版本:5.7
- 操作系统:FreeBSD 10.1
我真的很困惑。有什么想法吗?
谢谢!
答案1
您是否尝试过更新数据库?
您可以使用以下命令将 xx.xxx.x.xxx 更改为 nginx 服务器的 IP,并将占位符更改为实际值:
mysql> update db set Host='xx.xxx.x.xxx' where Db='placeholder_db';
mysql> update user set Host='xx.xxx.x.xxx' where user='placeholder_user';
答案2
在 Google 中输入这个错误,我得到了第二个结果:
其中写道:
此错误是由于您的 MySQL 数据库当前使用的默认配置而发生的。此配置仅允许来自“localhost”的“root”用户进行连接,而不允许来自其他 IP 地址范围的连接。
它还提供了如何解决这个问题的说明。这似乎表明您尝试使用的用户受到 IP 限制。那里有很多说明,但由于版权问题,我并没有真正考虑在这里复制/粘贴整篇文章。