“找不到远程主机”本质是tcp连接在三次握手前被阻断,主因是mysql仅监听127.0.0.1或3306端口被防火墙/安全组拦截;需将bind-address改为0.0.0.0、放行3306端口并重启服务。
navicat 连接 mysql 时提示“找不到远程主机”,本质不是 dns 解析失败,而是 tcp 连接在三次握手前就被阻断了——根本没走到认证阶段。直接原因通常是网络层或服务绑定配置出了问题。
netstat 显示 3306 只监听 127.0.0.1
这是最常见也最容易被忽略的硬性限制。MySQL 默认启动时只绑定本地回环地址,即使你开了用户权限、关了防火墙,外部请求连 SYN 包都发不过去。
- Linux 下执行
netstat -tlnp | grep :3306,如果输出中Local Address是127.0.0.1:3306或::1:3306,就确认是这个问题 - 修改
/etc/mysql/my.cnf(或/etc/my.cnf)中的bind-address配置项:把bind-address = 127.0.0.1改成bind-address = 0.0.0.0 - 注意:有些 MySQL 8.0+ 版本默认没有显式写
bind-address,需手动添加这一行;Docker 容器内运行时,还要检查docker run是否加了-p 3306:3306且宿主机端口映射正确 - 改完必须重启服务:
sudo systemctl restart mysql(或mysqld),否则配置不生效
防火墙或云厂商安全组拦截 3306 端口
即使 MySQL 绑定了 0.0.0.0,若 3306 端口未放行,客户端发起的 connect() 调用会直接超时返回 Connection refused 或等价错误,Navicat 就显示“找不到远程主机”。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- Linux 本地防火墙检查:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS/RHEL),确认 3306/tcp 在允许列表里 - 云服务器(阿里云/腾讯云/AWS)必须额外配置安全组规则:入方向放开 TCP 3306,源 IP 可设为
0.0.0.0/0(测试用)或具体客户端 IP - Windows Server 上还要检查 Windows Defender 防火墙的入站规则,不能只关系统防火墙而忽略它
MySQL 用户 host 字段不是 % 或具体 IP
这个错误其实不会导致“找不到远程主机”,但常被误判。真正表现是连接成功后立刻报 Access denied for user。如果你已确认能 telnet 通 3306,但 Navicat 卡在“正在连接…”几秒后失败,才需要查这个。
- 登录 MySQL 执行:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 如果对应记录的
Host是localhost,说明该用户只允许本地 socket 连接;需改为%或客户端真实 IP(如192.168.1.100) - 执行授权语句时注意语法:
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';,然后必须跟FLUSH PRIVILEGES; - MySQL 8.0+ 用户密码认证插件可能不兼容,补一句:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
真正卡在“找不到远程主机”的环节,90% 是前两个问题:MySQL 没监听外网地址,或 3306 端口被拦在半路。先跑 telnet your-server-ip 3306,通了再查权限,不通就别碰 SQL —— 否则所有 grant 和 flush 都白做。










