java - 如何解决无法加载身份验证插件'caching_sha2_password'的问题




mysql eclipse (10)

在eclipse中,当我开始我的应用程序时,我得到了这个 - 无法发现要使用的方言。 java.sql.SQLException:无法加载身份验证插件'caching_sha2_password'。

在java.sql.SQLException:无法加载身份验证插件'caching_sha2_password'。 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:868)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:864)at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO。 java:1746)at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2191)at com.mysql.jdbc.ConnectionImpl。 connectOneTryOnly(ConnectionImpl.java:2222)at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2017)at com.mysql.jdbc.ConnectionImpl。(ConnectionImpl.java:779)at com.mysql.jdbc .JDBC4Connection。(JDBC4Connection.java:47)at at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)at at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)at at at at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)at a java.lang.reflect.Constructor.newInstance(Unknown Source)at a t com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389)at at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)at at java.sql.DriverManager.getConnection(Unknown Source)at at at java.ql.DriverManager.getConnection(未知源)位于ch.qos.logback.core.db.DriverManagerConnectionSource.getConnection(DriverManagerConnectionSource.java:54)at ch.qos.logback.core.db.ConnectionSourceBase.discoverConnectionProperties(ConnectionSourceBase) .java:46)at ch.qos.logback.core.db.DriverManagerConnectionSource.start(DriverManagerConnectionSource.java:38)at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.end(NestedComplexPropertyIA.java:161 )at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)at at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPl) ayer.java:62)at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:165)at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:152) at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110)位于ch.qos的ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)。位于org.slf4j.impl.StaticLoggerBinder.init的ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)中的logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)( StaticLoggerBinder.java:84)at org.slf4j.impl.StaticLoggerBinder。(staticLoggerBinder.java:55)at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)at org.slf4j.LoggerFactory.performInitialization(LoggerFactory) .java:124)at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)at ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addSta tus(StatusViaSLF4JLoggerFactory.java:32)位于ch.qos.logback.classic.util.StatusViaSLF4JLoggerFactory.addInfo(StatusViaSLF4JLoggerFactory.java:20)at ch.qos.logback.classic.servlet.LogbackServletContainerInitializer.onStartup(LogbackServletContainerInitializer.java: 32)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina。 core.ContainerBase $ StartChild.call(ContainerBase.java:1421)at org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1411)at at java.util.concurrent.FutureTask.run(Unknown Source )at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)at at java.lang.Thread.run(Unknown Source)


从MySQL 8.0.4开始,他们将MySQL服务器的默认认证插件从 mysql_native_password更改 caching_sha2_password

您可以运行以下命令来解决此问题。

示例用户名/密码=> student / pass123

ALTER USER 'student'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123';

有关详细信息,请参阅官方页面: MySQL参考手册


使用你的mysql版本升级你的mysql-connector“lib包,我正在使用8.0.13版本,并在pom中更改了版本:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    <version>8.0.13</version>
</dependency>

此后我的问题解决了。


另一个原因可能是您指向错误的端口。

确保您实际上指向正确的SQL服务器。 您可能在3306上运行默认的MySQL安装,但实际上您可能需要不同的MySQL实例。

检查端口并对db运行一些查询。


可能是你使用了错误的mysql_connector。

使用相同mysql版本的连接器


当我使用 Murach JSP手册中 的现成项目时,我在NetBeans上遇到了这个问题。 该问题是由使用5.1.23 Connector J和MySQL 8.0.13数据库引起的。 我需要用新的驱动程序替换旧的驱动程序。 下载连接器J后,这需要三个步骤。

如何替换NetBeans项目连接器J:

  1. here 下载当前的连接器J. 然后在您的操作系统中复制它。

  2. 在NetBeans中,单击“项目”选项卡旁边的“文件”选项卡。 找到mysql-connector-java-5.1.23.jar或者你拥有的任何旧连接器。 删除此旧连接器。 粘贴在新连接器中。

  3. 单击“项目”选项卡。 导航到Libraries文件夹。 删除旧的mysql连接器。 右键单击Libraries文件夹。 选择添加Jar /文件夹。 导航到放置新连接器的位置,然后选择打开。

  4. 在“项目”选项卡中,右键单击项目。 选择弹出菜单底部的Resolve Data Sources。 单击“添加连接”。 此时,NetBeans会向前跳过并假设您要使用旧连接器。 单击“后退”按钮返回跳过的窗口。 删除旧连接器,然后添加新连接器。 单击“下一步”和“测试连接”以确保其有效。

对于视频参考,我发现 this 很有用。 对于IntelliJ IDEA,我发现 this 很有用。


您只需删除旧连接器并下载新版本(mysql-connector-java-5.1.46)


我使用下面的依赖项完成了同样的问题:

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

我只是改为版本46,一切正常。


我在一个Spring Boot应用程序中遇到此错误,但在另一个应用程序中没有。 最后,我发现一个不工作的Spring Boot版本是2.0.0.RELEASE,正在运行的版本是2.0.1.RELEASE。 这导致MySQL连接器的差异 - 5.1.45与5.1.46。 我更新了在启动时抛出此错误的应用程序的Spring Boot版本,现在它可以工作了。


我认为最好更新你的“mysql-connector”lib包,这样数据库可以更安全。

我使用的是版本8.0.12的mysql。 当我将mysql-connector-java更新到8.0.11版时,问题就消失了。


正如上面提到的那样:

从MySQL 8.0.4开始,MySQL团队将MySQL服务器的默认认证插件从mysql_native_password更改为caching_sha2_password。

因此有三种方法可以解决此问题:

 1. drop USER 'user_name'@'localhost';
    flush privileges;
    CREATE USER 'user_name'@'localhost' IDENTIFIED BY 'user_name';
    GRANT ALL PRIVILEGES ON * . * TO 'user_name'@'localhost';
    ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 
    'user_name';

 2. drop USER 'user_name'@'localhost';
    flush privileges;
    CREATE USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'user_name';
GRANT ALL PRIVILEGES ON * . * TO 'user_name'@'localhost'

 3. If the user is already created, the use the following command:

    ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 
        'user_name';