当尝试连接Mysql数据库时,如果收到错误提示ERROR 1130: Host 'xxx' is not allowed to connect to this MySQL server,说明当前发起连接的主机没有被Mysql服务器授权访问。这个问题本质是Mysql的用户权限体系中,对连接来源主机的限制导致的,下面我们分场景讲解具体的解决方法。

错误原因分析
Mysql的用户权限是基于用户名+来源主机的组合来管理的,默认情况下,新创建的Mysql用户或者初始的root用户,可能只允许在本地主机(localhost或者127.0.0.1)进行连接。如果发起连接的主机不在允许的范围内,就会触发1130错误。常见的场景包括:
- 从其他服务器或者本地其他网卡IP尝试连接Mysql
- 使用root用户首次尝试远程连接Mysql服务
- 之前修改过用户权限,误删了对应主机的访问权限
本地连接报1130的解决方法
如果是本地连接就出现1130错误,大概率是本地用户权限配置异常,可以按照以下步骤处理:
步骤1:跳过权限验证启动Mysql
首先停止正在运行的Mysql服务,然后以跳过权限验证的方式启动Mysql,方便我们后续修改权限配置:
# 停止Mysql服务,不同系统命令可能有差异 systemctl stop mysqld # 跳过权限验证启动Mysql mysqld_safe --skip-grant-tables &
步骤2:修改用户host权限
启动后无需密码直接登录Mysql,然后查看当前用户的host配置:
-- 登录Mysql mysql -u root -- 切换到mysql系统库 USE mysql; -- 查看用户和对应的允许连接host SELECT user, host FROM user;
如果本地连接的用户host不是localhost或者127.0.0.1,可以执行以下语句修改:
-- 将root用户的host修改为localhost,允许本地连接 UPDATE user SET host = 'localhost' WHERE user = 'root'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
步骤3:重启Mysql服务
修改完成后退出Mysql,停止跳过权限的进程,然后正常启动Mysql服务即可:
# 停止跳过权限的Mysql进程 killall mysqld # 正常启动Mysql服务 systemctl start mysqld
远程连接报1130的解决方法
如果是从其他主机远程连接Mysql出现1130错误,需要开放对应用户的远程连接权限,具体步骤如下:
步骤1:登录Mysql服务器
在Mysql所在的服务器上,使用有权限的账户登录Mysql,切换到mysql系统库。
步骤2:修改用户host允许远程连接
可以根据需求选择两种配置方式:
方式一:允许指定IP的主机连接,安全性更高:
-- 允许192.168.0.100的主机使用root用户连接Mysql -- 如果密码需要修改可以加上IDENTIFIED BY '你的密码' UPDATE user SET host = '192.168.0.100' WHERE user = 'root' AND host = 'localhost'; -- 刷新权限 FLUSH PRIVILEGES;
方式二:允许所有IP的主机连接,仅建议测试环境使用:
-- 允许所有主机使用root用户连接Mysql UPDATE user SET host = '%' WHERE user = 'root'; -- 刷新权限 FLUSH PRIVILEGES;
步骤3:检查防火墙配置
如果修改权限后还是无法连接,需要检查Mysql所在服务器的防火墙,是否开放了Mysql默认的3306端口:
# 开放3306端口,firewalld防火墙命令 firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload
注意事项
- 修改用户权限后一定要执行
FLUSH PRIVILEGES;语句,否则权限不会立即生效 - 生产环境不建议将用户host设置为%,尽量限制为固定的可信IP,避免数据库被非法访问
- 如果使用的是云服务器,还需要检查云服务商的安全组规则,是否开放了3306端口的入站权限
如果是新创建的用户出现1130错误,也可以在创建用户时直接指定允许的host,例如CREATE USER 'test'@'192.168.0.%' IDENTIFIED BY 'test123';,表示允许192.168.0段的所有主机使用该用户连接。