mysql连接失败分四类:服务未启动或bind_address配置错误导致connection refused;用户权限三元组不匹配、密码过期或认证插件不兼容引发access denied;网络链路不通或安全组未放行3306端口造成超时;mysql 8.0+默认强制ssl导致ssl connection error。

MySQL 连接失败不是单一问题,而是四类底层原因的集合:服务没起来、权限不匹配、网络不通、SSL 或认证插件不兼容。先确认报错类型,再对症操作,别一上来就重置密码或改配置。
ERROR 2003:Connection refused 怎么查
这个错误说明连“门”都敲不开,压根没通到 MySQL 进程。
- 先看服务是否在跑:
systemctl status mysql(Ubuntu/Debian)或systemctl status mysqld(CentOS/RHEL),状态不是active (running)就得先sudo systemctl start mysql - 再看端口监听情况:
ss -tlnp | grep :3306。如果只显示127.0.0.1:3306,说明 MySQL 没开远程;如果完全没输出,要么服务没起来,要么端口被占(lsof -i :3306查) -
bind_address配置常是罪魁祸首。打开/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf,找到bind_address = 127.0.0.1—— 要允许远程,改成0.0.0.0或具体 IP,改完必须sudo systemctl restart mysql - 云服务器(阿里云、腾讯云等)务必检查安全组:3306 端口 TCP 协议要放行,源 IP 范围别写成
127.0.0.1
ERROR 1045:Access denied for user 怎么定位
输对密码还被拒,大概率是 'user'@'host' 三元组不匹配,或者认证插件不认。
- 登录 MySQL 后执行:
SELECT User, Host FROM mysql.user WHERE User = 'your_user';。重点看返回的Host值是不是你连接时用的地址(比如 Navicat 填127.0.0.1,但账号只有'root'@'localhost',就不匹配) -
localhost≠127.0.0.1:前者走 Unix socket,后者走 TCP。想让同一用户两种方式都能连,得分别授权:CREATE USER 'user'@'localhost' IDENTIFIED BY 'pwd';和CREATE USER 'user'@'%' IDENTIFIED BY 'pwd'; - MySQL 8.0+ 默认用
caching_sha2_password插件,老 JDBC 驱动或旧版客户端会报 “Authentication plugin 'caching_sha2_password' cannot be loaded”。临时解法:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 密码过期也会伪装成 1045:
SELECT User, Password_expired FROM mysql.user;,若为Y,执行ALTER USER 'user'@'%' PASSWORD EXPIRE NEVER;
超时类错误(Can't connect / Lost connection)怎么调
连接能建上但秒断,或查询中途断开,基本是 wait_timeout 或网络中间件踢人了。
- 查当前值:
SHOW VARIABLES LIKE 'wait_timeout';。很多生产环境设成 60–300 秒,不够用 - 临时调高:
SET GLOBAL wait_timeout = 28800;(8 小时)。注意:只影响新连接,已有连接仍按旧值计时 - 永久生效要改配置文件,在
[mysqld]段加:wait_timeout = 28800和interactive_timeout = 28800,然后重启 - 应用层也得配合:Spring Boot 的 HikariCP 要开启
connection-test-query或validation-timeout,避免拿失效连接干活 - 防火墙/NAT 设备常有空闲连接自动断开机制(比如 300 秒),比 MySQL 的
wait_timeout更激进,得同步调大或启用心跳包
JDBC/客户端连接串里容易漏的关键参数
URL 写错一个参数,可能连上但行为异常,比如时区错乱、字符集崩坏、SSL 握手失败。
- 时区必须显式指定:
?serverTimezone=Asia/Shanghai,否则 Java 读写时间字段会偏移 - 字符集建议补全:
?characterEncoding=utf8mb4&useUnicode=true,避免 emoji 存不进去 - 云数据库默认强制 SSL?加
&sslMode=DISABLED(MySQL Connector/J 8.0+)或&useSSL=false(旧版),否则报SSL connection error - Spring Boot 的
application.yml里 URL 缩进错、冒号后少空格、单引号没闭合,都会导致Cannot load driver class或静默失败
真正麻烦的不是单点故障,而是多层叠加:比如 bind_address 写错 + 安全组没开 + JDBC URL 漏了 serverTimezone —— 你会反复看到不同报错,误以为是新问题。每次只改一个变量,验证后再动下一个。











