💜 想真正擅长编程? 从一门课程开始,100% 免费

3-3、数据库连接失败4个核心排查点

数据库连接不上是新人高频问题,报错信息五花八门但根因就那几个。这节给你4个核心排查点,按顺序查,准能找到问题。


一、常见报错信息

SpringBoot报错

TEXT
Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException:
Communications link failure

The last packet sent successfully to the server was 0 ms ago.

HikariCP报错

TEXT
HikariPool-1 - Failed to obtain connection from database
Caused by: CommunicationsException: Communications link failure

MyBatis报错

TEXT
org.apache.ibatis.exceptions.PersistenceException:
Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException

IDEA数据库工具报错

TEXT
Connection refused: connect

不管哪种报错,本质都是:程序连不上MySQL。按以下4个点排查。


二、排查点1:MySQL服务是否启动

这是最常见的原因,别笑,很多新人忘了启动MySQL。

Windows检查

Shell
# 查看MySQL服务状态
net start | findstr MySQL

# 或在服务列表查看
sc query MySQL80

如果输出包含RUNNING,说明服务在运行。

如果没输出或显示STOPPED:

Shell
# 启动MySQL服务
net start MySQL80

# 或者在"服务"管理器里启动
# Win+R → services.msc → 找到MySQL → 右键启动

Docker检查

Shell
# 查看MySQL容器是否运行
docker ps | findstr mysql

# 如果没运行,启动它
docker start mysql-container

验证能否连上

Shell
# 命令行连接
mysql -u root -p

能进去说明MySQL服务正常。


三、排查点2:连接信息是否正确

配置文件里的URL、用户名、密码、数据库名,任何一个错了都连不上。

检查配置文件

YAML
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/my_project?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&allowPublicKeyRetrieval=true
    username: root
    password: Root@123456
    driver-class-name: com.mysql.cj.jdbc.Driver

逐项核对

配置项 检查内容
host 127.0.0.1或localhost(本地)
port 3306(如果你改过端口,确认一致)
数据库名 URL里/3306/后面那个,确认数据库已创建
username root或其他用户名
password 密码对不对,注意大小写
driver-class-name MySQL 8.x用com.mysql.cj.jdbc.Driver,5.x用com.mysql.jdbc.Driver

常见错误

错误1:数据库名写错了

URL里写的是my_project,但数据库实际叫myproject。

SQL
-- 检查数据库是否存在
SHOW DATABASES;

错误2:密码错了

密码大小写敏感,Root@123456和root@123456不一样。

重置密码(参考第1章第4节)。

错误3:driver-class-name版本不对

