MySQL远程连接被拒绝需按顺序排查:先确认bind-address是否监听外部地址(如0.0.0.0),再检查用户权限(user@host匹配及FLUSH PRIVILEGES),然后验证防火墙/安全组是否放行3306端口,最后排除SSL强制或认证插件兼容性问题。

MySQL 远程连接被拒绝:先确认是否监听了外部地址
默认情况下,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
用户权限不足导致“Access denied”错误
即使端口通了,MySQL 仍会按 user@host 匹配账户。本地创建的用户(如 'root'@'localhost')默认不能从远程登录。
- 登录 MySQL 后执行:
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';
- 授权(示例为全库):
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
- 关键一步:运行
FLUSH PRIVILEGES;,否则权限不生效 - 注意:
'myuser'@'192.168.1.%'比'myuser'@'%'更安全,限制可连接的子网段 - 避免用
root开放远程——生产环境应单独建受限用户
防火墙或云平台安全组拦截 3306 端口
Linux 本机防火墙、宿主机防火墙、云厂商安全组(如阿里云、腾讯云)三者都可能拦掉入向连接。
- 检查本地
ufw:sudo ufw status verbose,若启用且未放行 3306,则执行sudo ufw allow 3306 - 检查
iptables:sudo iptables -L INPUT -n | grep 3306,无匹配需添加规则 -
云服务器务必登录控制台,检查「安全组」是否允许 TCP 3306 入方向,源 IP 建议设为具体客户端 IP 或最小化 CIDR(如
203.0.113.5/32),而非全放开0.0.0.0/0 - 使用
telnet your-server-ip 3306或nc -zv your-server-ip 3306在客户端测试端口连通性,比直接连 MySQL 更早暴露网络层问题
SSL 强制或连接协议不兼容引发静默失败
某些 MySQL 版本(如 8.0+ 默认安装)或配置启用了 require_secure_transport=ON,此时非 SSL 连接会被直接拒绝,客户端可能只报 “Connection refused” 或超时,无明确提示。
- 检查变量:
SHOW VARIABLES LIKE 'require_secure_transport';
,若值为ON,且你没配 SSL,临时关闭:SET PERSIST require_secure_transport = OFF;
- 客户端连接时显式禁用 SSL(仅调试用):
mysql -h your-ip -u myuser -p --ssl-mode=DISABLED - 更稳妥做法是生成并部署 SSL 证书,然后用
--ssl-mode=REQUIRED连接 - 注意 MySQL 8.0 默认认证插件是
caching_sha2_password,老版本客户端(如 MySQL 5.7 客户端)可能无法握手;可为用户切换回mysql_native_password:ALTER USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass';
真正卡住的地方往往不是单一原因:可能是 bind-address 改了但忘了重启服务,也可能是权限加了却漏了 FLUSH,或是安全组开了但本地 iptables 没放行。建议按「网络层 → MySQL 配置层 → 权限层 → 协议层」顺序逐段验证,每步用对应工具确认结果,而不是反复试连。










