java.sql.SQLException:对用户'root'@'localhost'拒绝访问(使用密码:YES)

时间:2012-08-12 12:51:43

标签: java mysql exception jdbc connection

以下代码:

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)

26 个答案:

答案 0 :(得分:45)

这可以帮到你:

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

使用命令行或某些GUI工具执行它。

不要忘记用真实密码替换%password%

答案 1 :(得分:11)

当您从头开始创建数据库时,您可以使用:

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

这是identical scenario

答案 2 :(得分:7)

我遇到了类似的问题,但不同之处在于:我没有从Model.updateOjects; View.PaintingSheet.repaint(); Thread.sleep(x); 执行我的JavaApp,而是从远程PC执行。所以我有localhost之类的东西 要解决此问题,您只需登录phpMyAdmin,转到java.sql.SQLException: Access denied for user 'root'@'a.remote.ip.adress' (using password: YES),单击Users并输入要从中执行JavaApp的主机(或选择add user

答案 3 :(得分:5)

你可以用这个

   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密码。

答案 4 :(得分:3)

这特定于Ubuntu 18.04 LTS和MySQL 5.x 关注了此link 从这里开始关注所有事情:

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;

这解决了我的问题,现在我可以登录了。

答案 5 :(得分:2)

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

jdbc:mysql://localhost:3306/mydb

答案 6 :(得分:2)

我有同样的问题“java.sql.SQLException:访问被拒绝用户'root'@'localhost'(使用密码:YES)”。问题是“错误的密码”。将查询原样复制并粘贴到shell中,以检查它是否提供了所需的输出。小错误消耗更多时间。

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

此异常也是由于mysql db和pom.xml / jar的版本不匹配引起的。

确保您的pom.xml / jar版本高于您的mysql db版本。 因为较高版本与较低版本兼容,但反之则不然。

java项目的解决方案

  • 用合适的版本替换Jar。

基于maven的解决方案

  • 更改pom.xml中的依赖项版本

弹簧靴的解决方案   - 通过添加覆盖spring boot依赖项     5.1.5.Final

答案 9 :(得分:1)

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

答案 10 :(得分: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);
}

答案 11 :(得分:0)

在:

中添加端口号(类似于 3306)
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:urport","root","root");

答案 12 :(得分:0)

我在运行springboot项目的时候,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

答案 13 :(得分:0)

我的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清理,然后进行Maven安装。

答案 14 :(得分:0)

我也面临着同样的问题,即使用户具有足够的特权来访问数据库,我的连接字符串也有效,并且用户名和密码也有效。

我通过删除MySQL创建的临时文件夹解决了此问题(请先备份,然后再删除任何文件夹,以防万一它不起作用,您可以再次放置该文件)。

Windows中MySQL的临时文件和连接文件的默认文件夹位置是:

C:\ ProgramData \ MySQL

我已删除(已备份)以下文件夹:

C:\ ProgramData \ MySQL \ MySQL Server \ Data \ sys

注意::在删除任何项目之前,请确保未启动MySQL服务,否则它将不允许删除任何文件

对我有用。

答案 15 :(得分:0)

这个为我解决的问题。

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

GRANT ALL PRIVILEGES ON *.cfe TO 'root'@'%' IDENTIFIED BY 'password';

FLUSH PRIVILEGES;

答案 16 :(得分:0)

我正在使用Spring Boot 2.2.6(Windows),并在尝试运行该应用程序时遇到相同的问题: java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:是)

什么解决了我的问题:

  1. 通过MySQL工作台或您可能正在使用的类似GUI创建新用户
  2. 也可以从GUI中授予DBA特权(勾选DBA复选框)
  3. 运行spring boot应用程序。

或者按照@evg解决方案在Linux环境中从命令行授予privilegdes。

答案 17 :(得分:0)

对我来说,该解决方案的工作方式是将url格式更改为: con = DriverManager.getConnection(“ jdbc:mysql:// localhost / w3schools?user = ###&password = ###”)); 确保将适当的jar添加到类路径并使用驱动程序 Class.forName(“ com.mysql.jdbc.Driver”);

答案 18 :(得分:0)

  1. 使用正确的jar(具有正确的版本)
  2. 授予root用户独立于主机的访问权限或创建用户

答案 19 :(得分:0)

声明顺序:

  • 驱动程序
  • 连接字符串
  • 用户名
  • 密码

如果我们按顺序声明

  • 连接字符串
  • 用户名
  • 密码
  • 驱动程序

应用程序将失败

答案 20 :(得分:0)

如果要使用Java从本地计算机连接远程mysql服务器,请执行以下步骤。 错误: “ java.sql.SQLException:用户'xxxxx'@'101.123.163.141'的访问被拒绝(使用密码:是)”

对于远程访问,可能是cpanel或其他人为您的本地IP地址授予了远程访问权限。

在以上错误消息中:“ 101.123.163.141”是我的本地计算机ip。因此,首先我们必须在Cpanel-> RemoteMySQL®中进行远程访问。然后运行您的应用程序进行连接。

Class.forName("com.mysql.jdbc.Driver");  
Connection con=DriverManager.getConnection(  
    "jdbc:mysql://www.xyz.com/abc","def","ghi");  
//here abc is database name, def is username and ghi        
Statement stmt=con.createStatement();  
ResultSet rs=stmt.executeQuery("select * from employee");  
    while(rs.next())  
        System.out.println(rs.getInt(1)+" "+rs.getString(2)+"  
                          "+rs.getString(3));  
con.close();    

希望它可以解决您的问题。

谢谢

答案 21 :(得分:0)

这似乎主要发生在MySQL用户名和密码不正确时。检查您的MySQL用户名和密码。

答案 22 :(得分:0)

我必须更改我的SQL设置(在我的主机中,在我的情况下是Dreamhost)以允许用户名从其他主机访问数据库,而不仅仅是Dreamhost,因为我在计算机上运行IDE程序。我现在通过将%添加到Allowable Hosts列表中来实现。它现在有效!

答案 23 :(得分:-1)

如果使用的是MySql工作台,请转到工作台的主页,右键单击数据库,复制JDBC连接字符串,然后将其粘贴到Java程序中。

答案 24 :(得分:-1)

我也有这个问题,已经解决了。

更改:

Sring url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&user=root&password=password";

设置:

Sring url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&user=root&password=password";"serverTimezone=UTC""Unified standard world time""useUnicode=true&characterEncoding=UTF-8"

尽管我的数据库没有任何中文单词。但它正在工作。 来自https://www.cnblogs.com/EasonJim/p/6906713.html

的引用

答案 25 :(得分:-1)

我遇到了这个错误。问题是我的数据库名称错误。