MySQL远程连接失败主因是bind-address默认为127.0.0.1、用户主机限制(如'@localhost')、防火墙拦截3306端口;需分别修改配置监听0.0.0.0、创建'@%'或指定IP用户、开放防火墙/安全组规则。

MySQL 默认绑定 localhost 导致远程无法连接
MySQL 8.0+ 默认配置 bind-address = 127.0.0.1,只监听本地回环接口,外部主机发来的 TCP 连接请求会被直接拒绝。这不是权限问题,而是网络层根本没暴露端口。
- 检查当前绑定地址:
grep "bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
- 改为监听所有 IPv4 接口:
bind-address = 0.0.0.0(或指定内网 IP,如192.168.1.100) - 改完必须重启服务:
sudo systemctl restart mysql - 验证是否生效:
ss -tlnp | grep :3306—— 输出中应含0.0.0.0:3306或对应 IP,而非仅127.0.0.1:3306
用户账号未授权远程主机访问
即使 MySQL 监听了外部 IP,CREATE USER 'u'@'localhost' 这类账号仍无法从其他机器登录。MySQL 的用户是「用户名 + 主机名」联合唯一标识,'u'@'%' 和 'u'@'localhost' 是两个完全不同的账户。
- 确认现有用户允许的 host:
SELECT User, Host FROM mysql.user;
- 若需允许任意 IP(测试用):
CREATE USER 'dev'@'%' IDENTIFIED BY 'pass123'; GRANT ALL ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;
- 生产环境建议限定范围:
'dev'@'192.168.1.%'或'dev'@'10.0.2.5' - 注意:MySQL 8.0 默认认证插件是
caching_sha2_password,某些旧客户端不兼容,可显式指定:CREATE USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY 'pass123';
防火墙拦截 3306 端口
Linux 防火墙(ufw 或 firewalld)或云服务器安全组规则会默认丢弃非白名单端口的入站流量,MySQL 连接超时(而非拒绝)往往就是这个原因。
- Ubuntu/Debian(ufw):
sudo ufw allow 3306,再sudo ufw status确认规则已生效 - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload
-
阿里云/腾讯云等平台:必须在控制台「安全组」中手动添加入方向规则,协议类型选
TCP,端口范围填3306,源 IP 建议限制为具体开发机 IP,而非0.0.0.0/0
连接时提示 “Host … is not allowed to connect”
该错误明确指向权限层面,但实际可能由多个环节叠加导致。不要只盯着 GRANT 语句,先排除网络和防火墙干扰。
- 用
mysql -h 127.0.0.1 -u dev -p在本机测试 —— 若成功,说明 MySQL 服务正常,问题出在远程访问路径 - 用
telnet your-server-ip 3306从客户端测试连通性 —— 若连接失败,99% 是防火墙或bind-address配置问题 - 确保客户端连接命令中指定的是服务器真实 IP,不是
localhost(它会走 socket 而非 TCP) - MySQL 8.0 启用
skip-name-resolve可避免 DNS 反查失败导致的延迟或拒绝,建议在[mysqld]段添加该配置并重启
网络连通性是分层验证的:物理可达 → 端口开放 → MySQL 监听 → 账号授权。任何一层卡住都会表现为“连不上”,但错误现象和排查手段完全不同。尤其注意 bind-address 和防火墙这两处,它们比账号权限更常被忽略。










