Jak rozwiązać problem Nie można załadować wtyczki uwierzytelniającej „caching_sha2_password”

118

Podczas zaćmienia, kiedy uruchomiłem moją aplikację, otrzymałem to - Nie udało się znaleźć dialektu do użycia. java.sql.SQLException: nie można załadować wtyczki uwierzytelniającej „caching_sha2_password”.

at java.sql.SQLException: Nie można załadować wtyczki uwierzytelniania „caching_sha2_password”. pod adresem com.mysql.jdbc.SQLError.createSQLException (SQLError.java:868) pod adresem com.mysql.jdbc.SQLError.createSQLException (SQLError.java:864) pod adresem com.mysql.jdbc.Mithqlandshake. java: 1746) pod adresem com.mysql.jdbc.MysqlIO.doHandshake (MysqlIO.java:1226) pod adresem com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2191) pod adresem com.mysql.jdbc.ConnectionImpl. connectOneTryOnly (ConnectionImpl.java:2222) pod adresem com.mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2017) pod adresem com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:779) pod adresem com.mysql.jdbc .JDBC4Connection. (JDBC4Connection.java:47) pod adresem sun.reflect.NativeConstructorAccessorImpl.

Sarath Mohan
źródło

Odpowiedzi:

171

Począwszy od MySQL 8.0.4 zmienili domyślną wtyczkę uwierzytelniającą dla serwera MySQL z mysql_native_password na caching_sha2_password .

Możesz uruchomić poniższe polecenie, aby rozwiązać problem.

przykładowa nazwa użytkownika / hasło => student / hasło123

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

Szczegółowe informacje można znaleźć na oficjalnej stronie: Podręcznik MySQL

Gaurav
źródło
9
Chociaż to działa, lepiej jest zaktualizować wersję MySQL Connector / J (jak sugerują niektóre inne odpowiedzi), ponieważ pozwala to na użycie bezpieczniejszej wtyczki uwierzytelniania sha2_caching.
Mark Rotteveel
@MarkRotteveel Yes! Ja też się z tym zgadzam.
Gaurav
@MarkRotteveel jak?
theonlygusti
4
@theonlygusti Musisz zaktualizować MySQL Connector / J do co najmniej 5.1.46, lub - lepiej - do 8.0.14.
Mark Rotteveel
@MarkRotteveel jak mam to zrobić? stackoverflow.com/questions/54413365/…
theonlygusti
71

