Java.sql.SQLException: 用户'root'@'localhost'被拒绝访问(使用密码:是)

73
以下代码:
Class.forName("com.mysql.jdbc.Driver");
Connection m_connection = DriverManager.getConnection("jdbc:mysql://localhost","root","root");

getConnection() 上抛出此异常:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1244)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2397)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at db.Database.<init>(Database.java:91)
    at db.Main.main(Main.java:10)
这是什么原因造成的?我该如何解决?
编辑:
    public static void main(String[] args) throws ClassNotFoundException, ServletException, SQLException 
    {

        try
        {
            Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=rootpassword"); 
            Statement   s = (Statement) conn.createStatement();
            int result = s.executeUpdate("CREATE DATABASE databasename");
        }


        catch ( Exception e)
        {
            e.printStackTrace();
        }
}

输出:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1244)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2397)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at db.Main.main(Main.java:19)

1
你能否使用 MySQL GUI 客户端(如 SqlYog 或 PhpMyAdmin)连接数据库? - Tomer
1
@ftom2:是的,我可以成功访问phpmyadmin - JAN
1
你确定提供的 用户名密码 是正确的吗?在我看来,似乎没有名为 root 的用户 :( 不太确定,但是难道你不需要像这样提供 数据库名称Connection con = DriverManager.getConnection("jdbc:mysql://localhost;database=mywebsitedb;user=sa;password=thatstrue;"); - nIcE cOw
@GagandeepBali:再想一想:如果登录错误,那么OP怎么能通过phpmyadmin访问它呢? - BalusC
@BalusC:实际上从未使用过 phpmyadmin,虽然有时会使用 SQLServer,但这些字段通常是默认自动填充的,而我们也会忘记它们。这就是为什么那个猜测只是作为评论出现的原因,否则如果我认为这确实是情况(可能是或不是),它可以成为一个回答。但由于您对该评论感到冒犯,如果我再问同样的问题,那我就非常错了,我的错 :-) - nIcE cOw
1
需要确定两件事情-您是否是有效用户,您是否具有执行操作的权限(特权)。权限采用指定主机上的特定特权形式。在引入任何Java之前可以回答这两个问题。个人而言,我会使用命令行连接到指定的用户作为我的sql,例如“mysql -uroot -prootpassword”,然后执行命令“create database mydb”。如果这起作用,您可以删除数据库并转到Java代码。 - Romski
33个回答

1

试着这样做...

public static Connection getConnection() throws SQLException{

    String driver = "com.mysql.jdbc.Driver";
    String url    = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "vicky";            // Change it to your Password
    System.setProperty(driver,"");

    return DriverManager.getConnection(url,username,password);
}

4
为什么这会解决具体的问题?你没有以任何方式解释原因。 - BalusC

1

我遇到了同样的问题。添加了mysql服务端口号(3307),问题得到了解决。

conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/?" + "user=root&password=password");

1
我正在使用Spring Boot 2.2.6(Windows),当我尝试运行应用程序时遇到了相同的问题: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 解决方法如下:
  1. 创建一个新用户(从MySQL Workbench或您可能在使用的类似GUI中)
  2. 从GUI中授予DBA权限(选中DBA复选框)
  3. 运行Spring Boot应用程序。
或按照@evg的解决方案,在Linux环境中通过命令行授予权限。

我正在使用Spring Boot 2.6.2(Windows),尝试了您的解决方案,但仍无法解决我的问题。 - Devendra Singraul

1
尽管这可能不是您问题的原因,但如果有两个MySQL服务在同一端口上运行,您将收到相同的错误。您可以通过查看任务管理器中服务选项卡中的服务列表来在Windows上进行检查。

1
这是一条注释,而不是答案。 - Mad Physicist

1
这个异常也可能是由于mysql数据库版本与您的pom.xml/jar版本不匹配导致的。
请确保您的pom.xml/jar版本高于mysql数据库版本,因为高版本兼容低版本,反之则不一定成立。
Java项目的解决方案:
- 用适当的版本替换Jar文件。
基于Maven项目的解决方案:
- 在pom.xml中更改依赖版本。
Spring Boot的解决方案:
- 添加5.1.5.Final以覆盖Spring Boot依赖。

1

我的application.properties文件看起来像这样

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb

spring.datasource.username=root

spring.datasource.password=root

唯一有效的方法是执行maven clean命令,然后执行maven install命令。

1
在我的情况下,我创建了一个名为admin的新用户,并使用它...
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost'
WITH GRANT OPTION;

CREATE USER 'admin'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%'
WITH GRANT OPTION;

0

在执行以下语句后,我使用相同的密码,一切正常。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

0
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
spring.datasource.url=jdbc:mysql://localhost:3306/DATABASE_NAME? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

前往您的phpmyadmin数据库

创建一个名为DATABASE_NAME的数据库,然后前往权限并检查在数据库中具有特权的用户,并使用它们,默认情况下是“root”


0
  1. 使用正确的jar包(带有正确的版本)
  2. 给予root用户独立于主机的访问权限或创建一个新用户

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接