java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:是)
Posted
技术标签:
【中文标题】java.sql.SQLException:用户\'root\'@\'localhost\'的访问被拒绝(使用密码:是)【英文标题】:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:是) 【发布时间】:2012-08-08 23:24:15 【问题描述】:以下代码:
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)
【问题讨论】:
您可以使用 SqlYog 或 phpMyAdmin 等 mysql GUI 客户端进行连接吗? @ftom2:是的,我可以成功访问phpmyadmin
。
您确定所提供的用户名和密码正确吗?在我看来,没有像 root 这样的用户 :( 虽然不确定,但你不必像 Connection con = DriverManager.getConnection("jdbc:mysql://localhost;database=mywebsitedb;user=sa;password=thatstrue;");
那样提供 Database Name
@GagandeepBali:再想一想:如果登录错误,那么 OP 将如何通过 phpmyadmin 访问它?
您需要确定两件事 - 您是否是有效用户,您是否有执行该操作的权限(特权)。权限采用来自指定主机的特定权限的形式。在介绍任何 Java 之前,可以回答这两个问题。就个人而言,我会使用命令行以用户指定的方式连接到我的 sql,例如'mysql -uroot -prootpassword',然后执行命令'create database mydb'。如果这可行,您可以删除数据库并转到您的 Java 代码。
【参考方案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);
【讨论】:
为什么它会解决具体问题?你没有以任何方式解释原因。【参考方案2】:您应该指定要连接的数据库:
jdbc:mysql://localhost:3306/mydb
【讨论】:
【参考方案3】:当您从头开始创建数据库时,您可以使用:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=rootpassword");
PreparedStatement ps = connection.prepareStatement("CREATE DATABASE databasename");
int result = ps.executeUpdate();
这是identical scenario。
【讨论】:
如果我根本没有任何数据库?我想使用 java 代码创建数据库,而不是在phpmyadmin
中手动创建,那么 databaseName
不相关?
我正在开发我的一个应用程序,代码和数据库之间的连接很好。我突然开始收到此错误,不知道为什么以及该怎么做。【参考方案4】:
这可以帮助你:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '%password%' WITH GRANT OPTION;
使用命令行或一些 GUI 工具执行它。
不要忘记用真实密码替换%password%
。
【讨论】:
@evg 我已经成功执行了这个查询,但仍然没有摆脱这个错误 @evg 上述解决方案是否也适用于以下解决方案。这里而不是 localhost,IP 地址如下所示 java.sql.SQLException: Access denied for user ''@'1.1.22.85' (using password: YES)。 如果有人在应用此解决方案后遇到访问被拒绝问题,那么您可以应用link 解决方案,让生活更轻松。谢谢【参考方案5】:我遇到了同样的问题。新增mysql服务端口号(3307),解决问题。
conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/?" + "user=root&password=password");
【讨论】:
【参考方案6】:我遇到了类似的问题,但不同之处在于:我没有从localhost
执行我的JavaApp,而是从远程PC 执行的。所以我得到了类似java.sql.SQLException: Access denied for user 'root'@'a.remote.ip.adress' (using password: YES)
要解决这个问题,您只需登录 phpMyAdmin,转到Users
,单击add user
并输入您要执行JavaApp 的主机(或选择Any Host
)
【讨论】:
谢谢!那是我的问题!【参考方案7】:你可以用这个
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 密码。
【讨论】:
【参考方案8】:虽然这可能不是您的问题的原因,但如果有两个 MySQL 服务在同一个端口上运行,您将收到相同的错误。您可以通过查看任务管理器的服务选项卡中的服务列表来检查 Windows。
【讨论】:
这是评论,不是答案。【参考方案9】:我遇到了同样的问题
"java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)". Problem was "WRONG PASSWORD".
将查询原样复制并粘贴到 shell 中,以检查它是否提供所需的输出。小错误会消耗更多时间。
【讨论】:
我遇到了同样的问题。我在 application.properties 中指定的密码有误。它应该与您的本地数据库密码相同。【参考方案10】:这个异常也是由于mysql db和你的pom.xml/jar的版本不匹配引起的。
确保您的 pom.xml/jar 版本高于您的 mysql db 版本。 因为较高版本与较低版本兼容,但反过来则不然。
java项目的解决方案
用合适的版本替换 Jar。基于maven的解决方案
更改 pom.xml 中的依赖版本spring boot 解决方案 - 通过添加覆盖 Spring Boot 依赖项 5.1.5.Final
【讨论】:
【参考方案11】:我必须更改我的 SQL 设置(在我的主机中,在我的情况下是 Dreamhost)以允许用户名从其他主机访问数据库,而不仅仅是 Dreamhost,因为我正在从我的计算机上的 IDE 运行程序。我现在通过在允许的主机列表中添加 % 来做到这一点。现在可以了!
【讨论】:
我应该补充一点,这类似于#munchkins 方法,但来自 SQL 控制面板端。【参考方案12】:我遇到了这个错误。问题是我输入了错误的数据库名称。
【讨论】:
【参考方案13】:这似乎主要发生在 MySQL 用户名和密码不正确时。检查您的 MySQL 用户名和密码。
【讨论】:
【参考方案14】:这是特定于 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;
现在验证表是否有 root 的密码
SELECT user,authentication_string,plugin,host FROM mysql.user;
这解决了我的问题,现在我可以登录了。
【讨论】:
"现在验证该表是否有 root 的密码" - 如果没有怎么办? ;)【参考方案15】:如果您使用 java 从本地计算机连接远程 mysql 服务器,请参阅以下步骤。 错误 : "java.sql.SQLException: 用户 'xxxxx'@'101.123.163.141' 的访问被拒绝(使用密码:YES)"
远程访问可能是 cpanel 或其他人授予您本地 IP 地址的远程访问权限。
在上面的错误信息中:“101.123.163.141”是我的本地机器ip。因此,首先我们必须在 Cpanel-> Remote MySQL® 中提供远程访问权限。然后运行您的应用程序进行连接。
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();
希望它能解决您的问题。
谢谢
【讨论】:
【参考方案16】:声明顺序:
驱动程序 连接字符串 用户名 密码如果我们按顺序声明
连接字符串 用户名 密码 驱动程序应用程序将失败
【讨论】:
【参考方案17】:我也有这个问题,这个解决了。
改变:
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"
是 "Solve Chinese garbled"
。
虽然我的数据库没有中文单词。但它正在工作。 参考来自https://www.cnblogs.com/EasonJim/p/6906713.html
【讨论】:
请格式化您的代码,如果可能,请不要在此处提供指向外部页面的链接。将所有内容直接总结到您的帖子中。谢谢。【参考方案18】:-
使用正确的 jar(正确的版本)
授予 root 用户独立于主机的访问权限或创建用户
【讨论】:
【参考方案19】:如果您使用的是MySql工作台,请进入工作台主页,右键单击您的数据库,复制JDBC连接字符串,并将其粘贴到Java程序中。
【讨论】:
【参考方案20】:对我来说,解决方案的工作原理是将 url 格式更改为: con=DriverManager.getConnection("jdbc:mysql://localhost/w3schools?user=###&password=###"); 确保将正确的 jar 添加到类路径并使用驱动程序 Class.forName("com.mysql.jdbc.Driver");
【讨论】:
【参考方案21】:我正在使用 Spring Boot 2.2.6(Windows) 并在尝试运行应用程序时遇到了同样的问题: java.sql.SQLException: 用户 'root'@'localhost' 的访问被拒绝(使用密码:YES)
什么解决了我的问题:
-
创建一个新用户(从 MySQL 工作台或您可能正在使用的类似 GUI)
也从 GUI 授予 DBA 权限(勾选 DBA 复选框)
运行 Spring Boot 应用程序。
或按照@evg 解决方案在 Linux 环境中从命令行授予权限。
【讨论】:
我正在使用 Spring Boot 2.6.2(Windows) 并在尝试您的解决方案但无法解决我的问题时遇到同样的问题:【参考方案22】:这为我解决了问题。
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT ALL PRIVILEGES ON *.cfe TO 'root'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
【讨论】:
【参考方案23】:我也遇到了同样的问题,我的连接字符串有效,用户名和密码也有效,即使用户有足够的权限访问数据库。
我通过删除 MySQL 创建的临时文件夹解决了这个问题(请在删除任何文件夹之前进行备份,以防万一它不起作用,您可以重新放置该文件)。
Windows 中 MySQL 的临时文件和连接文件的默认文件夹位置是:
C:\ProgramData\MySQL
我已删除(已备份)以下文件夹:
C:\ProgramData\MySQL\MySQL 服务器\Data\sys
注意:在删除任何项目之前,请确保 MySQL 服务未启动,否则将不允许删除任何文件
它对我有用。
【讨论】:
【参考方案24】:我的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。
【讨论】:
【参考方案25】:我在运行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
【讨论】:
【参考方案26】:在以下位置添加端口号(类似于 3306):
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:urport","root","root");
【讨论】:
【参考方案27】:执行以下语句后使用相同的密码对我来说工作正常:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
【讨论】:
【参考方案28】: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”
【讨论】:
以上是关于java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:是)的主要内容,如果未能解决你的问题,请参考以下文章
“java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:YES)”
运行:java.sql.SQLException:用户'root'@'localhost'的访问被拒绝(使用密码:否)
错误:java.sql.SQLException:用户'root@localhost'@'localhost'的访问被拒绝(使用密码:是)
java.sql.SQLException:无法锁定表“更改”;用户当前正在使用
java.sql.SQLException:Android 中用户'root'@'192.148.2.106'(使用密码:YES)的访问被拒绝