根本原因是MySQL用户账户的host字段不匹配客户端IP,如user@'localhost'无法响应192.168.1.100的TCP连接请求;需通过SELECT user,host FROM mysql.user确认权限,用CREATE USER和GRANT授权匹配IP的账号,并执行FLUSH PRIVILEGES生效。

为什么 MySQL 报错 Host is not allowed to connect to this MySQL server
这个错误不是网络连不通,也不是密码错了,而是 MySQL 服务端明确拒绝了你的 IP 连接请求——根本没走到认证那步。核心原因是用户账户的 host 字段不匹配你发起连接时的来源 IP(或主机名)。比如你用 mysql -h 192.168.1.100 -u admin -p 连,MySQL 就会查 admin@'192.168.1.100' 或 admin@'%' 这样的账户是否存在,而不是只看用户名。
查用户表确认当前允许哪些 host
登录 MySQL(必须用本地 root@localhost 或其他有权限账户),执行:
SELECT user, host FROM mysql.user;
重点看你要用的用户名对应的 host 值。常见陷阱:
-
host是'localhost':只能本机 socket 连,-h 127.0.0.1都不行(因为走 TCP) -
host是'127.0.0.1':只能用-h 127.0.0.1,不能用-h localhost -
host是'%':理论上允许任意 IP,但受skip-name-resolve和 DNS 解析影响 -
host是具体内网 IP(如'192.168.5.20'):只允许该 IP 连,写错一位就失败
临时修复:用 GRANT 添加或修改 host 权限
别直接改 mysql.user 表,用 GRANT 语句更安全(它会自动刷新权限):
CREATE USER 'admin'@'192.168.5.%' IDENTIFIED BY 'your_password';<br>GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.5.%';<br>FLUSH PRIVILEGES;
关键点:
- 如果要允许所有 IPv4,用
'%';但生产环境慎用,优先限定网段(如'192.168.5.%') - 如果客户端是 IPv6,
'%'默认不匹配 IPv6 地址,需显式加'admin'@'::%' - 执行完必须
FLUSH PRIVILEGES,否则改动不生效 - 旧账户若
host不对,先DROP USER 'admin'@'old_host';再重建,避免重复
检查 MySQL 配置和网络层干扰
即使用户权限正确,也可能被拦在更外层:
- 确认
bind_address在my.cnf中没写死为127.0.0.1(应设为0.0.0.0或具体监听 IP) - 防火墙是否放行 3306 端口:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS) - 云服务器(如阿里云、AWS)的安全组规则必须显式允许对应 IP 段访问 3306
- 如果开启了
skip-name-resolve,MySQL 不做反向 DNS 查询,host必须是 IP 或'%',不能是主机名
真实场景里,一半以上的问题出在安全组或 bind_address,而不是用户权限本身。


















