根本原因是mysql用户权限仅限localhost且bind-address锁定为127.0.0.1:需创建'用户'@'%'并授权、将bind-address改为0.0.0.0、开放3306端口防火墙及安全组,最后验证监听与连通性。

根本原因就两个:MySQL用户权限只允许 localhost,以及服务绑定地址限制在 127.0.0.1。不是密码错,也不是端口没开,是默认配置主动拒绝了非本地连接。
用户 host 字段全是 localhost 导致 IP 连接被拒
执行 SELECT user, host FROM mysql.user;,如果结果里所有 host 值都是 localhost,那任何外部 IP(包括本机真实 IP)都会被拒绝,报错类似 Host '192.168.1.100' is not allowed to connect。
- 不要直接
UPDATE mysql.user SET host = '%'—— MySQL 8.0+ 对系统表写入有严格校验,该操作大概率静默失败或后续认证异常 - 正确做法是新建用户:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass123!';,再授权:GRANT SELECT, INSERT ON mydb.* TO 'appuser'@'%'; - 若必须复用
root,用ALTER USER 'root'@'localhost' RENAME TO 'root'@'%';(MySQL 5.7+),然后FLUSH PRIVILEGES; - 生产环境禁止用
'root'@'%',应限定为具体网段,如'appuser'@'192.168.1.%'
my.cnf 或 my.ini 中 bind-address 锁死本地监听
MySQL 默认配置是 bind-address = 127.0.0.1,哪怕用户权限开了,服务也只监听回环地址,外部连接直接被操作系统丢弃,现象是 Connection refused(不是超时)。
- Linux 下配置文件通常在
/etc/mysql/mysql.conf.d/mysqld.cnf,Windows 在C:\ProgramData\MySQL\MySQL Server X.X\my.ini - 找到
[mysqld]段,把bind-address = 127.0.0.1改成bind-address = 0.0.0.0(允许所有 IPv4 地址)或删掉该行(部分版本默认监听全部) - 顺手加一行
skip-name-resolve,避免 DNS 反查拖慢连接,尤其在容器或云主机中 - 改完必须重启服务:
sudo systemctl restart mysql(Linux)或net stop mysql && net start mysql(Windows)
防火墙或安全组拦截 3306 端口
即使前两步都对了,Windows 防火墙或云服务器安全组仍可能拦住入站 TCP 3306 流量,导致连接超时而非拒绝。
- Windows 上运行管理员权限命令提示符,执行:
netsh advfirewall firewall add rule name="MySQL Port 3306" dir=in action=allow protocol=TCP localport=3306 - 阿里云/腾讯云等平台,进「安全组」规则页,添加入方向规则:协议类型 TCP,端口范围 3306,源 IP 填你自己的公网或内网 IP 段(别填
0.0.0.0/0) - 验证是否生效:在另一台机器上执行
telnet your-server-ip 3306,能连上说明端口通了;连不上先查防火墙,再查 MySQL 是否真在监听0.0.0.0:3306(netstat -tuln | grep :3306)
最常被忽略的是:MySQL 8.0 默认认证插件从 mysql_native_password 改为 caching_sha2_password,某些老客户端(如旧版 Navicat、PHP 7.2-)不支持,会报错 Client does not support authentication protocol。解决方法是在创建用户时显式指定插件:CREATE USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!';。











