mysql连接被拒绝需分三阶段排查:先用telnet或nc验证网络层连通性;再检查服务状态、端口监听(netstat)、bind-address、防火墙及docker映射;最后确认用户host匹配、权限刷新、认证插件兼容性、ssl配置及超时参数。

MySQL 连接被拒绝:先看 Can't connect to MySQL server 是本地还是远程
本地用 localhost 或 127.0.0.1 连不上,大概率是服务没起来或监听配置不对;远程用真实 IP 连不上,90% 涉及网络通路、防火墙、bind 地址三者之一。
快速验证:systemctl status mysql(或 mysqld)确认进程在运行;netstat -tlnp | grep :3306 看端口是否监听 —— 如果只显示 127.0.0.1:3306,说明默认绑定了本地回环,远程无法访问。
-
my.cnf中检查bind-address:设为0.0.0.0才允许所有 IP 连入(生产环境慎用,应配合防火墙限制) - Linux 防火墙需放行 3306:如
ufw allow 3306或firewall-cmd --permanent --add-port=3306/tcp - Docker 容器要加
-p 3306:3306并确认容器内bind-address未锁死为127.0.0.1
能连上 TCP,但提示 Access denied for user:权限表没刷或 host 匹配失败
MySQL 认证不仅看用户名密码,更关键的是 user@host 这个完整标识。比如创建了 'app'@'localhost',却用 mysql -h 192.168.1.100 -u app 去连,就会因 host 不匹配而拒绝。
查当前生效的用户记录:SELECT User, Host FROM mysql.user; 注意 Host 字段是否包含通配符(如 %)或具体 IP;执行完 CREATE USER 或 GRANT 后,必须跟一句 FLUSH PRIVILEGES;,否则权限不生效。
- 远程连接尽量避免用
'user'@'%',优先指定子网如'user'@'192.168.1.%' - MySQL 8.0+ 默认认证插件是
caching_sha2_password,旧客户端可能不兼容,可建用户时显式指定:CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 如果用 Docker 或云数据库(如阿里云 RDS),控制台看到的“白名单”是额外一层网络 ACL,和 MySQL 权限表无关,得单独配
连接成功但很快断开:wait_timeout 和 max_allowed_packet 影响长连接稳定性
不是连不上,而是连上几秒后自动断开,常见于应用空闲后发首条查询时触发 Lost connection to MySQL server during query —— 很可能是服务端 wait_timeout 太小,连接被主动 Kill。
查当前值:SHOW VARIABLES LIKE 'wait_timeout';(单位秒,默认 28800 即 8 小时);临时调高:SET GLOBAL wait_timeout = 28800;。但更稳妥的做法是在应用层配置连接池的 idle timeout,确保小于服务端值。
- 大字段(如 JSON、BLOB)插入失败报
Packets larger than max_allowed_packet,需同步调大客户端和服务端的max_allowed_packet - 某些云厂商(如腾讯云 CDB)会限制最大连接数和单连接内存,超限也会静默断连,得看监控指标而非错误日志
-
interactive_timeout控制交互式连接(如命令行登录)的空闲超时,和wait_timeout分开设置
SSL 强制开启导致连接失败:检查 require_secure_transport 和客户端配置
MySQL 5.7+ 支持强制 SSL 连接,若服务端启用了 require_secure_transport = ON,而客户端没提供证书或没加 --ssl-mode=REQUIRED 参数,就会直接拒绝连接,错误信息通常是 SSL connection error 或空响应。
查是否启用:SELECT @@require_secure_transport;;临时关闭:SET GLOBAL require_secure_transport = OFF;(重启失效)。生产环境建议配好证书,而不是关掉它。
- 使用
mysql命令行时,加--ssl-mode=DISABLED可绕过(仅测试用) - Java 应用连接 URL 要补
?useSSL=true&requireSSL=true,并配置 truststore - 云数据库控制台通常提供一键下载 CA 证书,别手动生成自签名证书再硬塞进客户端
telnet ip 3306 或 nc -zv ip 3306 验证,后者才轮到看错误码和权限表。










