问题概述
Java应用程序连接MySQL数据库时抛出SQLException: Access denied for user 'root'@'localhost' (using password: YES)异常,表明用户认证失败。
常见原因分析
认证信息错误
- 用户名或密码输入错误,包括大小写敏感问题
- 密码包含特殊字符未转义
权限配置问题
- MySQL未授予
root用户本地登录权限 - 用户权限未刷新或权限表损坏
MySQL服务配置
- 密码认证插件不兼容(如
caching_sha2_password与旧驱动冲突) bind-address配置限制本地连接
解决方案
验证登录信息
通过命令行或客户端工具(如MySQL Workbench)直接测试root用户密码是否有效
使用以下命令检查用户权限:
SELECT Host, User FROM mysql.user WHERE User = 'root';
修正MySQL权限
若权限缺失,执行授权命令并刷新权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
重置密码(若遗忘):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
调整认证插件
修改为mysql_native_password插件(兼容旧驱动):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
检查连接配置
确认JDBC URL格式正确,例如:
String url = "jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC";
确保驱动版本与MySQL服务器兼容(推荐使用Connector/J 8.0+)
特殊案例:YAML解析问题
问题现象
密码以数字0开头时,在YAML配置文件中可能被错误解析为八进制数
解决方案
- 更换不含前导零的密码
- 用双引号包裹密码值:
password: "0123456"
高级排查
- 查看MySQL错误日志(默认路径
/var/log/mysql/error.log或Windows事件查看器) - 临时关闭防火墙或SELinux测试是否为网络策略拦截
预防措施
- 避免使用
root用户运行应用,创建专用数据库用户并限制权限 - 定期备份MySQL系统数据库(
mysql库)以防权限表损坏 - 在代码中使用配置管理工具(如Spring Boot的
application.properties)集中管理数据库凭据
示例代码
// 使用try-with-resources确保连接关闭
try (Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/dbname",
"root",
"password")) {
// 执行SQL操作
} catch (SQLException e) {
e.printStackTrace();
}
112万+

被折叠的 条评论
为什么被折叠?



