10060错误本质是TCP连接建立失败,即SYN包未获响应,根本原因在于MySQL未监听3306端口(如服务未启动、skip-networking启用、bind-address=127.0.0.1)、防火墙/安全组未放行3306端口,或Navicat中Host填写错误IP;需先用telnet或netstat验证端口可达性与监听状态。

10060 错误本质是 TCP 连接在建立阶段就失败了——不是认证失败,也不是权限拒绝,而是压根没连上服务器。它不关心用户名密码对不对,只说明 Navicat 发出的 SYN 包没收到响应。
netstat 看不到 3306 LISTEN 就别往下查了
MySQL 必须主动监听 3306(或你指定的端口),否则任何远程连接请求都会被内核直接丢弃。常见原因包括:
-
mysqld进程根本没运行:用systemctl status mysqld或ps aux | grep mysqld确认 - 配置文件里写了
skip-networking:检查/etc/my.cnf或/etc/mysql/my.cnf,删掉或注释该行 -
bind-address被设成127.0.0.1:改成0.0.0.0或注释掉,再systemctl restart mysqld - Docker 容器没暴露端口:启动时漏了
-p 3306:3306,或用了--network=host但宿主机 MySQL 没启
验证命令:netstat -tuln | grep :3306。输出里必须有 LISTEN,且 Local Address 不是 127.0.0.1:3306(除非你只打算本机连)。
iptables / firewalld 放行 3306 是硬性前提
即使 MySQL 监听了 0.0.0.0:3306,防火墙也会在数据包到达 mysqld 前把它 DROP 掉。别信“我关了防火墙”这种说法,得实锤:
- CentOS 7+(firewalld):
firewall-cmd --list-ports看有没有3306/tcp;没有就执行firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload - 旧版 iptables:
iptables -L INPUT -n | grep 3306,若无输出或显示REJECT/DROP,加规则:iptables -I INPUT -p tcp --dport 3306 -j ACCEPT,再service iptables save - 云服务器(阿里云/腾讯云):安全组必须手动放行 3306 入方向,控制台操作,和本地防火墙无关
GRANT 语句执行后 host 字段必须是 % 或具体 IP
用户权限表里 host 列决定谁能连,它和网络层的连通性完全无关。常见坑:
- 执行
GRANT ... TO 'root'@'%'后忘了FLUSH PRIVILEGES,权限不生效 - 误以为
'root'@'localhost'能代理远程连接——不能,localhost在 MySQL 里特指 socket 连接,和 TCP 无关 - 用
UPDATE user SET host='%' WHERE user='root'直接改表,但没FLUSH PRIVILEGES,或者改错数据库(必须在mysql库下操作) - MySQL 8.0+ 默认认证插件是
caching_sha2_password,Navicat 旧版本不兼容,需显式指定:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpass';
查证命令:SELECT host, user, plugin FROM mysql.user WHERE user = 'root';
Navicat 连接参数里 Host 写错 IP 是高频低级错误
很多人在虚拟机或 Docker 场景下混淆了“谁的 IP”:
- 虚拟机中跑 MySQL → Navicat 的 Host 填虚拟机的桥接/仅主机网卡 IP(如
192.168.56.101),不是127.0.0.1(那是 Navicat 自己本机) - Docker 容器中跑 MySQL → Host 填宿主机 IP(容器用
host.docker.internal或172.17.0.1通常无效),且确保-p 3306:3306已映射 - 云服务器 MySQL → Host 填公网 IP,不是内网 IP;同时确认云平台安全组、服务器防火墙、MySQL 配置三者都允许该 IP
最简单的交叉验证:在 Navicat 所在机器上执行 telnet your-mysql-ip 3306。如果连不上,10060 就必然发生;如果能通,问题才可能出在权限或认证环节。
真正容易被忽略的是:MySQL 的 bind-address 和防火墙策略必须同时满足,缺一不可;而 GRANT 语句里的 @'xxx' 只影响登录后的权限校验,对 10060 错误毫无影响——它发生在三次握手完成之后。


















