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个回答

67

这可以帮助你:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '%password%' WITH GRANT OPTION;

可通过命令行或某些图形界面工具执行该操作。

别忘了将%password%替换为实际密码。


1
@evg 我已经成功执行了这个查询,但仍然无法摆脱这个错误。 - palak sharma
@evg 以上的解决方案是否适用于下面的问题。这里使用的是 IP 地址而不是 localhost: **java.sql.SQLException: Access denied for user ''@'1.1.22.85' (using password: YES)**。 - Ashok kumar Ganesan
如果有人在应用此解决方案后遇到了“访问被拒绝”的问题,那么您可以应用链接的解决方案来使生活更轻松。谢谢。 - Nazmul81

28

这仅适用于Ubuntu 18.04 LTS和MySQL 5.x 请按照此链接进行操作 从此处开始遵循所有步骤:

sudo mysql_secure_installation

sudo mysql

登录 MySQL 后,从 MySQL 提示符中执行以下命令:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

现在确认该表格具有根密码

SELECT user,authentication_string,plugin,host FROM mysql.user;

这解决了我的问题,现在我能够登录了。


现在验证一下表中是否有 root 用户的密码。如果没有呢? ;) - Line

23

如果你是从头开始创建数据库,你可以使用:

Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=rootpassword"); 
PreparedStatement ps = connection.prepareStatement("CREATE DATABASE databasename");
int result = ps.executeUpdate();

这里有一个完全相同的情境


如果我没有任何数据库?而我想使用Java代码创建数据库,而不是在phpmyadmin中手动创建,那么databaseName就不相关了吗? - JAN
我正在处理我的一个应用程序,代码和数据库之间的连接很好。突然间我开始收到这个错误,不知道为什么或该怎么办。 - viveksinghggits

9

您可以使用这个

   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost:3306/YOUR_DB_NAME";


   static final String USER = "root";
   static final String PASS = "YOUR_ROOT_PASSWORD"; 

  Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);

你必须提供正确的root密码。


9

我遇到了类似的问题,但不同的是:我没有在localhost上执行JavaApp,而是从远程计算机上执行。因此,我得到了类似于java.sql.SQLException: Access denied for user 'root'@'a.remote.ip.adress' (using password: YES)的错误。

要解决这个问题,你可以简单地登录phpMyAdmin,转到Users,点击add user,然后输入你想要执行JavaApp的主机名(或选择Any Host)。


6
我遇到了和下面一样的问题。
"java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)". Problem was "WRONG PASSWORD". 

复制并粘贴查询语句到Shell中,以检查是否得到所需的输出。小错误会消耗更多时间。


我曾经遇到同样的问题。我在application.properties中指定的密码是错误的。它应该与您本地数据库的密码相同。 - Muhittin Kaya

5

这似乎主要是由于MySQL用户名和密码不正确引起的。请检查您的MySQL用户名和密码。


谢谢。我的问题与密码不正确有关。我正在将一个应用部署到 Kubernetes 集群,而密码是在 Kubernetes secrets 中加密的。我只需要查看集群中的 Kubernetes secret,将密码从 base64 解密为 json,这样就能看到密码不正确,然后我纠正了密码并重新部署。这次一切都正常工作了。 - Promise Preston

2

您应该指定要连接的数据库:

jdbc:mysql://localhost:3306/mydb

1

当我运行一个Spring Boot项目时,application.yml配置文件如下:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/lof?serverTimezone=GMT
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

请注意密码周围没有引号。我可以在我的 Windows 系统上运行此项目。

但是当我尝试部署到服务器时,我遇到了问题,并通过更改 application.yml 文件来解决:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/lof?serverTimezone=GMT
    username: root
    password: "root"
    driver-class-name: com.mysql.cj.jdbc.Driver

1

在下面的位置添加端口号(例如3306):

Connection c = DriverManager.getConnection("jdbc:mysql://localhost:urport","root","root");

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