ERROR 2003是连接被拒,需检查mysqld进程、3306端口监听(netstat)、防火墙及云安全组;ERROR 1045多因host不匹配、caching_sha2_password插件不兼容或密码过期;wait_timeout导致秒断需调高并配连接池;时区错乱应在JDBC URL中显式指定serverTimezone。

ERROR 2003:连接被拒绝,先查端口和进程
这不是密码或权限问题,而是连“门”都敲不开。典型报错是 ERROR 2003 (HY000): Can't connect to MySQL server on 'x.x.x.x' (111)(Connection refused),说明目标机器的 3306 端口根本没响应。
- 先确认
mysqld进程是否真在运行:systemctl status mysql(Linux)或任务管理器里看mysqld.exe(Windows) - 再检查监听地址:执行
netstat -tuln | grep :3306,如果只看到127.0.0.1:3306,说明 MySQL 没开远程监听;若完全没输出,就是服务压根没起来或端口被占 - 防火墙常背锅:临时关掉测试(
systemctl stop firewalld或 Windows 防火墙入站规则放行 TCP 3306);云服务器务必检查安全组——腾讯云/阿里云后台里不配,内网都连不上
ERROR 1045:Access denied,90% 是权限或认证插件惹的祸
输对密码还报 ERROR 1045 (28000): Access denied for user 'xxx'@'yyy'?别急着重置密码,先分清是“人不对”还是“锁坏了”。
- 用户 host 不匹配:MySQL 账号是
'user'@'localhost'和'user'@'%'完全是两个账号。Navicat 从本机连,可能走的是127.0.0.1(不是 localhost),而默认 root 只允许localhost。查授权:SELECT host,user FROM mysql.user WHERE user='root'; - caching_sha2_password 插件缺失:MySQL 8.0+ 默认用这个插件,但老版客户端(如某些 Navicat 版本、旧 jdbc 驱动)不认。报错含
caching_sha2_password Auth failed就是它。临时解法:ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 密码过期也会伪装成 1045:登录后执行 SQL 报
ERROR 1820,就得强制改密:ALTER USER 'xxx'@'%' IDENTIFIED BY 'newpass';
连接成功却秒断:wait_timeout 搞的鬼
应用刚连上能查数据,空闲几秒就断,日志里没明显报错?大概率是 MySQL 主动踢人了。
- 默认
wait_timeout是 28800 秒(8 小时),但很多环境实际设成 60–300 秒。查当前值:SHOW VARIABLES LIKE 'wait_timeout'; - 临时调高:
SET GLOBAL wait_timeout = 28800;;要永久生效,得在/etc/my.cnf的[mysqld]段加一行:wait_timeout = 28800 - 注意:改完只影响新连接,已有连接仍按旧值计时;Java 应用还得检查连接池配置(比如 HikariCP 的
connection-timeout和idle-timeout),别让池子自己先断了
时区错乱导致 JDBC 连接失败
Spring Boot 启动时报错连不上,错误里带 servertimezone=UTC 或时间解析异常?不是数据库挂了,是客户端和服务器时区对不上。
- 先看 MySQL 实际时区:
SELECT @@global.time_zone, @@session.time_zone;。如果返回SYSTEM,再查系统时区:date(Linux)或tzutil /g(Windows) - 推荐在 JDBC URL 里显式指定:
jdbc:mysql://host:3306/db?serverTimezone=Asia/Shanghai&characterEncoding=utf-8。比改 MySQL 全局时区更稳妥,避免影响其他应用 - 别信网上“
set global time_zone = '+08:00'一劳永逸”的说法——MySQL 重启后可能恢复 system,且部分容器环境改了也无效
最麻烦的其实是组合问题:比如云服务器开了安全组、MySQL 放了 % 用户、JDBC URL 也配了时区,结果发现 Navicat 用 SSH 隧道连,隧道端口转发错了……这种得一层层剥,别跳步。










