MySQL非瞬时连接异常:客户端不支持服务器请求的认证协议;考虑升级MySQL客户端。

15
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3996)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1284)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2137)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:776)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:352)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:284)
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:154)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:145)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)
    at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:43)

即使我更新了MySQL密码,仍然出现这个错误。我在一些帖子中读到说MySQL有一个新的缓存机制,所有客户端都需要运行以下命令, 我已经运行了,但是仍然出现相同的错误:

 update user set authentication_string='test' where user='root';
 flush privileges   

1
请检查依赖项的版本和已安装的MySQL服务器。 - learn2code
1
是的,你说得对。问题出现在mysql服务器的8.11版本上。当我切换到5.7版本时,问题消失了。 - sirajnadwar
很好,它有所帮助! - learn2code
1
请尝试以下答案中提出的解决方案。https://dev59.com/plUL5IYBdhLWcg3wmpDH#50131831 - Manoj De Silva
8个回答

15

步骤1:使用SELECT version();查询语句检查当前MySQL版本。

步骤2:检查您的Maven中MySQL JDBC驱动程序或MySQL依赖项的版本。

步骤3:升级MySQL的JAR版本或Maven依赖项版本。


13

以下步骤可解决此问题:

步骤1:在MySQL中运行以下查询,然后重新启动(对于版本> 8.0,此处用户名为root)

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';

步骤2:通过在MySQL中运行select version();来检查您的MySQL版本

 the version of mysql in pom.xml should be same as the version of mysql installed (mine is 8.0.14)
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.14</version>

步骤3:- 如果maven存储库中没有mysql-connector jar文件,则可以下载8.0.14版本的jar并将其粘贴到存储库中。

$\.m2\repository\mysql\mysql-connector-java\8.0.14

步骤4:- 更新您的maven项目。

步骤5:- 检查config.xml中的driverClassName,应为“com.mysql.cj.jdbc.Driver”。


ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';这对我起作用了! - Rohit Parte
我遇到了同样的问题,这个方法对我有用。 - Lasith Jayalath
同样的问题,对我来说第5步非常关键,我需要使用“com.mysql.jdbc.Driver”。 - theomeli

6
我已经按照消息所建议的做了。我在pom.xml文件中进行了如下修改:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>

并更改为最新版本

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.12</version>
</dependency>

2

请检查您项目中lib文件夹下的mysql-connector-java-version.jar(例如:mysql-connector-java-8.0.11.jar)并进行相应的升级。


1
问题出在mysql-connector-java版本5.1.6上。尝试升级到版本5.1.44,这对我有用。我使用了以下依赖版本:
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.44'

5.1.6是早期版本。升级到5.1.44将会是升级 - Mark Rotteveel

1
您需要使用MySQL的OLD_PASSWORD函数更新数据库用户的密码。 解决方案
例如:
[rajesh-tpl-01@home ~]$ mysql -u root -p mysql
Enter password:

mysql> update user set password=OLD_PASSWORD('password') WHERE 
user='username';
Query OK, 0 rows affected (0.02 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

1

只需将您的mysql-connector-java更新到最新版本,无需任何其他操作。


实际上,这正是问题的根源所在。 - sirajnadwar

0
只需在POM.XML文件中更新版本,如果问题仅涉及客户端版本,请升级到最新版本,然后清理项目。它将成功运行。


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