无法远程连接MySQL的三大原因及解决步骤:①修改my.ini/my.cnf中bind-address为0.0.0.0并关闭skip-networking,重启MySQL服务;②创建'username'@'%'用户并授权后执行FLUSH PRIVILEGES;③在系统防火墙及杀软中放行3306端口。

直接连不上,基本就卡在三件事上:MySQL 没监听外部地址、用户没开 % 主机权限、系统防火墙拦了 3306 端口。改完任意一项不重启服务或不刷权限,连接照样失败。
修改 my.ini 或 my.cnf 放开绑定地址
默认 XAMPP 的 MySQL 只绑 127.0.0.1,外部请求根本进不来。必须显式改成监听所有 IPv4 接口。
- Windows 路径:
%xampp%\mysql\bin\my.ini;Linux/macOS 路径:/opt/lampp/etc/my.cnf - 找到
[mysqld]段,在下面加或改这一行:bind-address = 0.0.0.0 - 如果存在
skip-networking = ON,必须改成OFF,否则 TCP 连接被强制禁用 - 改完必须通过 XAMPP 控制面板「Stop → Start」MySQL 服务,
FLUSH PRIVILEGES对这个配置无效
用 GRANT 创建或更新允许 % 连接的用户
'root'@'localhost' 和 'root'@'%' 是两个完全独立的账号,改前者不影响后者。别直接改 root 的 host,尤其暴露在局域网时风险高。
- 进 phpMyAdmin 或命令行,先
USE mysql; - 推荐新建专用账号(比如
'devuser'@'%'),执行:CREATE USER 'devuser'@'%' IDENTIFIED BY 'strong_password'; - 再授权:
GRANT ALL PRIVILEGES ON *.* TO 'devuser'@'%' WITH GRANT OPTION; - 最后必须执行:
FLUSH PRIVILEGES;—— 否则权限表不加载,白操作 - 不要删掉
'root'@'localhost',否则 phpMyAdmin 页面可能打不开
检查并放行系统防火墙的 3306 端口
MySQL 监听了 0.0.0.0:3306,不代表你能连上。Windows 防火墙、iptables、macOS 防火墙默认都拦入站 3306 流量。
- Windows:打开「高级安全 Windows 防火墙」→「入站规则」→「新建规则」→ 选「端口」→ TCP
3306→ 允许连接 → 作用域选「任何 IP」 - Linux(如 CentOS):
sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT,再运行service iptables save - macOS:系统设置 → 防火墙 → 防火墙选项 → 添加
mysqld或手动开放端口 - 国产杀软(360、腾讯电脑管家)常静默拦截数据库端口,需进其「网络防护」模块单独放行
验证是否真通了,别只看 Navicat 报错
Navicat 显示 “Connection refused” 或超时,不能直接断定是 MySQL 配置问题。得逐层确认。
- 本机命令行跑:
netstat -an | findstr :3306(Win)或ss -tlnp | grep :3306(Linux/macOS),看到0.0.0.0:3306或*:3306才算监听成功 - 从另一台机器执行:
telnet your_xampp_ip 3306,能建立空连接说明端口通、防火墙开了、MySQL 也起来了 - Navicat 连接时,主机填你的局域网 IP(如
192.168.1.100),别填localhost或127.0.0.1—— 它们走本地 socket,绕过 TCP 绑定逻辑 - 如果连的是公网 IP,还要确认路由器做了
3306端口转发,且 ISP 没封端口
最常被忽略的是:改完配置不重启 MySQL 服务,或者执行了 GRANT 却漏掉 FLUSH PRIVILEGES。这两步任缺其一,前面所有操作等于没做。


