Inni wskazywali na problem z rootem, ale w moim przypadku korzystałem z dbeaver i początkowo podczas konfigurowania połączenia mysql z dbeaver wybierałem niewłaściwy sterownik mysql (kredyt tutaj za odpowiedź: https://github.com/dbeaver/dbeaver/ Issues / 4691 # issuecomment-442173584 )

Wybranie opcji MySQL na poniższym rysunku spowoduje wyświetlenie błędu wspomnianego, ponieważ sterownik to mysql 4+, który można zobaczyć we wskazówce dotyczącej bazy danych.


W przypadku tego błędu wybranie górnej opcji mysql 4+ na tym rysunku spowoduje wyświetlenie błędu wymienionego w tym pytaniu


Zamiast wybierać sterownik MySQL zamiast tego wybierz sterownik MySQL 8+, pokazany na poniższym rysunku.


wprowadź opis obrazu tutaj

Paweł
źródło
8
Dzięki, to był dokładnie mój problem. Czy wtedy pojawił się inny błąd: „Pobieranie klucza publicznego jest niedozwolone”?
Tomáš Zato - Przywróć Monikę
Co ciekawe, po powyższym dbeaver załadował tabele.
Paul
4
DZIĘKUJĘ CI. To mi bardzo pomogło. Dla tych, którzy nadal są coraz „Public Ket odzyskiwanie nie jest dozwolone” błąd w DBeaver Znalazłem link, który rozwiązuje ten tutaj .
jpisty
7
Public key retrieval is not allowed
aderchox
1
W najnowszych wersjach DBeavera (sprawdzonych z wersją 7.3) powyżej dostępne są dwie opcje jako „MySql 5” i „MySql”. Musisz wybrać "MySql", a także po najechaniu myszą na tę opcję, pojawi się podpowiedź, że dla mysql w wersji 8+.
techmagister
45

Uaktualnij swój pakiet mysql-connector "lib z twoją wersją mysql jak poniżej. Używam wersji 8.0.13 iw pom zmieniłem wersję:

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

Po tym mój problem został rozwiązany.

alok
źródło
2
Dzięki za pomocną odpowiedź. W przypadku innych, aby znaleźć najnowszą wersję, użyj tego linku; mvnrepository.com/artifact/mysql/mysql-connector-java
yusuf
31

Być może używasz złego mysql_connector.

Użyj łącznika tej samej wersji mysql

Vishal Boinapalli
źródło
16

Wystąpił ten błąd w jednej aplikacji Spring Boot, ale nie w innej. Wreszcie znalazłem wersję Spring Boot w wersji 2.0.0.RELEASE, która nie działała, a wersja 2.0.1.RELEASE. Doprowadziło to do różnicy w łączniku MySQL - 5.1.45 w porównaniu z 5.1.46. Zaktualizowałem wersję Spring Boot dla aplikacji, która generowała ten błąd podczas uruchamiania i teraz działa.

Greg Charles
źródło
To mi pomogło!
Anand Varkey Philips,
Pracował dla mnie! Używałem wersji 1.5.8.RELEASE.
Ionuț Ciuta
15

Wystarczy usunąć starsze złącze i pobrać nową wersję (mysql-connector-java-5.1.46)

Turab
źródło
Zadziałało. Na znalezienie tego rozwiązania straciłem prawie 2 dni. Dzięki.
Hemant Nagpal,
11

Używam mysql 8.0.12 i zaktualizowanie łącznika mysql do mysql-connector-java-8.0.12 rozwiązało problem.

Mam nadzieję, że to komuś pomoże.

Santosh Gatlewar
źródło
Uaktualnij do co najmniej 5.1.46 lub najnowszej wersji, tak jak dzisiaj mamy 8.0.18. Pomoże to rozwiązać problem.
Atul
10

Mogą to być twoje konektory dla MySQL, które wymagają aktualizacji, ponieważ MySQL8 zmienił szyfrowanie haseł - więc starsze konektory szyfrują je nieprawidłowo.

Repozytorium Maven dla konektora Java można znaleźć tutaj .
Jeśli używasz wtyczki flyway , powinieneś również wziąć pod uwagę jej aktualizację !

Następnie możesz po prostu zaktualizować swój maven pom za pomocą:

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

Lub dla innych, którzy używają Gradle , możesz zaktualizować build.gradle za pomocą:

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

Wszystko, co naprawdę musisz zrobić (przykład build.gradle)

KeaganFouche
źródło
9

Jak wspomniano w powyższych repillach:

Począwszy od MySQL 8.0.4, zespół MySQL zmienił domyślną wtyczkę uwierzytelniającą dla serwera MySQL z mysql_native_password na caching_sha2_password.

Istnieją więc trzy sposoby rozwiązania tego problemu:

 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';
DC-
źródło
5

Masz problem z nową wersją MySQL, która została dostarczona z wtyczką „caching_sha2_password”. Wykonaj poniższe polecenie, aby go rozwiązać.

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

Lub możesz po prostu użyć poniższego polecenia, aby zachować swoje uprawnienia bez zmian:

ALTER USER your_user_name IDENTIFIED WITH mysql_native_password;

źródło
Witaj, co masz na myśli, mówiąc „twoja_nazwa_db. *” W trzecim wierszu, co oznacza to *
Sarath Mohan
Nazwa bazy danych, do której użytkownik powinien uzyskać dostęp. lub możesz po prostu użyć tylko ostatniej instrukcji ALTER, która również rozwiąże Twój problem. W ALTER wystarczy podać swoją nazwę użytkownika, to wszystko
PRZYZNAJ WSZYSTKIE PRZYWILEJE NA twoja_nazwa_db. * TO 'twoja_nazwa_uzytkownika' @ '%' zidentyfikowane przez 'twoje_haslo_ uzytkownika';
Sarath Mohan
OK, napotykasz problem podczas łączenia się z DB, prawda? Oznacza to, że określasz również nazwę bazy danych w ciągu połączenia, ta sama baza danych musi zostać dodana w miejsce twoja_nazwa_db. mam nadzieję, że wszystko jasne
4

Myślę, że lepiej zaktualizować swój pakiet lib "mysql-connector", aby baza danych była jeszcze bezpieczniejsza.

Używam mysql w wersji 8.0.12. Kiedy zaktualizowałem mysql-connector-java do wersji 8.0.11, problem zniknął.

Jack Ma
źródło
To świetna odpowiedź! Używałem 5.1.44z mysql 8. użyłem najnowszej wersji, która jest 8.0.19 i to działa!
Dean Christian Armada
4

Napotkałem ten problem na NetBeans podczas pracy z gotowym projektem z tej książki Murach JSP . Problem był spowodowany użyciem złącza J 5.1.23 z bazą danych MySQL 8.0.13. Musiałem wymienić stary sterownik na nowy. Po pobraniu Connector J wymagało to trzech kroków.

Jak wymienić złącze J projektu NetBeans:

  1. Pobierz aktualną wersję Connector J stąd . Następnie skopiuj go do swojego systemu operacyjnego.

  2. W NetBeans kliknij zakładkę Pliki, która znajduje się obok zakładki Projekty. Znajdź mysql-connector-java-5.1.23.jar lub jakiekolwiek inne posiadane stare złącze. Usuń to stare oprogramowanie sprzęgające. Wklej nowy łącznik.

  3. Kliknij zakładkę Projekty. Przejdź do folderu Biblioteki. Usuń stary łącznik mysql. Kliknij prawym przyciskiem myszy folder Biblioteki. Wybierz Dodaj słoik / folder. Przejdź do lokalizacji, w której umieścisz nowe złącze, i wybierz opcję Otwórz.

  4. Na karcie Projekt kliknij projekt prawym przyciskiem myszy. Wybierz Rozwiąż źródła danych w dolnej części menu podręcznego. Kliknij Dodaj połączenie. W tym momencie NetBeans przeskakuje do przodu i zakłada, że ​​chcesz użyć starego złącza. Kliknij przycisk Wstecz, aby wrócić do pominiętego okna. Usuń stare złącze i dodaj nowe złącze. Kliknij Dalej i Testuj połączenie, aby upewnić się, że działa.

Okazało się, że jest to przydatne do celów wideo . W przypadku IntelliJ IDEA okazało się to przydatne.

Jack J.
źródło
Zdaję sobie sprawę, że moja odpowiedź nie jest do końca trafna. Opublikowałem tutaj moją odpowiedź NetBeans, ponieważ moje własne pytanie jest oznaczone jako duplikat tego pytania.
Jack J,
4

Zrobiłem dokładnie ten sam problem, używając poniższej zależności:

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

Po prostu zmieniam na wersję 46 i wszystko działa.

José Junior
źródło
2

Jeśli możesz zaktualizować oprogramowanie sprzęgające do wersji, która obsługuje nową wtyczkę uwierzytelniania MySQL 8, zrób to. Jeśli z jakiegoś powodu nie jest to możliwe, zmień domyślną metodę uwierzytelniania użytkownika bazy danych na natywną.

DataVader
źródło
0

usuń plik connect .jar, jeśli dodano plik jar łącznika wielu wersji, dodaj tylko plik jar łącznika, który jest zgodny z wersją sql.

user10434384
źródło
0

Inną przyczyną może być fakt, że wskazujesz niewłaściwy port.

Upewnij się, że faktycznie wskazujesz właściwy serwer SQL. Możesz mieć domyślną instalację MySQL działającą na 3306, ale w rzeczywistości możesz potrzebować innej instancji MySQL.

Sprawdź porty i wyślij zapytanie do bazy danych.

Aquazi
źródło