在使用 MySQL 数据库时,遇到这样的问题:
本地可以连接 MySQL,但远程机器连接时,总是报错
Host ... is not allowed to connect to this MySQL server
。
这通常是因为 MySQL 的用户权限或配置限制了远程访问。
1. 登录 MySQL 数据库
首先,使用本地命令行登录 MySQL:
mysql -u root -p
输入 root 用户的密码进入数据库。
2. 切换到 mysql 系统库
MySQL 的用户权限存放在 mysql
数据库中,我们需要切换到它:
USE mysql;
3. 查看当前用户和主机权限
执行以下命令查看当前 MySQL 用户的 host 设置:
SELECT User, Host FROM mysql.user;
你会看到一张表,例如:
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
注意到 root
用户的 Host
是 localhost
,这表示它 只能从本机连接,无法被远程机器连接。
4. 修改 root 用户的 Host 为 %
要允许 root 用户从任意主机连接,需要把它的 Host
改成 %
(表示任意主机):
UPDATE mysql.user SET host='%' WHERE user='root' AND host='localhost';
5. 刷新权限生效
修改完权限后,需要刷新权限表才能生效:
FLUSH PRIVILEGES;
执行以下命令查看当前 MySQL 用户的 host 设置:
SELECT User, Host FROM mysql.user;
你会看到一张表,root的host被设置为了%,表示可以接受远程连接
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
不出意外的话,现在你已经可以进行远程连接了,如果还有问题可以进行6-7的排查
6. 检查 MySQL 配置文件
有时候,MySQL 的配置文件 my.cnf
(或 my.ini
)会限制绑定的地址,默认只监听 127.0.0.1
。
-
打开配置文件:
vim /etc/my.cnf
-
找到
[mysqld]
部分,修改:bind-address = 0.0.0.0
这表示监听所有 IP,而不仅是本机。
-
保存后,重启 MySQL:
systemctl restart mysqld
7. 确认防火墙是否开放 3306 端口
MySQL 默认端口是 3306
,linux为例确保服务器防火墙允许远程访问:
# 查看防火墙状态
firewall-cmd --list-all
# 开放 3306 端口(仅 firewalld 示例)
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
8. 总结
要解决 MySQL 无法远程连接的问题,可以按照下面的步骤排查:
- 修改
mysql.user
表,把 root 的Host
改为%
- 刷新权限
- 检查是否可以链接,不可以的话需要检查配置和端口防火墙
- 检查
my.cnf
配置,确保bind-address
是0.0.0.0
- 检查防火墙是否开放 3306 端口