如何解决无法加载身份验证插件“ caching_sha2_password”的问题


107

在Eclipse中,当我启动我的应用程序时,我得到了-无法发现要使用的方言。java.sql.SQLException:无法加载身份验证插件“ caching_sha2_password”。

在java.sql.SQLException:无法加载身份验证插件“ caching_sha2_password”。在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:864)在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:864)在com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO。 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)处com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2191)处com.mysql.jdbc.ConnectionImpl处的Java:1746)。 com.mysql.jdbc上的connectOneTryOnly(ConnectionImpl.java:2222)com.mysql.jdbc上的ConnectionImpl.createNewIO(ConnectionImpl.java:2017)com.mysql.jdbc上的ConnectionImpl。(ConnectionImpl.java:779) .JDBC4Connection。(JDBC4Connection.java:47),位于sun.reflect.NativeConstructorAccessorImpl。

Answers:


165

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

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

样本用户名/密码=>学生/ pass123

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

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


7
尽管这可行,但最好升级MySQL Connector / J版本(如其他一些答案所建议),因为它允许您使用更安全的sha2_caching身份验证插件。
Mark Rotteveel

@MarkRotteveel是的!我也同意这一点。
加拉夫

@MarkRotteveel怎么样?
theonlygusti '19

4
@theonlygusti您需要将MySQL Connector / J至少更新为5.1.46,或者-更好地-更新为8.0.14。
Mark Rotteveel


62

其他人已经指出了根本问题,但是在我的情况下,我使用的是dbeaver,最初在与dbeaver建立mysql连接时选择了错误的mysql驱动程序(此处提供答案:https//github.com/dbeaver/dbeaver/问题/ 4691#issuecomment-442173584

在下图中选择MySQL选项将给出错误,因为驱动程序是mysql 4+,可以在数据库信息提示中看到。


对于此错误,选择图中最重要的mysql 4+选项将给出此问题中提到的错误


而不是选择MySQL驱动程序,而是选择MySQL 8+驱动程序,如下图所示。


在此处输入图片说明


6
谢谢,这正是我的问题。您是否遇到了另一个错误:“不允许检索公共密钥”?
托马什Zato -恢复莫妮卡

有趣的是,在上述之后,dbeaver加载了表。
保罗

3
谢谢。这对我很有帮助。对于仍然在DBeaver中出现“不允许进行公共Ket检索”错误的人,我在这里找到了解决此问题的链接。
jpisty

2
Public key retrieval is not allowed
aderchox

41

使用您的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>

此后我的问题已解决。


1
感谢您的帮助。对于其他版本,要查找最新版本,请使用此链接;mvnrepository.com/artifact/mysql/mysql-connector-java
yusuf


16

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


这对我有帮助!
飞利浦

为我工作!我正在使用1.5.8.RELEASE版本。
Ionuț Ciuta

15

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


有效。我浪费了将近2天的时间才能找到此解决方案。谢谢。
Hemant Nagpal

11

我正在使用mysql 8.0.12并将mysql连接器更新为mysql-connector-java-8.0.12为我解决了该问题。

希望它能帮助到别人。


升级到至少5.1.46或今天这样的最新版本,我们有8.0.18。这将有助于解决问题。
Atul,

9

如以上提到的那样:

从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';

7

这可能是您需要更新的MySQL连接器,因为MySQL8更改了密码的加密-因此旧的连接器不正确地加密了它们。

Java连接器的Maven仓库可以在这里找到。
如果您使用flyway插件,也应该考虑对其进行更新

然后,您可以使用以下命令简单地更新您的maven pom

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

或对于使用Gradle的其他人,您可以使用以下命令更新build.gradle

 buildscript {
    ext {
        ...
    }
    repositories {
        ...
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath('mysql:mysql-connector-java:8.0.11')
    }
 }

您真正需要做的所有工作(build.gradle示例)


5

您在使用“ caching_sha2_password”插件随附的新MySQL版本时遇到问题,请按照以下命令进行操作。

DROP USER 'your_user_name'@'%';
CREATE USER 'your_user_name'@'%' IDENTIFIED WITH mysql_native_password BY 'your_user_password';
GRANT ALL PRIVILEGES ON your_db_name.* TO 'your_user_name'@'%' identified by 'your_user_password';

或者,您可以仅使用以下命令来保留您的特权:

ALTER USER your_user_name IDENTIFIED WITH mysql_native_password;

您好,您在第三行所说的“ your_db_name。*”是什么意思*代表什么
萨拉·莫汉

用户希望获得访问权限的数据库名称。或者,您可以仅使用最后一个ALTER语句来解决问题。在ALTER中,您只需要传递用户名

将所有特权授予your_db_name。*以'your_user_password'标识的'your_user_name'@'%';
萨拉斯·莫汉

好的,您在连接数据库时面临问题吗?意味着您还在连接字符串中指定了一些数据库名称,需要添加相同的数据库来代替your_db_name。希望您清除

4

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

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

  1. 从下载当前连接口J这里。然后将其复制到您的操作系统中。

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

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

  4. 在“项目”选项卡中,右键单击该项目。在弹出菜单的底部选择“解析数据源”。单击添加连接。此时,NetBeans会向前跳过,并假定您要使用旧的连接器。单击上一步按钮返回到跳过的窗口。卸下旧的连接器,然后添加新的连接器。单击下一步,然后测试连接以确保其正常工作。

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


我意识到我的回答并不完全相关。我在此处发布了NetBeans答案,因为我自己的问题被标记为该问题的重复项。
杰克·J

4

我使用以下依赖项做了完全相同的问题:

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

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


3

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

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


2

如果可以将连接器更新为支持MySQL 8的新身份验证插件的版本,请执行此操作。如果由于某种原因不能选择该选项,请将数据库用户的默认身份验证方法更改为“本机”。


0

如果添加了多个版本的连接器jar文件,则删除connect .jar文件,仅添加与sql版本匹配的连接器jar文件。


0

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

确保您实际上指向的是正确的SQL Server。您可能具有在3306上运行的MySQL的默认安装,但实际上可能需要其他MySQL实例。

检查端口并针对数据库运行一些查询。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.