后端配置数据库使用环境变量,宝塔部署报错Access denied for user ‘root‘@‘localhost? 让我来看看~
这里来记录一个这段时间部署了两个项目都遇到的一个问题:宝塔面板部署SpringBoot应用,环境变量配置导致数据库连接失败问题解决!
1.问题描述
在使用宝塔面板部署SpringBoot应用时,配置文件中使用了环境变量来存储数据库连接信息
```yaml
spring:
datasource:
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD:123456}
```
应用启动时报错:
```
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
```
2.错误信息解读
Access denied for user 'root'@'localhost' (using password: YES)
这个错误信息告诉我们:
- 用户:`root`
- 主机: `localhost`
- 使用密码:是(`using password: YES`)
- 结果:访问被拒绝(`Access denied`)
这说明:
(1)应用确实尝试使用 `root` 用户连接数据库
(2)应用确实提供了密码(不是空密码)
(4)但是密码不正确,或者用户权限有问题
3.问题原因分析
Spring Boot支持通过 `${变量名:默认值}` 的语法从环境变量中读取配置。当环境变量存在时,使用环境变量的值;不存在时,使用默认值。
那么为什么会出现 `Access denied` 错误呢?核心原因就是环境变量没有正确传递给Java进程。
当出现 `Access denied for user 'root'@'localhost' (using password: YES)` 错误时,通常有以下几种情况:
(1) 情况一:环境变量未设置【最常见】
环境变量 `DB_USERNAME` 和 `DB_PASSWORD` 没有被设置
结果就会导致Spring Boot使用对应的默认值 (比如本地配置文件设置的是`root` 和 `123456`那么就会使用到这个默认的值,而不是对应环境变量设置的用户密码)
所以问题就来了,如果MySQL的root密码不是 `123456`,就会导致认证失败
(2)情况二:环境变量设置方式不正确
在宝塔面板中,很多开发者会尝试在启动命令中直接设置环境变量:
```bash
DB_USERNAME=root DB_PASSWORD=root2026122 java -jar app.jar
```
问题就在于宝塔面板的Java项目管理不会自动解析这种格式的环境变量设置。它会把 `DB_USERNAME=root` 当作命令的一部分,而不是环境变量。那么自然而然就还会使用对应的默认值啦
(3)情况三:环境变量作用域问题
即使你在服务器的 `~/.bashrc` 或 `~/.profile` 中设置了环境变量:
```bash
export DB_USERNAME=****
export DB_PASSWORD=*****
```
这个情况的问题就是这些环境变量只在 " 交互式shell会话 " 中生效。当宝塔面板通过系统服务或后台进程启动应用时,不会加载这些配置文件中的环境变量。
4.解决方案
方案一:在宝塔面板中配置环境变量(推荐)
这是最直接、最可靠的解决方案。
步骤1:修改启动命令
在宝塔面板的"Java项目"管理中,找到"项目启动命令",去掉环境变量部分:
**错误示例:**
```bash
DB_USERNAME=**** DB_PASSWORD=**** /www/server/java/jdk-17.0.8/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/back/app.jar
```
**正确示例:**
```bash
/www/server/java/jdk-17.0.8/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/back/app.jar
```
步骤2:配置环境变量
a. 在"环境变量"选项中,选择 "指定变量"

b. 在文本框中输入环境变量,每行一个,格式为 `KEY=VALUE`:
```
DB_USERNAME=****
DB_PASSWORD=****
```

注意事项:
- 每行只能写一个环境变量
- 格式必须是 `变量名=变量值`,不要有多余空格
- 不要加引号
- 变量名区分大小写
步骤3:保存并启动
保存配置后,点击"启动"按钮。宝塔面板会将环境变量正确传递给Java进程。
剩下的方案就是,使用启动脚本、使用env命令,后续再更新了,写的有点累了。。。
更多推荐
所有评论(0)