You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot应用无法连接MySQL数据库(控制台连接正常)

解决Spring Boot连接MySQL时的Access Denied错误

嘿,这个权限拒绝的问题我之前在项目里也踩过坑,结合你的配置和报错信息,咱们从几个最常见的点来排查:

首先先明确你的配置和报错内容:

你的application.properties配置:

spring.datasource.url=jdbc:mysql://my_host:3306/my_db
spring.datasource.username=my_user
spring.datasource.password=my_pass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

核心报错片段:

Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Access denied for u...

接下来是具体的排查和解决步骤:

  • 第一步:验证账号密码的正确性
    别光盯着配置文件看,用MySQL客户端手动连接试试:

    mysql -u my_user -p my_pass -h my_host -P 3306
    

    如果这一步就失败,那肯定是账号密码不对,先把这个基础问题解决。

  • 第二步:检查MySQL用户的主机权限
    MySQL的用户权限是和允许访问的主机绑定的,比如你创建的my_user可能只允许localhost(本地)访问,但你的Spring Boot应用是在另一台机器/容器里,用my_host访问就会被拒绝。
    登录MySQL的管理员账号,执行以下命令查看用户的主机权限:

    SELECT user, host FROM mysql.user WHERE user = 'my_user';
    

    如果结果里的hostlocalhost或者127.0.0.1,那需要给用户开放远程访问权限:

    -- 允许所有主机访问(生产环境建议指定具体IP更安全)
    GRANT ALL PRIVILEGES ON my_db.* TO 'my_user'@'%' IDENTIFIED BY 'my_pass';
    -- 刷新权限使配置生效
    FLUSH PRIVILEGES;
    
  • 第三步:匹配JDBC驱动和MySQL版本
    你用的com.mysql.jdbc.Driver是适配MySQL 5.x的旧驱动,如果你的MySQL是8.0及以上版本,必须换成新版驱动:

    1. driver-class-name改成com.mysql.cj.jdbc.Driver
    2. JDBC URL里必须加上时区参数,比如:
      spring.datasource.url=jdbc:mysql://my_host:3306/my_db?serverTimezone=UTC&useSSL=false
      

    useSSL=false是避免SSL连接的警告,生产环境可根据实际需求调整)

  • 第四步:确认数据库服务和端口可达性
    检查my_host的3306端口是否开放,比如用telnet测试:

    telnet my_host 3306
    

    如果连接失败,可能是数据库服务没启动,或者服务器防火墙挡住了3306端口,先把网络连通性搞定。

按照这个顺序排查,基本能解决绝大多数Access Denied的问题。

内容的提问来源于stack exchange,提问作者ccc

火山引擎 最新活动