TEXT
Loading class `com.mysql.jdbc.Driver'. This is deprecated.

MySQL 8.x要用新的驱动类名:

YAML
driver-class-name: com.mysql.cj.jdbc.Driver

错误4:URL参数缺失

MySQL 8.x连接时可能需要这些参数:

TEXT
useSSL=false                        # 不用SSL
serverTimezone=Asia/Shanghai        # 时区
characterEncoding=utf-8             # 编码
allowPublicKeyRetrieval=true        # 允许公钥检索

四、排查点3:网络和防火墙

1. 检查端口是否监听

Shell
# 检查3306端口
netstat -ano | findstr 3306

如果有输出包含LISTENING,说明MySQL在监听这个端口。

如果没有输出:

  • MySQL服务没启动
  • MySQL配置了只监听特定IP

2. 检查bind-address

MySQL配置文件my.ini:

ini
[mysqld]
# 如果这行存在且是127.0.0.1,只能本地连
bind-address = 127.0.0.1

# 如果要远程连接,改成
bind-address = 0.0.0.0

改完重启MySQL。

3. 检查防火墙

Windows防火墙:

Shell
# 检查3306是否被防火墙阻止
netsh advfirewall firewall show rule name=all | findstr 3306

如果没有放行规则:

Shell
# 添加放行规则
netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306

4. 远程连接额外检查

如果是远程连数据库:

  • 确认远程MySQL的host不是127.0.0.1
  • 确认用户有远程访问权限:
SQL
-- 查看用户允许的host
SELECT user, host FROM mysql.user WHERE user = 'root';

-- 如果只有localhost,创建远程用户
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
  • 确认VPN是否连接(有些公司数据库在内网,需要VPN)

五、排查点4:认证方式兼容性

MySQL 8.0认证方式问题

MySQL 8.0默认认证插件是caching_sha2_password,有些旧客户端和驱动不支持。

报错:

TEXT
Public Key Retrieval is not allowed

或:

TEXT
Client does not support authentication protocol requested by server

解决方法1:URL加参数

YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?allowPublicKeyRetrieval=true&useSSL=false

解决方法2:改认证方式

SQL
-- 登录MySQL
mysql -u root -p

-- 改成旧版认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

解决方法3:改MySQL配置

my.ini:

ini
[mysqld]
default_authentication_plugin=mysql_native_password

改完重启MySQL。


六、其他常见问题

问题1:连接超时

TEXT
Caused by: java.net.SocketTimeoutException: connect timed out

原因: 网络不通或防火墙阻止。

解决:

  1. 确认MySQL服务在运行
  2. 确认端口没有被防火墙拦截
  3. 如果是远程连接,确认网络可达:ping 数据库IP
  4. 增加超时时间:
YAML
spring:
  datasource:
    hikari:
      connection-timeout: 60000  # 60秒

问题2:连接数太多

TEXT
Caused by: java.sql.SQLTransientConnectionException:
HikariPool-1 - Connection is not available, request timed out after 30000ms

原因: 连接池满了,获取不到连接。

排查:

SQL
-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';

-- 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';

-- 查看活跃连接
SHOW PROCESSLIST;

解决:

  1. 关掉不用的数据库连接(IDEA的Database面板、Navicat等)
  2. 增大MySQL最大连接数:
SQL
SET GLOBAL max_connections = 200;
  1. 增大连接池大小:
YAML
spring:
  datasource:
    hikari:
      maximum-pool-size: 20

问题3:SSL报错

TEXT
Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message

解决: URL加useSSL=false:

YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false

问题4:时区报错

TEXT
Caused by: java.sql.SQLException:
The server time zone value 'xxx' is unrecognized

解决: URL加时区参数:

YAML
url: jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=Asia/Shanghai

或者修改MySQL时区:

SQL
SET GLOBAL time_zone = '+8:00';
SET SESSION time_zone = '+8:00';

问题5:数据库不存在

TEXT
Caused by: java.sql.SQLSyntaxErrorException:
Unknown database 'my_project'

解决: 创建数据库:

SQL
CREATE DATABASE my_project DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

问题6:权限不足

TEXT
Caused by: java.sql.SQLException:
Access denied for user 'root'@'localhost' to database 'my_project'

解决: 给用户授权:

SQL
GRANT ALL PRIVILEGES ON my_project.* TO 'root'@'%';
FLUSH PRIVILEGES;

七、快速排查流程图

TEXT
连接失败
  │
  ├─ MySQL服务启动了吗? ── No → 启动服务
  │                Yes ↓
  ├─ 命令行能连上吗? ── No → 服务有问题,看MySQL日志
  │              Yes ↓
  ├─ 配置文件信息对吗? ── No → 改配置
  │                 Yes ↓
  ├─ URL参数对吗? ── No → 加参数(useSSL/timezone/allowPublicKeyRetrieval)
  │            Yes ↓
  ├─ 认证方式兼容吗? ── No → 改mysql_native_password
  │               Yes ↓
  ├─ 端口被占用了吗? ── Yes → 换端口或杀进程
  │               No ↓
  ├─ 防火墙阻止了吗? ── Yes → 添加放行规则
  │               No ↓
  └─ 还是连不上 → 看MySQL错误日志

查看MySQL错误日志

Shell
# 查看日志位置
mysql -u root -p -e "SHOW VARIABLES LIKE 'log_error'"

# 查看日志文件
# Windows默认位置
# C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err

或者:

Shell
# 查看错误日志
mysql -u root -p -e "SHOW ERRORS;"

小结

排查点 检查内容 命令
服务是否启动 MySQL进程是否在 `net start
连接信息 URL/用户名/密码/数据库名 对照配置文件
网络防火墙 端口是否监听/防火墙是否放行 `netstat -ano
认证方式 MySQL 8.x认证兼容性 ALTER USER ... mysql_native_password

4个排查点走一遍,95%的数据库连接问题都能解决。