【解决办法】java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)

问题概述

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zrlue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值