MySQL 网络不通需分层排查:先确认服务是否运行并监听 0.0.0.0:3306,再检查防火墙及云安全组是否放行 3306 端口,接着用 ping 和 telnet 验证网络连通性,最后核查用户权限与认证插件兼容性。

MySQL 环境搭建时网络不通,核心要分清是服务没起来、防火墙 拦了、还是客户端连错了地址和 端口。先确认 MySQL 服务本身是否正常监听,再逐层检查网络链路。
确认 MySQL 服务是否运行并正确监听
很多“连不上”其实是 MySQL 压根没启动,或只监听了本地回环地址(127.0.0.1),不响应外部请求。
- 登录服务器,执行 systemctl status mysqld(或 service mysql status)看服务状态
- 用 netstat -tuln | grep :3306 或 ss -tuln | grep :3306 查看 3306 端口是否在监听
- 若只看到 127.0.0.1:3306,说明 MySQL 默认绑定本地,需修改配置文件中 bind-address = 0.0.0.0(或注释掉该行),然后重启服务
- 检查 skip-networking 是否被启用(配置中存在且为 ON 会彻底禁用 TCP 连接,必须关闭)
检查服务器防火墙是否放行 3306 端口
即使 MySQL 监听了 0.0.0.0,Linux 防火墙(iptables/firewalld)或云厂商安全组也可能拦截连接。
- CentOS 7+/RHEL:运行 firewall-cmd –list-ports,若无 3306/tcp,执行 firewall-cmd –add-port=3306/tcp –permanent && firewall-cmd –reload
- Ubuntu/Debian(ufw):运行 ufw status,若未启用可临时关掉测试:ufw disable;若启用则加规则:ufw allow 3306
- 阿里云 / 腾讯 云 /AWS 等:务必检查控制台里的“安全组规则”,添加入方向规则:端口 3306,协议 TCP,源 IP 可设为 0.0.0.0/0(测试用)或指定客户端 IP 段
验证从客户端能否到达服务器 IP 和端口
别急着用 mysql 命令连,先用基础网络 工具 定位卡在哪一层。
- 客户端执行 ping 服务器 IP:不通说明路由 / 网络策略问题(如跨 VPC 未打通、本地网络限制)
- 执行 telnet 服务器 IP 3306 或 nc -zv 服务器 IP 3306:能连上表示网络和端口可达;连不上但 ping 通,大概率是防火墙或 MySQL 未监听
- 若使用域名连接,加一步 nslookup 域名 或 dig 域名,确认 DNS 解析正确,避免连错机器
检查 MySQL 用户权限与认证方式
网络通了但提示“Access denied”,常因用户没授权远程访问或密码插件不兼容。
- 登录 MySQL 后执行:SELECT host, user, plugin FROM mysql.user; 确认目标用户 host 不是 localhost(应为 ’%’ 或具体 IP)
- 执行:GRANT ALL ON *.* TO ‘youruser’@’%’ IDENTIFIED BY ‘password‘; FLUSH PRIVILEGES;
- 若用 MySQL 8.0+,默认 auth_plugin 是 caching_sha2_password,部分旧客户端不支持,可改为:ALTER USER ‘youruser’@’%’ IDENTIFIED WITH mysql_native_password BY ‘password’;
排查网络问题本质是分层验证:服务进程 → 端口监听 → 本机防火墙 → 网络中间设备(路由器、云安全组)→ 客户端路由与工具。每步用最小命令验证,比反复重装快得多。