MySQL远程连接被拒绝需按顺序排查:先确认bind-address是否监听外部地址(如0.0.0.0),再检查用户权限(user@host匹配及FLUSH PRIVILEGES),然后验证防火墙/安全组是否放行3306端口,最后排除SSL强制或认证插件兼容性问题。
默认情况下,mysqld 只绑定 127.0.0.1,即仅接受本地连接。远程连接失败的第一怀疑对象就是这个配置。
my.cnf(通常在 /etc/mysql/my.cnf 或 /etc/my.cnf)中是否有 bind-address = 127.0.0.1
bind-address = 0.0.0.0(监听所有 IPv4 接口)或指定具体内网 IP(如 192.168.1.100)sudo systemctl restart mysql(Ubuntu/Debian)或 sudo systemctl restart mysqld(CentOS/RHEL)sudo ss -tlnp | grep :3306,输出中应含 *:3306 或 192.168.1.100:3306,而非仅 127.0.0.1:3306
即使端口通了,MySQL 仍会按 user@host 匹配账户。本地创建的用户(如 'root'@'localhost')默认不能从远程登录。
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;,否则权限不生效'myuser'@'192.168.1.%' 比 'myuser'@'%' 更安全,限制可连接的子网段root 开放远程——生产环境应单独建受限用户Linux 本机防火墙、宿主机防火墙、云厂商安全组(如阿里云、腾讯云)三者都可能拦掉入向连接。
ufw:sudo ufw status verbose,若启用且未放行 3306,则执行 sudo ufw allow 3306
iptables:sudo iptables -L INPUT -n | grep 3306,无匹配需添加规则203.0.113.5/32),而非全放开 0.0.0.0/0
telnet your-server-ip 3306 或 nc -zv your-server-ip 3306 在客户端测试端口连通性,比直接连 MySQL 更早暴露网络层问题
协议不兼容引发静默失败某些 MySQL 版本(如 8.0+ 默认安装)或配置启用了 require_secure_transport=ON,此时非 SSL 连接会被直接拒绝,客户端可能只报 “Connection refused” 或超时,无明确提示。
SHOW VARIABLES LIKE 'require_secure_transport';,若值为
ON,且你没配 SSL,临时关闭:SET PERSIST require_secure_transport = OFF;
mysql -h your-ip -u myuser -p --ssl-mode=DISABLED
--ssl-mode=REQUIRED 连接caching_sha2_password,老版本客户端(如 MySQL 5.7 客户端)可能无法握手;可为用户切换回 mysql_native_password:ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass';
真正卡住的地方往往不是单一原因:可能是 bind-address 改了但忘了重启服务,也可能是权限加了却漏了 FLUSH,或是安全组开了但本地 iptables 没放行。建议按「网络层 → MySQL 配置层 → 权限层 → 协议层」顺序逐段验证,每步用对应工具确认结果,而不是反复试连。